This document shows the proportional matrix. For all 57 amino acids and secondary structures combinations, we further analysis the overlaping of each combination against the rest of 56, and we structured a \(57\times57\) matrix to representation the proportion.

Raw matrix

ProportionalMatrix <- data.frame()
for (i in 1:57) {
        aa = AA_SS_label[i,1]
        ss = AA_SS_label[i,2]
        cs <- pop.table %>% filter(Residue==aa & SS == ss)
        cacb <- data.frame(CA = subset(cs, Carbon == "CA")["Value"], 
                           CB = subset(cs, Carbon == "CB")["Value"])
        colnames(cacb) <- c("CA", "CB")
        sample500 = sample_n(na.omit(cacb), 500, replace = T)
        rowProbs = c()
        for (s in c("B", "C", "H")) {
                probilities <- apply(sample500, 1, function(CaCbCS.v){AaProb.f(ChiStr.f(CaCbCS.v, secondaryStructure = s, invCovMatList.l.D))} )
                rowProbs_ss <- apply(probilities, 1, mean)
                rowProbs_ss[3] <- rowProbs_ss[2]+rowProbs_ss[3]
                rowProbs_ss <- rowProbs_ss[-2]
                rowProbs = c(rowProbs, rowProbs_ss)
        }
                
        ProportionalMatrix <- rbind(ProportionalMatrix, rowProbs)
}

Normalize by row then by column

Verify results

[1] 0.6615166155492859

verify Results

[1] 0.6121114647280311
[1] 0.6121114647280311

Final matrix Bill

Save the proportional matrix

Moseley Matrix

[1] 0.5228722366992041
[1] 0.5228722366992041

Final matrix Moseley

Save the proportional matrix

Results

Normalize row and column:

     var.names                       vrange            
[1,] "glyCombNoPriorProMatrixBill"   "5.83673469387755"
[2,] "glyCombWithPriorProMatrixBill" "3.6734693877551" 
[3,] "glyRmNoPriorProMatrixBill"     "5.6734693877551" 
[4,] "glyRmWithPriorProMatrixBill"   "3.6734693877551" 

Normalize only the column

     var.names                          vrange            
[1,] "glyCombNoPriorProMatrixMoseley"   "4.40816326530612"
[2,] "glyCombWithPriorProMatrixMoseley" "1.30612244897959"
[3,] "glyRmNoPriorProMatrixMoseley"     "3.55102040816327"
[4,] "glyRmWithPriorProMatrixMoseley"   "1.30612244897959"
LS0tCnRpdGxlOiAiUHJvcG9ydGlvbmFsIG1hdHJpeCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBkb2N1bWVudCBzaG93cyB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeC4gRm9yIGFsbCA1NyBhbWlubyBhY2lkcyBhbmQgc2Vjb25kYXJ5IHN0cnVjdHVyZXMgY29tYmluYXRpb25zLCB3ZSBmdXJ0aGVyIGFuYWx5c2lzIHRoZSBvdmVybGFwaW5nIG9mIGVhY2ggY29tYmluYXRpb24gYWdhaW5zdCB0aGUgcmVzdCBvZiA1NiwgYW5kIHdlIHN0cnVjdHVyZWQgYSAkNTdcdGltZXM1NyQgbWF0cml4IHRvIHJlcHJlc2VudGF0aW9uIHRoZSBwcm9wb3J0aW9uLiAKCmBgYHtyIFJlZkRHX2Rpc3QsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRpciA8LSAiLi4vZGF0YS9HZW5lcmF0ZWQtTkEvIgojIGZpbGVzIDwtIGxpc3QuZmlsZXMoZGlyKQojICMgcHJpbnQoZmlsZXMpCiMgIyBmaWxlcyA8LSBmaWxlc1stZ3JlcCgiQ08iLCBmaWxlcyldCiMgZmlsZXMgPC0gZmlsZXNbLWdyZXAoIi1VLSIsIGZpbGVzKV0KCiNnZXR3ZCgpCgphYSA9IGMoICAgICAgICJBIiwgICAiUiIsICAgIk4iLCAgICJEIiwgICAiQyIsICAgIlEiLCAgICJFIiwgICAiSCIsICAgIkkiLCAgICJMIiwgICAiSyIsICAgIk0iLCAgICJGIiwgICAiUCIsICAgIlMiLCAgICJUIiwgICAiWSIsICAiVyIsICJWIikKc3MgPSBjKCJCIiwgIkMiLCAiSCIpCgpwb3AudGFibGUgPC0gZGF0YS5mcmFtZSgpCmZvcihhIGluIGFhKXsKICAgICAgICBIQ0EgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGlyLCBhLCAiLUgtQ0EudHh0IikpCiAgICAgICAgSENCIDwtIHJlYWQudGFibGUocGFzdGUwKGRpciwgYSwgIi1ILUNCLnR4dCIpKQogICAgICAgIEJDQSA8LSByZWFkLnRhYmxlKHBhc3RlMChkaXIsIGEsICItQi1DQS50eHQiKSkKICAgICAgICBCQ0IgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGlyLCBhLCAiLUItQ0IudHh0IikpCiAgICAgICAgQ0NBIDwtIHJlYWQudGFibGUocGFzdGUwKGRpciwgYSwgIi1DLUNBLnR4dCIpKQogICAgICAgIENDQiA8LSByZWFkLnRhYmxlKHBhc3RlMChkaXIsIGEsICItQy1DQi50eHQiKSkKICAgICAgICAKICAgICAgICBIQ0EgPC0gY2JpbmQoYSwgIkgiLCAiQ0EiLCBIQ0EpCiAgICAgICAgY29sbmFtZXMoSENBKSA8LSBjKCJSZXNpZHVlIiwgIlNTIiwgIkNhcmJvbiIsICJWYWx1ZSIpCiAgICAgICAgSENCIDwtIGNiaW5kKGEsICJIIiwgIkNCIiwgSENCKQogICAgICAgIGNvbG5hbWVzKEhDQikgPC0gYygiUmVzaWR1ZSIsICJTUyIsICJDYXJib24iLCAiVmFsdWUiKQogICAgICAgIEJDQSA8LSBjYmluZChhLCAiQiIsICJDQSIsIEJDQSkKICAgICAgICBjb2xuYW1lcyhCQ0EpIDwtIGMoIlJlc2lkdWUiLCAiU1MiLCAiQ2FyYm9uIiwgIlZhbHVlIikKICAgICAgICBCQ0IgPC0gY2JpbmQoYSwgIkIiLCAiQ0IiLCBCQ0IpCiAgICAgICAgY29sbmFtZXMoQkNCKSA8LSBjKCJSZXNpZHVlIiwgIlNTIiwgIkNhcmJvbiIsICJWYWx1ZSIpCiAgICAgICAgQ0NBIDwtIGNiaW5kKGEsICJDIiwgIkNBIiwgQ0NBKQogICAgICAgIGNvbG5hbWVzKENDQSkgPC0gYygiUmVzaWR1ZSIsICJTUyIsICJDYXJib24iLCAiVmFsdWUiKQogICAgICAgIENDQiA8LSBjYmluZChhLCAiQyIsICJDQiIsIENDQikKICAgICAgICBjb2xuYW1lcyhDQ0IpIDwtIGMoIlJlc2lkdWUiLCAiU1MiLCAiQ2FyYm9uIiwgIlZhbHVlIikKICAgICAgICAKICAgICAgICB0IDwtIHJiaW5kLmRhdGEuZnJhbWUoSENBLCBIQ0IsIEJDQSwgQkNCLCBDQ0EsIENDQiwgc3RyaW5nc0FzRmFjdG9ycyA9IEYpCiAgICAgICAgcG9wLnRhYmxlIDwtIHJiaW5kLmRhdGEuZnJhbWUocG9wLnRhYmxlLCB0KQp9CmBgYAoKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmVxdWlyZWRQYWNrYWdlcyA9IGMoImRhdGEudGFibGUiLCAic2VxaW5yIiwgInBseXIiLCAiZHBseXIiKQpmb3IocCBpbiByZXF1aXJlZFBhY2thZ2VzKXsKICAgICAgICBpZighcmVxdWlyZShwLGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIGluc3RhbGwucGFja2FnZXMocCkKICAgICAgICBsaWJyYXJ5KHAsY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQp9Cm9wdGlvbnMoZGlnaXRzPTE2KQoKCmRpciA8LSAiLi4vZGF0YS8iCgpBYUNvZGVzU2luZ2xlLnYgPSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJIIiwgIkkiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiViIsICJXIiwgIlkiKQpBYUNvZGVzU2luZ2xlMTkudiA9IGMoIkEiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJIIiwgIkkiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiViIsICJXIiwgIlkiKQpBYUNvZGVzM0xldHRlckFsbENhcC52ID0gYygiQUxBIiwgIkNZUyIsICJBU1AiLCAiR0xVIiwgIlBIRSIsICJISVMiLCAiSUxFIiwgIkxZUyIsICJMRVUiLCAiTUVUIiwgIkFTTiIsICJQUk8iLCAiR0xOIiwgIkFSRyIsICJTRVIiLCAiVEhSIiwgIlZBTCIsICJUUlAiLCJUWVIiKQpBYUNvZGVzM0xldHRlcjFzdENhcC52ID0gYygiQWxhIiwgIkN5cyIsICJBc3AiLCAiR2x1IiwgIlBoZSIsICJIaXMiLCAiSWxlIiwgIkx5cyIsICJMZXUiLCAiTWV0IiwgIkFzbiIsICJQcm8iLCAiR2xuIiwgIkFyZyIsICJTZXIiLCAiVGhyIiwgIlZhbCIsICJUcnAiLCJUeXIiKQojIFJlYWRpbmcgaW4gYWxsIHRoZSBzdGF0aXNpdGNzClJlZkRCLlN0YXRDQSA8LSByZWFkLmNzdihwYXN0ZShkaXIsICJSZWZEQi5jYVN0YXQuY3N2Iiwgc2VwPSIiKSkKCgoKIyBGaW5kIGFsbCB0aGUgbWVhbiBhbmQgc2Q6CiMgUmVhZGluZyBpbiBhbGwgdGhlIHN0YXRpc2l0Y3MKUmVmREIuU3RhdENBIDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgIlJlZkRCLmNhU3RhdC5jc3YiLCBzZXA9IiIpKQpSZWZEQi5TdGF0Q0IgPC0gcmVhZC5jc3YocGFzdGUoZGlyLCAiUmVmREIuY2JTdGF0LmNzdiIsIHNlcD0iIikpClJlZkRCLlN0YXRDQiA8LSBSZWZEQi5TdGF0Q0Jbd2hpY2goUmVmREIuU3RhdENCJFJlc2lkdWUhPSJHbHkiKSxdICMgUmVtb3ZlIHRoZSBnbHljaW5lCkNhcmJvbkNvdi50IDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgIkNhcmJvbkNvdlRhYmxlX0JDLmNzdiIsIHNlcD0iIikpCgoKIyBSZWFkaW5nIGluIHRoZSBwb3B1bGF0aW9uIHN0YXRpc3RpY3MKUG9wU3RhdHMgPC0gcmVhZC50YWJsZShwYXN0ZShkaXIsICJhYVBvcFN0YXQuY3N2Iiwgc2VwPSIiKSkKCiMgR2VuZXJhdGUgYXZlcmFnZSBjb3ZhcmlhbmNlCkF2Z0Nvdi50IDwtIHJlYWQuY3N2KHBhc3RlKGRpciwgImF2Z0Nvdl9CQy5jc3YiLCBzZXA9IiIpKSAjIHJvd05hbWUgaXMgZnJvbSB0aGUgQWFDb2Rlc1NpbmdsZS52CiMgR2VuZXJhdGUgY292YXJpYW5jZSBiYXNlZCBvbiBzZWNvbmRhcnkgc3RydWN0dXJlCkNhcmJvbkNvdi50IDwtIENhcmJvbkNvdi50Wy1ncmVwKCItQSIsIENhcmJvbkNvdi50JCJBQS5TUyIpLF0KCiMgRmluZCBhbGwgdGhlIG1lYW4gYW5kIHNkOgpDQVNkVGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQSRSZXNpZHVlLCBSZWZEQi5TdGF0Q0EkQ29pbC5zZCwgUmVmREIuU3RhdENBJEhlbGl4LnNkLCBSZWZEQi5TdGF0Q0EkQmV0YS5zZCwgUmVmREIuU3RhdENBJEF2Zy5zZCkKY29sbmFtZXMoQ0FTZFRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQlNkVGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQiRSZXNpZHVlLCBSZWZEQi5TdGF0Q0IkQ29pbC5zZCwgUmVmREIuU3RhdENCJEhlbGl4LnNkLCBSZWZEQi5TdGF0Q0IkQmV0YS5zZCwgUmVmREIuU3RhdENCJEF2Zy5zZCkKY29sbmFtZXMoQ0JTZFRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQU11VGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQSRSZXNpZHVlLCBSZWZEQi5TdGF0Q0EkQ29pbC5tdSwgUmVmREIuU3RhdENBJEhlbGl4Lm11LCBSZWZEQi5TdGF0Q0EkQmV0YS5tdSwgUmVmREIuU3RhdENBJEF2Zy5tdSkKY29sbmFtZXMoQ0FNdVRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpDQk11VGFibGUgPSBkYXRhLmZyYW1lKFJlZkRCLlN0YXRDQiRSZXNpZHVlLCBSZWZEQi5TdGF0Q0IkQ29pbC5tdSwgUmVmREIuU3RhdENCJEhlbGl4Lm11LCBSZWZEQi5TdGF0Q0IkQmV0YS5tdSwgUmVmREIuU3RhdENCJEF2Zy5tdSkKY29sbmFtZXMoQ0JNdVRhYmxlKSA9IGMoIlJlc2lkdWUiLCAiQyIsICJIIiwgIkIiLCAiQSIpCgpjb3ZNYXRyaXguRC5mIDwtIGZ1bmN0aW9uKCBuYW1lICl7CiAgICAgICAgCiAgICAgICAgQUEubmFtZSA8LSB1bmxpc3Qoc3Ryc3BsaXQobmFtZSwgIi0iKSlbMV0KICAgICAgICBTUy5uYW1lIDwtIHVubGlzdChzdHJzcGxpdChuYW1lLCAiLSIpKVsyXQogICAgICAgIAogICAgICAgIHNkLmNhIDwtIENBU2RUYWJsZVtDQVNkVGFibGUkUmVzaWR1ZT09QUEubmFtZSxdW1NTLm5hbWVdCiAgICAgICAgc2QuY2IgPC0gQ0JTZFRhYmxlW0NCU2RUYWJsZSRSZXNpZHVlPT1BQS5uYW1lLF1bU1MubmFtZV0KICAgICAgICBzZC5jYS5kb3VibGUgPC0gYXMuZG91YmxlKHNkLmNhKQogICAgICAgIHNkLmNiLmRvdWJsZSA8LSBhcy5kb3VibGUoc2QuY2IpCiAgICAgICAgCiAgICAgICAgdiA8LSBDYXJib25Db3YudFtDYXJib25Db3YudFssMV09PW5hbWUsXVssMl0KICAgICAgICBjb3ZNYXRyaXggPC0gbWF0cml4KGMoc2QuY2EuZG91YmxlXjIsIHYsIHYsIHNkLmNiLmRvdWJsZV4yKSwgMiAsIDIsIGJ5cm93ID0gVCkKICAgICAgICByZXR1cm4oY292TWF0cml4KQp9CgojdGVzdC5jb3YuQiA8LSBjb3ZNYXRyaXguQi5mKG5hbWUgPSAiQi1DIikKI3Rlc3QuY292LkIKCmludkNvdk1hdExpc3QubC5EID0gbGlzdCgpCmZvcihhYXNzIGluIENhcmJvbkNvdi50JEFBLlNTICl7CiAgICAgICAgQ292TWF0cml4ID0gY292TWF0cml4LkQuZihhYXNzKQogICAgICAgIGludkNvdk1hdHJpeCA9IHNvbHZlKENvdk1hdHJpeCkKICAgICAgICBpbnZDb3ZNYXRMaXN0LmwuRFtbYWFzc11dID0gaW52Q292TWF0cml4Cn0KIyBHbHljaW5lIFByb2JhYmlsaXR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpnbHlQcm9iLmYgPSBmdW5jdGlvbihwYXJhKXsKICAgICAgICBwcm9iID0gMipwbm9ybSgtYWJzKHBhcmEpKQogICAgICAgIHJldHVybihwcm9iKQp9CgpjYUJNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkIiXQpjYUNNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkMiXQpjYUhNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PSJHIiwgIkgiXQoKY2FCU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJCIl0KY2FDU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJDIl0KY2FIU2QgPC0gQ0FTZFRhYmxlW0NBU2RUYWJsZSRSZXNpZHVlPT0iRyIsICJIIl0KCiMgQWxsIHRoZSByZXN0IDE5IEFBcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQ2hpU3RyLmYgPC0gZnVuY3Rpb24oZGF0YUNhQ2Iudiwgc2Vjb25kYXJ5U3RydWN0dXJlLCBpbnZDb3ZNYXRMaXN0KSB7CiAgICAgICAgbmFtZXMgPC0gYygpCiAgICAgICAgY2hpU3RyLnYgPC0gYygpCiAgICAgICAgc3MgPC0gc2Vjb25kYXJ5U3RydWN0dXJlCiAgICAgICAgZGF0YUNhQ2IubSA8LSBhcy5tYXRyaXgoZGF0YUNhQ2IudikKICAgICAgICAKICAgICAgICBmb3IgKGFhIGluIEFhQ29kZXNTaW5nbGUudikgewogICAgICAgICAgICAgICAgbmFtZSA8LSBwYXN0ZShhYSwgc2Vjb25kYXJ5U3RydWN0dXJlLCBzZXAgPSAiLSIpCiAgICAgICAgICAgICAgICBuYW1lcyA8LSBjKG5hbWVzLCBuYW1lKQogICAgICAgICAgICAgICAgY2FNdSA8LSBDQU11VGFibGVbQ0FNdVRhYmxlJFJlc2lkdWU9PWFhLCBzc10KICAgICAgICAgICAgICAgIGNiTXUgPC0gQ0JNdVRhYmxlW0NCTXVUYWJsZSRSZXNpZHVlPT1hYSwgc3NdCiAgICAgICAgICAgICAgICBtZWFuLm0gPC0gYXMubWF0cml4KGMoY2FNdSwgY2JNdSkpCiAgICAgICAgICAgICAgICBpbnZDb3YgPC0gaW52Q292TWF0TGlzdFtbbmFtZV1dCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRhdGFDYUNiLm0gPC0gYXMubWF0cml4KGRhdGFDYUNiLnYpCiAgICAgICAgICAgICAgICBjaGlTdHIgPC0gdChkYXRhQ2FDYi5tIC0gbWVhbi5tKSAlKiUgaW52Q292ICUqJSAoZGF0YUNhQ2IubSAtIG1lYW4ubSkKICAgICAgICAgICAgICAgIGNoaVN0ci52IDwtIGMoY2hpU3RyLnYsIGNoaVN0cikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbmFtZXMoY2hpU3RyLnYpIDwtIG5hbWVzCiAgICAgICAgcmV0dXJuKGNoaVN0ci52KQp9CgpBYVByb2IuZiA9IGZ1bmN0aW9uKGNoaVN0cil7CiAgICAgICAgcHJvYiA9IGRjaGlzcShjaGlTdHIsIGRmPTIpCiAgICAgICAgcmV0dXJuKHByb2IpCn0KCgpgYGAKCgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQoIi4uL2RhdGEvUmVmREJfcHJpb3IuUkRhdGEiKQpBQV9TU19sYWJlbCA8LSBwcmlvcltbOTg3XV1bLDE6Ml0KQUFfU1NfbGFiZWwKYGBgCgojIyBSYXcgbWF0cml4CmBgYHtyLCBlY2hvPVQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpQcm9wb3J0aW9uYWxNYXRyaXggPC0gZGF0YS5mcmFtZSgpCgpmb3IgKGkgaW4gMTo1NykgewogICAgICAgIGFhID0gQUFfU1NfbGFiZWxbaSwxXQogICAgICAgIHNzID0gQUFfU1NfbGFiZWxbaSwyXQoKICAgICAgICBjcyA8LSBwb3AudGFibGUgJT4lIGZpbHRlcihSZXNpZHVlPT1hYSAmIFNTID09IHNzKQogICAgICAgIGNhY2IgPC0gZGF0YS5mcmFtZShDQSA9IHN1YnNldChjcywgQ2FyYm9uID09ICJDQSIpWyJWYWx1ZSJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0IgPSBzdWJzZXQoY3MsIENhcmJvbiA9PSAiQ0IiKVsiVmFsdWUiXSkKICAgICAgICBjb2xuYW1lcyhjYWNiKSA8LSBjKCJDQSIsICJDQiIpCiAgICAgICAgc2FtcGxlNTAwID0gc2FtcGxlX24obmEub21pdChjYWNiKSwgNTAwLCByZXBsYWNlID0gVCkKICAgICAgICByb3dQcm9icyA9IGMoKQogICAgICAgIGZvciAocyBpbiBjKCJCIiwgIkMiLCAiSCIpKSB7CiAgICAgICAgICAgICAgICBwcm9iaWxpdGllcyA8LSBhcHBseShzYW1wbGU1MDAsIDEsIGZ1bmN0aW9uKENhQ2JDUy52KXtBYVByb2IuZihDaGlTdHIuZihDYUNiQ1Mudiwgc2Vjb25kYXJ5U3RydWN0dXJlID0gcywgaW52Q292TWF0TGlzdC5sLkQpKX0gKQogICAgICAgICAgICAgICAgcm93UHJvYnNfc3MgPC0gYXBwbHkocHJvYmlsaXRpZXMsIDEsIG1lYW4pCiAgICAgICAgICAgICAgICByb3dQcm9ic19zc1szXSA8LSByb3dQcm9ic19zc1syXStyb3dQcm9ic19zc1szXQogICAgICAgICAgICAgICAgcm93UHJvYnNfc3MgPC0gcm93UHJvYnNfc3NbLTJdCiAgICAgICAgICAgICAgICByb3dQcm9icyA9IGMocm93UHJvYnMsIHJvd1Byb2JzX3NzKQogICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgIFByb3BvcnRpb25hbE1hdHJpeCA8LSByYmluZChQcm9wb3J0aW9uYWxNYXRyaXgsIHJvd1Byb2JzKQp9CmBgYAoKIyMgTm9ybWFsaXplIGJ5IHJvdyB0aGVuIGJ5IGNvbHVtbgoKICogTm9ybWFseXplIGJ5IHJvdwpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwgPC0gUHJvcG9ydGlvbmFsTWF0cml4ClByb3BvcnRpb25hbE1hdHJpeF9iaWxsIDwtIHN3ZWVwKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsLCAxLCByb3dTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsKSwgRlVOID0gIi8iKQpgYGAKICAgVmVyaWZ5IHJlc3VsdHMKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnByaW50KFByb3BvcnRpb25hbE1hdHJpeF9iaWxsWzEsMV0pCnByaW50KFByb3BvcnRpb25hbE1hdHJpeFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhbMSxdKSkKYGBgCgoqIE5vcm1hbGl6ZSBieSBjb2x1bW4KCiAgIHZlcmlmeSBSZXN1bHRzCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwcmludChQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbFssMV0pKQpwcmludChzY2FsZShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCwgY2VudGVyPUZBTFNFLCBzY2FsZT1jb2xTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsKSlbMSwxXSkKClByb3BvcnRpb25hbE1hdHJpeF9iaWxsIDwtIHNjYWxlKFByb3BvcnRpb25hbE1hdHJpeF9iaWxsLCBjZW50ZXI9RkFMU0UsIHNjYWxlPWNvbFN1bXMoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpKQpgYGAKCiMjIEZpbmFsIG1hdHJpeCBCaWxsCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb2xuYW1lcyhQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCkgPC0gTlVMTApQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCA8LSBhcy5tYXRyaXgoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpCmRhdGEuZnJhbWUoUHJvcG9ydGlvbmFsTWF0cml4X2JpbGwpCmBgYAoKIyMgU2F2ZSB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeApgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2F2ZShQcm9wb3J0aW9uYWxNYXRyaXhfYmlsbCwgZmlsZSA9ICJwNTdtYXRyaXhfYmlsbC5SRGF0YSIpCmBgYAoKIyMgTW9zZWxleSBNYXRyaXgKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9ClByb3BvcnRpb25hbE1hdHJpeF9Nb3NlbGV5IDwtIFByb3BvcnRpb25hbE1hdHJpeApQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSA8LSBzY2FsZShQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSwgY2VudGVyPUZBTFNFLCBzY2FsZT1jb2xTdW1zKFByb3BvcnRpb25hbE1hdHJpeF9Nb3NlbGV5KSkKCnByaW50KFByb3BvcnRpb25hbE1hdHJpeFsxLDFdL3N1bShQcm9wb3J0aW9uYWxNYXRyaXhbLDFdKSkKcHJpbnQoUHJvcG9ydGlvbmFsTWF0cml4X01vc2VsZXlbMSwxXSkKYGBgCgoKIyMgRmluYWwgbWF0cml4IE1vc2VsZXkKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGEuZnJhbWUoUHJvcG9ydGlvbmFsTWF0cml4X01vc2VsZXkpCmBgYAoKIyMgU2F2ZSB0aGUgcHJvcG9ydGlvbmFsIG1hdHJpeApgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2F2ZShQcm9wb3J0aW9uYWxNYXRyaXhfTW9zZWxleSwgZmlsZSA9ICJwNTdtYXRyaXhfTW9zZWxleS5SRGF0YSIpCmBgYAoKIyBSZXN1bHRzCgojIyBOb3JtYWxpemUgcm93IGFuZCBjb2x1bW46CmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsb2FkKCJBcHJpbF8xNF9wTWF0cml4X2dseUNvbWJfbm9Qcmlvcl9CaWxsLlJEYXRhIikKZ2x5Q29tYk5vUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Q29tYl93aXRoUHJpb3JfQmlsbC5SRGF0YSIpCmdseUNvbWJXaXRoUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Uk1fbm9Qcmlvcl9CaWxsLlJEYXRhIikKZ2x5Um1Ob1ByaW9yUHJvTWF0cml4QmlsbCA8LSByZXN1bHRzMQpsb2FkKCJBcHJpbF8xNF9wTWF0cml4X2dseVJNX3dpdGhQcmlvcl9CaWxsLlJEYXRhIikKZ2x5Um1XaXRoUHJpb3JQcm9NYXRyaXhCaWxsIDwtIHJlc3VsdHMxCgp2YXIubmFtZXMgPC0gYygiZ2x5Q29tYk5vUHJpb3JQcm9NYXRyaXhCaWxsIiwgImdseUNvbWJXaXRoUHJpb3JQcm9NYXRyaXhCaWxsIiwgImdseVJtTm9QcmlvclByb01hdHJpeEJpbGwiLCAiZ2x5Um1XaXRoUHJpb3JQcm9NYXRyaXhCaWxsIikKI2xvYWQoIn4vRG9jdW1lbnRzL0dpdEh1Yi9NL2luZGV4OTAuUkRhdGEiKQp2cmFuZ2UgPC0gYygpCmZvcihpIGluIHZhci5uYW1lcyl7CiAgICAgICByIDwtIGV2YWwocGFyc2UodGV4dCA9IGkpKQogICAgICAgdmFscyA8LSB1bmxpc3QobGFwcGx5KHIsIGZ1bmN0aW9uKHgpewogICAgICAgICAgICAgICBpZihpcy5udWxsKHhbWzRdXSkpewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybihOQSkKICAgICAgICAgICAgICAgfWVsc2V7cmV0dXJuKHhbWzRdXSl9CiAgICAgICB9KSkKICAgICAgIHZhbHMgPC0gbmEub21pdCh2YWxzKQogICAgICAgdmFscyA8LSBzb3J0KHZhbHMpCiAgICAgICB2bWluIDwtIHZhbHNbMzRdCiAgICAgICB2bWF4IDwtIHZhbHNbNjcyLTM0XQogICAgICAgdnJhbmdlIDwtIGModnJhbmdlLChhYnModm1heCkrYWJzKHZtaW4pKSkKICAgICAgIHBsb3QodmFscywgcGNoID0gMjApCiAgICAgICBhYmxpbmUoaD0wLjMsIGNvbD0icHVycGxlIikKICAgICAgIGFibGluZShoPS0wLjMsIGNvbD0icHVycGxlIikKICAgICAgIGFibGluZShoPTAsIGNvbD0icmVkIikKICAgICAgIAp9CnZhbCA8LSBjYmluZCh2YXIubmFtZXMsIHZyYW5nZSkKcHJpbnQodmFsKQpgYGAKCiMjIE5vcm1hbGl6ZSBvbmx5IHRoZSBjb2x1bW4KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Q29tYl9ub1ByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlDb21iTm9QcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKbG9hZCgiQXByaWxfMTRfcE1hdHJpeF9nbHlDb21iX3dpdGhQcmlvcl9Nb3NlbGV5LlJEYXRhIikKZ2x5Q29tYldpdGhQcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKbG9hZCgiQXByaWxfMTRfcE1hdHJpeF9nbHlSTV9ub1ByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlSbU5vUHJpb3JQcm9NYXRyaXhNb3NlbGV5IDwtIHJlc3VsdHMxCmxvYWQoIkFwcmlsXzE0X3BNYXRyaXhfZ2x5Uk1fd2l0aFByaW9yX01vc2VsZXkuUkRhdGEiKQpnbHlSbVdpdGhQcmlvclByb01hdHJpeE1vc2VsZXkgPC0gcmVzdWx0czEKCnZhci5uYW1lcyA8LSBjKCJnbHlDb21iTm9QcmlvclByb01hdHJpeE1vc2VsZXkiLCAiZ2x5Q29tYldpdGhQcmlvclByb01hdHJpeE1vc2VsZXkiLCAiZ2x5Um1Ob1ByaW9yUHJvTWF0cml4TW9zZWxleSIsICJnbHlSbVdpdGhQcmlvclByb01hdHJpeE1vc2VsZXkiKQojbG9hZCgifi9Eb2N1bWVudHMvR2l0SHViL00vaW5kZXg5MC5SRGF0YSIpCnZyYW5nZSA8LSBjKCkKZm9yKGkgaW4gdmFyLm5hbWVzKXsKICAgICAgIHIgPC0gZXZhbChwYXJzZSh0ZXh0ID0gaSkpCiAgICAgICB2YWxzIDwtIHVubGlzdChsYXBwbHkociwgZnVuY3Rpb24oeCl7CiAgICAgICAgICAgICAgIGlmKGlzLm51bGwoeFtbNF1dKSl7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKE5BKQogICAgICAgICAgICAgICB9ZWxzZXtyZXR1cm4oeFtbNF1dKX0KICAgICAgIH0pKQogICAgICAgdmFscyA8LSBuYS5vbWl0KHZhbHMpCiAgICAgICB2YWxzIDwtIHNvcnQodmFscykKICAgICAgIHZtaW4gPC0gdmFsc1szNF0KICAgICAgIHZtYXggPC0gdmFsc1s2NzItMzRdCiAgICAgICB2cmFuZ2UgPC0gYyh2cmFuZ2UsKGFicyh2bWF4KSthYnModm1pbikpKQogICAgICAgcGxvdCh2YWxzLCBwY2ggPSAyMCkKICAgICAgIGFibGluZShoPTAuMywgY29sPSJwdXJwbGUiKQogICAgICAgYWJsaW5lKGg9LTAuMywgY29sPSJwdXJwbGUiKQogICAgICAgYWJsaW5lKGg9MCwgY29sPSJyZWQiKQogICAgICAgCn0KdmFsIDwtIGNiaW5kKHZhci5uYW1lcywgdnJhbmdlKQpwcmludCh2YWwpCmBgYAo=