The purpose of this study is describing the distribution of ties in irrational numbers when considering sequences of embedding dimension \(D\) (and \(\tau=1\)). The finding will help building a model for simulating such occurrences and, then, assessing imputation techniques in a Monte Carlo study. Thus, in this report we will make an exploratory analysis of the data, analyzing the percentage of tied sequences for each embedding dimension value.

Load packages and sources

if(!require(ggpubr)){
  install.packages("ggpubr")
  require(ggpubr)
}
if(!require(ggplot2)){
  install.packages("ggplot2")
  require(ggplot2)
}
if(!require(ggthemes)){
  install.packages("ggthemes")
  require(ggthemes)
}
source('Bandt-Pompe.R')

Reading the numbers

We have produced to files with Mathematica: e.txt, pi.txt, and sqrt2.txt. They contain expansions of these irrational numbers with \(100,000\) digits.

e.data = as.character(read.table('../Data/e.txt', stringsAsFactors=FALSE, fileEncoding="latin1"))
pi.data = as.character(unlist(read.table('../Data/pi.txt', stringsAsFactors=FALSE, fileEncoding="latin1")))
sqrt2.data = as.character(unlist(read.table('../Data/sqrt2.txt', stringsAsFactors=FALSE, fileEncoding="latin1")))

e.vector = as.numeric(unlist(strsplit(e.data, ""))[3:100011])
pi.vector = as.numeric(unlist(strsplit(pi.data, ""))[3:100011])
sqrt2.vector = as.numeric(unlist(strsplit(sqrt2.data, ""))[3:100030])

Computing the number of tied sequences for each value of \(D\in\{3,4,5,6\}\)

D = 3
Tau = 1

e.elements.D3 = formationPattern(e.vector, D, Tau, 1)
e.percent.D3 = percentual.equalities(e.elements.D3)

pi.elements.D3 = formationPattern(pi.vector, D, Tau, 1)
pi.percent.D3 = percentual.equalities(pi.elements.D3)

sqrt2.elements.D3 = formationPattern(sqrt2.vector, D, Tau, 1)
sqrt2.percent.D3 = percentual.equalities(sqrt2.elements.D3)

cat("Number of tied sequences \ne: ", round(e.percent.D3*100, 3), "%\npi: ", round(pi.percent.D3*100, 3), "%\nsqrt2: ", round(sqrt2.percent.D3*100, 3), "%\n")
Number of tied sequences 
e:  28.115 %
pi:  27.913 %
sqrt2:  27.845 %
D = 4
e.elements.D4 = formationPattern(e.vector, D, Tau, 1)
e.percent.D4 = percentual.equalities(e.elements.D4)

pi.elements.D4 = formationPattern(pi.vector, D, Tau, 1)
pi.percent.D4 = percentual.equalities(pi.elements.D4)

sqrt2.elements.D4 = formationPattern(sqrt2.vector, D, Tau, 1)
sqrt2.percent.D4 = percentual.equalities(sqrt2.elements.D4)

cat("Number of tied sequences \ne: ", round(e.percent.D4*100, 3), "%\npi: ", round(pi.percent.D4*100, 3), "%\nsqrt2: ", round(sqrt2.percent.D4*100, 3), "%\n")
Number of tied sequences 
e:  49.622 %
pi:  49.538 %
sqrt2:  49.487 %
D = 5
e.elements.D5 = formationPattern(e.vector, D, Tau, 1)
e.percent.D5 = percentual.equalities(e.elements.D5)

pi.elements.D5 = formationPattern(pi.vector, D, Tau, 1)
pi.percent.D5 = percentual.equalities(pi.elements.D5)

sqrt2.elements.D5 = formationPattern(sqrt2.vector, D, Tau, 1)
sqrt2.percent.D5 = percentual.equalities(sqrt2.elements.D5)

cat("Number of tied sequences \ne: ", round(e.percent.D5*100, 3), "%\npi: ", round(pi.percent.D5*100, 3), "%\nsqrt2: ", round(sqrt2.percent.D5*100, 3), "%\n")
Number of tied sequences 
e:  69.866 %
pi:  69.92 %
sqrt2:  69.757 %
D = 6
e.elements.D6 = formationPattern(e.vector, D, Tau, 1)
e.percent.D6 = percentual.equalities(e.elements.D6)

pi.elements.D6 = formationPattern(pi.vector, D, Tau, 1)
pi.percent.D6 = percentual.equalities(pi.elements.D6)

sqrt2.elements.D6 = formationPattern(sqrt2.vector, D, Tau, 1)
sqrt2.percent.D6 = percentual.equalities(sqrt2.elements.D6)

cat("Number of tied sequences \ne: ", round(e.percent.D6*100, 3), "%\npi: ", round(pi.percent.D6*100, 3), "%\nsqrt2: ", round(sqrt2.percent.D6*100, 3), "%\n")
Number of tied sequences 
e:  85.122 %
pi:  85.145 %
sqrt2:  84.956 %

Analyzing the binary vectors with the position of the tied sequences

e.binary.D3 = binary.equalities(e.elements.D3)
e.binary.D4 = binary.equalities(e.elements.D4)
e.binary.D5 = binary.equalities(e.elements.D5)
e.binary.D6 = binary.equalities(e.elements.D6)

n.elements = 100

e.binary.df = data.frame('series' = c(e.binary.D3[1:n.elements], e.binary.D4[1:n.elements], e.binary.D5[1:n.elements], e.binary.D6[1:n.elements]),
                         'elements' = rep(c(1:n.elements), 4),
                         'D' = as.factor(c(rep(3, n.elements), rep(4, n.elements), rep(5, n.elements), rep(6, n.elements))))

ggplot(e.binary.df, mapping = aes(x = elements, y = series, group = D, color = D)) + 
    xlab("") + ylab("") +
    ggtitle("e number") +
    geom_line(position = position_dodge(0.8)) +
    theme_few(base_size = 13, base_family = "serif") + 
    facet_grid(facets = D~.) +
    scale_y_continuous(breaks=c(0, 1)) +
    theme(plot.title = element_text(hjust=0.5), legend.position = "none")

pi.binary.D3 = binary.equalities(pi.elements.D3)
pi.binary.D4 = binary.equalities(pi.elements.D4)
pi.binary.D5 = binary.equalities(pi.elements.D5)
pi.binary.D6 = binary.equalities(pi.elements.D6)

n.elements = 100

pi.binary.df = data.frame('series' = c(pi.binary.D3[1:n.elements], pi.binary.D4[1:n.elements], pi.binary.D5[1:n.elements], pi.binary.D6[1:n.elements]),
                         'elements' = rep(c(1:n.elements), 4),
                         'D' = as.factor(c(rep(3, n.elements), rep(4, n.elements), rep(5, n.elements), rep(6, n.elements))))

ggplot(pi.binary.df, mapping = aes(x = elements, y = series, group = D, color = D)) + 
    xlab("") + ylab("") +
    ggtitle("pi number") +
    geom_line(position = position_dodge(0.8)) +
    theme_few(base_size = 13, base_family = "serif") + 
    facet_grid(facets = D~.) +
    scale_y_continuous(breaks=c(0, 1)) +
    theme(plot.title = element_text(hjust=0.5), legend.position = "none")

sqrt2.binary.D3 = binary.equalities(sqrt2.elements.D3)
sqrt2.binary.D4 = binary.equalities(sqrt2.elements.D4)
sqrt2.binary.D5 = binary.equalities(sqrt2.elements.D5)
sqrt2.binary.D6 = binary.equalities(sqrt2.elements.D6)

n.elements = 100

sqrt2.binary.df = data.frame('series' = c(sqrt2.binary.D3[1:n.elements], sqrt2.binary.D4[1:n.elements], sqrt2.binary.D5[1:n.elements], sqrt2.binary.D6[1:n.elements]),
                         'elements' = rep(c(1:n.elements), 4),
                         'D' = as.factor(c(rep(3, n.elements), rep(4, n.elements), rep(5, n.elements), rep(6, n.elements))))

ggplot(sqrt2.binary.df, mapping = aes(x = elements, y = series, group = D, color = D)) + 
    xlab("") + ylab("") +
    ggtitle("sqrt2 number") +
    geom_line(position = position_dodge(0.8)) +
    theme_few(base_size = 13, base_family = "serif") + 
    facet_grid(facets = D~.) +
    scale_y_continuous(breaks=c(0, 1)) +
    theme(plot.title = element_text(hjust=0.5), legend.position = "none")

As we can see in the graphs above, the larger the dimension used, the greater the presence of patterns with repeated elements. When we have \(D = 3\), we see that there is a greater tendency for the existence of sequential patterns with the \(label = 0\) (that is, without repeated elements). However, as the dimension increases, this behavior is reversed. This fact occurs because we are analyzing numbers within the small range \([0, 9]\), so the larger the symbol considered, the greater the probability of the existence of equal elements to be grouped.

LS0tCnRpdGxlOiAiU3R1ZHkgb2YgdGhlIEVtcGlyaWNhbCBEaXN0cmlidXRpb24gb2YgVGllcyBpbiBJcnJhdGlvbmFsIE51bWJlcnMiCmF1dGhvcjogIkVkdWFyZGEgQ2hhZ2FzIgpkYXRlOiAiTm92IDEwLCAyMDIwIgoKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHVkeSBpcyBkZXNjcmliaW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGllcyBpbiBpcnJhdGlvbmFsIG51bWJlcnMgd2hlbiBjb25zaWRlcmluZyBzZXF1ZW5jZXMgb2YgZW1iZWRkaW5nIGRpbWVuc2lvbiAkRCQgKGFuZCAkXHRhdT0xJCkuClRoZSBmaW5kaW5nIHdpbGwgaGVscCBidWlsZGluZyBhIG1vZGVsIGZvciBzaW11bGF0aW5nIHN1Y2ggb2NjdXJyZW5jZXMgYW5kLCB0aGVuLCBhc3Nlc3NpbmcgaW1wdXRhdGlvbiB0ZWNobmlxdWVzIGluIGEgTW9udGUgQ2FybG8gc3R1ZHkuClRodXMsIGluIHRoaXMgcmVwb3J0IHdlIHdpbGwgbWFrZSBhbiBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSwgYW5hbHl6aW5nIHRoZSBwZXJjZW50YWdlIG9mIHRpZWQgc2VxdWVuY2VzIGZvciBlYWNoIGVtYmVkZGluZyBkaW1lbnNpb24gdmFsdWUuCgojIyMgTG9hZCBwYWNrYWdlcyBhbmQgc291cmNlcwoKYGBge3J9IAppZighcmVxdWlyZShnZ3B1YnIpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3B1YnIiKQogIHJlcXVpcmUoZ2dwdWJyKQp9CmlmKCFyZXF1aXJlKGdncGxvdDIpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKICByZXF1aXJlKGdncGxvdDIpCn0KaWYoIXJlcXVpcmUoZ2d0aGVtZXMpKXsKICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3RoZW1lcyIpCiAgcmVxdWlyZShnZ3RoZW1lcykKfQpzb3VyY2UoJ0JhbmR0LVBvbXBlLlInKQpgYGAKCiMjIyBSZWFkaW5nIHRoZSBudW1iZXJzCgpXZSBoYXZlIHByb2R1Y2VkIHRvIGZpbGVzIHdpdGggTWF0aGVtYXRpY2E6IGUudHh0LCBwaS50eHQsIGFuZCBzcXJ0Mi50eHQuIFRoZXkgY29udGFpbiBleHBhbnNpb25zIG9mIHRoZXNlIGlycmF0aW9uYWwgbnVtYmVycyB3aXRoICQxMDAsMDAwJCBkaWdpdHMuCgpgYGB7cn0gCmUuZGF0YSA9IGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCcuLi9EYXRhL2UudHh0Jywgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwgZmlsZUVuY29kaW5nPSJsYXRpbjEiKSkKcGkuZGF0YSA9IGFzLmNoYXJhY3Rlcih1bmxpc3QocmVhZC50YWJsZSgnLi4vRGF0YS9waS50eHQnLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLCBmaWxlRW5jb2Rpbmc9ImxhdGluMSIpKSkKc3FydDIuZGF0YSA9IGFzLmNoYXJhY3Rlcih1bmxpc3QocmVhZC50YWJsZSgnLi4vRGF0YS9zcXJ0Mi50eHQnLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLCBmaWxlRW5jb2Rpbmc9ImxhdGluMSIpKSkKCmUudmVjdG9yID0gYXMubnVtZXJpYyh1bmxpc3Qoc3Ryc3BsaXQoZS5kYXRhLCAiIikpWzM6MTAwMDExXSkKcGkudmVjdG9yID0gYXMubnVtZXJpYyh1bmxpc3Qoc3Ryc3BsaXQocGkuZGF0YSwgIiIpKVszOjEwMDAxMV0pCnNxcnQyLnZlY3RvciA9IGFzLm51bWVyaWModW5saXN0KHN0cnNwbGl0KHNxcnQyLmRhdGEsICIiKSlbMzoxMDAwMzBdKQpgYGAKCiMjIyBDb21wdXRpbmcgdGhlIG51bWJlciBvZiB0aWVkIHNlcXVlbmNlcyBmb3IgZWFjaCB2YWx1ZSBvZiAkRFxpblx7Myw0LDUsNlx9JAoKCmBgYHtyfSAKRCA9IDMKVGF1ID0gMQoKZS5lbGVtZW50cy5EMyA9IGZvcm1hdGlvblBhdHRlcm4oZS52ZWN0b3IsIEQsIFRhdSwgMSkKZS5wZXJjZW50LkQzID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDMpCgpwaS5lbGVtZW50cy5EMyA9IGZvcm1hdGlvblBhdHRlcm4ocGkudmVjdG9yLCBELCBUYXUsIDEpCnBpLnBlcmNlbnQuRDMgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMocGkuZWxlbWVudHMuRDMpCgpzcXJ0Mi5lbGVtZW50cy5EMyA9IGZvcm1hdGlvblBhdHRlcm4oc3FydDIudmVjdG9yLCBELCBUYXUsIDEpCnNxcnQyLnBlcmNlbnQuRDMgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDMpCgpjYXQoIk51bWJlciBvZiB0aWVkIHNlcXVlbmNlcyBcbmU6ICIsIHJvdW5kKGUucGVyY2VudC5EMyoxMDAsIDMpLCAiJVxucGk6ICIsIHJvdW5kKHBpLnBlcmNlbnQuRDMqMTAwLCAzKSwgIiVcbnNxcnQyOiAiLCByb3VuZChzcXJ0Mi5wZXJjZW50LkQzKjEwMCwgMyksICIlXG4iKQpgYGAKCmBgYHtyfSAKRCA9IDQKZS5lbGVtZW50cy5ENCA9IGZvcm1hdGlvblBhdHRlcm4oZS52ZWN0b3IsIEQsIFRhdSwgMSkKZS5wZXJjZW50LkQ0ID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDQpCgpwaS5lbGVtZW50cy5ENCA9IGZvcm1hdGlvblBhdHRlcm4ocGkudmVjdG9yLCBELCBUYXUsIDEpCnBpLnBlcmNlbnQuRDQgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMocGkuZWxlbWVudHMuRDQpCgpzcXJ0Mi5lbGVtZW50cy5ENCA9IGZvcm1hdGlvblBhdHRlcm4oc3FydDIudmVjdG9yLCBELCBUYXUsIDEpCnNxcnQyLnBlcmNlbnQuRDQgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDQpCgpjYXQoIk51bWJlciBvZiB0aWVkIHNlcXVlbmNlcyBcbmU6ICIsIHJvdW5kKGUucGVyY2VudC5ENCoxMDAsIDMpLCAiJVxucGk6ICIsIHJvdW5kKHBpLnBlcmNlbnQuRDQqMTAwLCAzKSwgIiVcbnNxcnQyOiAiLCByb3VuZChzcXJ0Mi5wZXJjZW50LkQ0KjEwMCwgMyksICIlXG4iKQpgYGAKCmBgYHtyfSAKRCA9IDUKZS5lbGVtZW50cy5ENSA9IGZvcm1hdGlvblBhdHRlcm4oZS52ZWN0b3IsIEQsIFRhdSwgMSkKZS5wZXJjZW50LkQ1ID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDUpCgpwaS5lbGVtZW50cy5ENSA9IGZvcm1hdGlvblBhdHRlcm4ocGkudmVjdG9yLCBELCBUYXUsIDEpCnBpLnBlcmNlbnQuRDUgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMocGkuZWxlbWVudHMuRDUpCgpzcXJ0Mi5lbGVtZW50cy5ENSA9IGZvcm1hdGlvblBhdHRlcm4oc3FydDIudmVjdG9yLCBELCBUYXUsIDEpCnNxcnQyLnBlcmNlbnQuRDUgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDUpCgpjYXQoIk51bWJlciBvZiB0aWVkIHNlcXVlbmNlcyBcbmU6ICIsIHJvdW5kKGUucGVyY2VudC5ENSoxMDAsIDMpLCAiJVxucGk6ICIsIHJvdW5kKHBpLnBlcmNlbnQuRDUqMTAwLCAzKSwgIiVcbnNxcnQyOiAiLCByb3VuZChzcXJ0Mi5wZXJjZW50LkQ1KjEwMCwgMyksICIlXG4iKQpgYGAKCmBgYHtyfSAKRCA9IDYKZS5lbGVtZW50cy5ENiA9IGZvcm1hdGlvblBhdHRlcm4oZS52ZWN0b3IsIEQsIFRhdSwgMSkKZS5wZXJjZW50LkQ2ID0gcGVyY2VudHVhbC5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDYpCgpwaS5lbGVtZW50cy5ENiA9IGZvcm1hdGlvblBhdHRlcm4ocGkudmVjdG9yLCBELCBUYXUsIDEpCnBpLnBlcmNlbnQuRDYgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMocGkuZWxlbWVudHMuRDYpCgpzcXJ0Mi5lbGVtZW50cy5ENiA9IGZvcm1hdGlvblBhdHRlcm4oc3FydDIudmVjdG9yLCBELCBUYXUsIDEpCnNxcnQyLnBlcmNlbnQuRDYgPSBwZXJjZW50dWFsLmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDYpCgpjYXQoIk51bWJlciBvZiB0aWVkIHNlcXVlbmNlcyBcbmU6ICIsIHJvdW5kKGUucGVyY2VudC5ENioxMDAsIDMpLCAiJVxucGk6ICIsIHJvdW5kKHBpLnBlcmNlbnQuRDYqMTAwLCAzKSwgIiVcbnNxcnQyOiAiLCByb3VuZChzcXJ0Mi5wZXJjZW50LkQ2KjEwMCwgMyksICIlXG4iKQpgYGAKCiMjIyBBbmFseXppbmcgdGhlIGJpbmFyeSB2ZWN0b3JzIHdpdGggdGhlIHBvc2l0aW9uIG9mIHRoZSB0aWVkIHNlcXVlbmNlcwoKYGBge3J9IAplLmJpbmFyeS5EMyA9IGJpbmFyeS5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDMpCmUuYmluYXJ5LkQ0ID0gYmluYXJ5LmVxdWFsaXRpZXMoZS5lbGVtZW50cy5ENCkKZS5iaW5hcnkuRDUgPSBiaW5hcnkuZXF1YWxpdGllcyhlLmVsZW1lbnRzLkQ1KQplLmJpbmFyeS5ENiA9IGJpbmFyeS5lcXVhbGl0aWVzKGUuZWxlbWVudHMuRDYpCgpuLmVsZW1lbnRzID0gMTAwCgplLmJpbmFyeS5kZiA9IGRhdGEuZnJhbWUoJ3NlcmllcycgPSBjKGUuYmluYXJ5LkQzWzE6bi5lbGVtZW50c10sIGUuYmluYXJ5LkQ0WzE6bi5lbGVtZW50c10sIGUuYmluYXJ5LkQ1WzE6bi5lbGVtZW50c10sIGUuYmluYXJ5LkQ2WzE6bi5lbGVtZW50c10pLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzJyA9IHJlcChjKDE6bi5lbGVtZW50cyksIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ0QnID0gYXMuZmFjdG9yKGMocmVwKDMsIG4uZWxlbWVudHMpLCByZXAoNCwgbi5lbGVtZW50cyksIHJlcCg1LCBuLmVsZW1lbnRzKSwgcmVwKDYsIG4uZWxlbWVudHMpKSkpCgpnZ3Bsb3QoZS5iaW5hcnkuZGYsIG1hcHBpbmcgPSBhZXMoeCA9IGVsZW1lbnRzLCB5ID0gc2VyaWVzLCBncm91cCA9IEQsIGNvbG9yID0gRCkpICsgCiAgICB4bGFiKCIiKSArIHlsYWIoIiIpICsKICAgIGdndGl0bGUoImUgbnVtYmVyIikgKwogICAgZ2VvbV9saW5lKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC44KSkgKwogICAgdGhlbWVfZmV3KGJhc2Vfc2l6ZSA9IDEzLCBiYXNlX2ZhbWlseSA9ICJzZXJpZiIpICsgCiAgICBmYWNldF9ncmlkKGZhY2V0cyA9IER+LikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsIDEpKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0gCnBpLmJpbmFyeS5EMyA9IGJpbmFyeS5lcXVhbGl0aWVzKHBpLmVsZW1lbnRzLkQzKQpwaS5iaW5hcnkuRDQgPSBiaW5hcnkuZXF1YWxpdGllcyhwaS5lbGVtZW50cy5ENCkKcGkuYmluYXJ5LkQ1ID0gYmluYXJ5LmVxdWFsaXRpZXMocGkuZWxlbWVudHMuRDUpCnBpLmJpbmFyeS5ENiA9IGJpbmFyeS5lcXVhbGl0aWVzKHBpLmVsZW1lbnRzLkQ2KQoKbi5lbGVtZW50cyA9IDEwMAoKcGkuYmluYXJ5LmRmID0gZGF0YS5mcmFtZSgnc2VyaWVzJyA9IGMocGkuYmluYXJ5LkQzWzE6bi5lbGVtZW50c10sIHBpLmJpbmFyeS5ENFsxOm4uZWxlbWVudHNdLCBwaS5iaW5hcnkuRDVbMTpuLmVsZW1lbnRzXSwgcGkuYmluYXJ5LkQ2WzE6bi5lbGVtZW50c10pLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzJyA9IHJlcChjKDE6bi5lbGVtZW50cyksIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ0QnID0gYXMuZmFjdG9yKGMocmVwKDMsIG4uZWxlbWVudHMpLCByZXAoNCwgbi5lbGVtZW50cyksIHJlcCg1LCBuLmVsZW1lbnRzKSwgcmVwKDYsIG4uZWxlbWVudHMpKSkpCgpnZ3Bsb3QocGkuYmluYXJ5LmRmLCBtYXBwaW5nID0gYWVzKHggPSBlbGVtZW50cywgeSA9IHNlcmllcywgZ3JvdXAgPSBELCBjb2xvciA9IEQpKSArIAogICAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgICBnZ3RpdGxlKCJwaSBudW1iZXIiKSArCiAgICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpKSArCiAgICB0aGVtZV9mZXcoYmFzZV9zaXplID0gMTMsIGJhc2VfZmFtaWx5ID0gInNlcmlmIikgKyAKICAgIGZhY2V0X2dyaWQoZmFjZXRzID0gRH4uKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCwgMSkpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyfSAKc3FydDIuYmluYXJ5LkQzID0gYmluYXJ5LmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDMpCnNxcnQyLmJpbmFyeS5ENCA9IGJpbmFyeS5lcXVhbGl0aWVzKHNxcnQyLmVsZW1lbnRzLkQ0KQpzcXJ0Mi5iaW5hcnkuRDUgPSBiaW5hcnkuZXF1YWxpdGllcyhzcXJ0Mi5lbGVtZW50cy5ENSkKc3FydDIuYmluYXJ5LkQ2ID0gYmluYXJ5LmVxdWFsaXRpZXMoc3FydDIuZWxlbWVudHMuRDYpCgpuLmVsZW1lbnRzID0gMTAwCgpzcXJ0Mi5iaW5hcnkuZGYgPSBkYXRhLmZyYW1lKCdzZXJpZXMnID0gYyhzcXJ0Mi5iaW5hcnkuRDNbMTpuLmVsZW1lbnRzXSwgc3FydDIuYmluYXJ5LkQ0WzE6bi5lbGVtZW50c10sIHNxcnQyLmJpbmFyeS5ENVsxOm4uZWxlbWVudHNdLCBzcXJ0Mi5iaW5hcnkuRDZbMTpuLmVsZW1lbnRzXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudHMnID0gcmVwKGMoMTpuLmVsZW1lbnRzKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAnRCcgPSBhcy5mYWN0b3IoYyhyZXAoMywgbi5lbGVtZW50cyksIHJlcCg0LCBuLmVsZW1lbnRzKSwgcmVwKDUsIG4uZWxlbWVudHMpLCByZXAoNiwgbi5lbGVtZW50cykpKSkKCmdncGxvdChzcXJ0Mi5iaW5hcnkuZGYsIG1hcHBpbmcgPSBhZXMoeCA9IGVsZW1lbnRzLCB5ID0gc2VyaWVzLCBncm91cCA9IEQsIGNvbG9yID0gRCkpICsgCiAgICB4bGFiKCIiKSArIHlsYWIoIiIpICsKICAgIGdndGl0bGUoInNxcnQyIG51bWJlciIpICsKICAgIGdlb21fbGluZShwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOCkpICsKICAgIHRoZW1lX2ZldyhiYXNlX3NpemUgPSAxMywgYmFzZV9mYW1pbHkgPSAic2VyaWYiKSArIAogICAgZmFjZXRfZ3JpZChmYWNldHMgPSBEfi4pICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLCAxKSkgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKCgpBcyB3ZSBjYW4gc2VlIGluIHRoZSBncmFwaHMgYWJvdmUsIHRoZSBsYXJnZXIgdGhlIGRpbWVuc2lvbiB1c2VkLCB0aGUgZ3JlYXRlciB0aGUgcHJlc2VuY2Ugb2YgcGF0dGVybnMgd2l0aCByZXBlYXRlZCBlbGVtZW50cy4KV2hlbiB3ZSBoYXZlICREID0gMyQsIHdlIHNlZSB0aGF0IHRoZXJlIGlzIGEgZ3JlYXRlciB0ZW5kZW5jeSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBzZXF1ZW50aWFsIHBhdHRlcm5zIHdpdGggdGhlICRsYWJlbCA9IDAkICh0aGF0IGlzLCB3aXRob3V0IHJlcGVhdGVkIGVsZW1lbnRzKS4KSG93ZXZlciwgYXMgdGhlIGRpbWVuc2lvbiBpbmNyZWFzZXMsIHRoaXMgYmVoYXZpb3IgaXMgcmV2ZXJzZWQuClRoaXMgZmFjdCBvY2N1cnMgYmVjYXVzZSB3ZSBhcmUgYW5hbHl6aW5nIG51bWJlcnMgd2l0aGluIHRoZSBzbWFsbCByYW5nZSAkWzAsIDldJCwgc28gdGhlIGxhcmdlciB0aGUgc3ltYm9sIGNvbnNpZGVyZWQsIHRoZSBncmVhdGVyIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgZXhpc3RlbmNlIG9mIGVxdWFsIGVsZW1lbnRzIHRvIGJlIGdyb3VwZWQu