Data import and view

getwd() - This command return the current working directory of R session. all files read, save etc will happen in that directory by default.

setwd("path/to/the/right/directory") - Change (set) working directory. Windows users should use backslash/ to seperate directories and not normal slash (\) as default in windows.

read.csv("filename.csv") - read CSV (Comma Seperated Values) file. File name should be between qutotaion mark. by default it take the first line as header (or names) to the columns.

View(variable name) - Command that show nicely the variable in RStudio dedicated window.

vector[5] - return the 5 th element in a vector.

data.table[1,] - Return the first row and all columns from a a table.

data.table[,1] - Return the first columns and all rows from a a table.

names(variable) - Return the names (or columns) of the table.

Plot with plotly

Install packages - you can use command install.packages("package-name"). Or you can use package tab (lower right pane) and clock install.

To use the package (or library) you can click on square near package name in the right window. Or better use the command library(package-name).

plotly gReat cheatsheet

# install.packages("plotly")
library(plotly)
plot_ly( data = pl8reader
        ,x = pl8reader$Time..s.
        ,y = pl8reader[,3]
        ) 
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
plot_ly( data = pl8reader
        ,type = "scatter"
        # ,mode = "lines"
        ,x = pl8reader$Time..s.
        ,y = pl8reader[,3]
        ) 
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
No scatter mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode

Google: plotly add line to plot plotly add name to legend

add_trace() - Command to add new trace to a graph. more information in the documentation page.

Another way to get the documentation is type in the console ?function-name anc click enter. or ??package-name for package help.

p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s.
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
        ) 
add_trace(p
          ,y = pl8reader[,4]
          ,name = colnames(pl8reader)[4]
          )

layout() - documentation page Google: plotly r add main title

p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s. /3600
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
        ) 
p = add_trace(p
          ,y = pl8reader[,4]
          ,name = colnames(pl8reader)[4]
          )
layout(p
       ,title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm")
       ,xaxis = list(title = "Time (H)")
       )

Google: plotly r error bars

p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s./3600
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
        ,error_y = ~list(value = pl8reader[,5])
        
        ) 
p = add_trace(p
          ,y = pl8reader[,4]
          ,name = colnames(pl8reader)[4]
          ,error_y = ~list(value = pl8reader[,6])
          )
layout(p
       ,title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm")
       ,xaxis = list(title = "Time (H)")
       )
upper_errorB4 = pl8reader[,3] + pl8reader[,5]
lower_errorB4 = pl8reader[,3] - pl8reader[,5]
upper_errorCa = pl8reader[,4] + pl8reader[,6]
lower_errorCa = pl8reader[,4] - pl8reader[,6]
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s./3600
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
)
p = add_trace(p, y = lower_errorB4)
p = add_trace(p, y = upper_errorB4, fill = "tonexty")
p = add_trace(p, y = pl8reader[,4], name = colnames(pl8reader)[4])
p = add_trace(p, y = lower_errorCa)
p = add_trace(p, y = upper_errorCa, fill = "tonexty")
layout(p
       ,title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm")
       ,xaxis = list(title = "Time (H)")
       )
edge = list(color = 'rgba(0,0,0,0)')
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s./3600
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
)
p = add_trace(p, y = lower_errorB4, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorB4, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
p = add_trace(p, y = pl8reader[,4],name = colnames(pl8reader)[4])
p = add_trace(p, y = lower_errorCa, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorCa, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
layout(p
       ,title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm")
       ,xaxis = list(title = "Time (H)")
       )
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        ,x = pl8reader$Time..s./3600
        ,y = pl8reader[,3]
        ,name = colnames(pl8reader)[3]
)
p = add_trace(p, y = lower_errorB4, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorB4, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
p = add_trace(p, y = pl8reader[,4],name = colnames(pl8reader)[4])
p = add_trace(p, y = lower_errorCa, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorCa, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
layout(p
       ,title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm", showgrid = FALSE)
       ,xaxis = list(title = "Time (H)", showgrid = FALSE, zeroline = F)
       )
# install.packages("processx")
library(processx)
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
        # ,x = pl8reader$Time..s./3600
        # ,y = pl8reader[,i]
        # ,name = colnames(pl8reader)[i]
)
# p = add_trace(p, y = lower_errorA, showlegend = F, line = edge)
# p = add_trace(p, y = upper_errorA, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
for(i in seq(from = 3, to = 29, by = 4)){
j=i+1
upper_errorA = pl8reader[,i] + pl8reader[,i+2]
lower_errorA = pl8reader[,i] - pl8reader[,i+2]
lower_errorA[lower_errorA<0] = 0
upper_errorB = pl8reader[,j] + pl8reader[,j+2]
lower_errorB = pl8reader[,j] - pl8reader[,j+2]
lower_errorB[lower_errorB<0] = 0
p = add_trace(p, y = pl8reader[,i],name = colnames(pl8reader)[i])
p = add_trace(p, y = lower_errorA, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorA, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
p = add_trace(p, y = pl8reader[,j],name = colnames(pl8reader)[j])
p = add_trace(p, y = lower_errorB, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorB, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
}
p %>% layout(
       title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm", showgrid = FALSE)
       ,xaxis = list(title = "Time (H)", showgrid = FALSE, zeroline = F))
file2 = read.csv("Iris2A.csv")
pl8reader = file2
dim(pl8reader)
[1] 86 29
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
)
for(i in seq(from = 2, to = 25, by = 4)){
j=i+1
upper_errorB4 = pl8reader[,i] + pl8reader[,i+2]
lower_errorB4 = pl8reader[,i] - pl8reader[,i+2]
lower_errorB4[lower_errorB4<0] = 0
upper_errorCa = pl8reader[,j] + pl8reader[,j+2]
lower_errorCa = pl8reader[,j] - pl8reader[,j+2]
lower_errorCa[lower_errorCa<0] = 0
p = add_trace(p, y = pl8reader[,i],name = colnames(pl8reader)[i])
p = add_trace(p, y = lower_errorB4, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorB4, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
p = add_trace(p, y = pl8reader[,j],name = colnames(pl8reader)[j])
p = add_trace(p, y = lower_errorCa, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorCa, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
}
p %>% layout(
       title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm", showgrid = FALSE)
       ,xaxis = list(title = "Time (H)", showgrid = FALSE, zeroline = F))

Google: r read csv skip empty lines There is some problem about std

# file3 = read.csv("Iris3A.csv")
# file3 = read.csv(file = "Iris3A.csv" ,skip = as.numeric(rownames(file3[which(file3[,1]!=''),])[1]))
# pl8reader = file3[3:length(file3),]
# 
# View(pl8reader)
p = plot_ly( data = pl8reader
        ,type = "scatter"
        ,mode = "lines"
)
for(i in seq(from = 2, to = 29, by = 4)){
j=i+1
upper_errorB4 = pl8reader[,i] + pl8reader[,i+2]
lower_errorB4 = pl8reader[,i] - pl8reader[,i+2]
lower_errorB4[lower_errorB4<0] = 0
upper_errorCa = pl8reader[,j] + pl8reader[,j+2]
lower_errorCa = pl8reader[,j] - pl8reader[,j+2]
lower_errorCa[lower_errorCa<0] = 0
p = add_trace(p, y = pl8reader[,i],name = colnames(pl8reader)[i])
p = add_trace(p, y = lower_errorB4, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorB4, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
p = add_trace(p, y = pl8reader[,j],name = colnames(pl8reader)[j])
p = add_trace(p, y = lower_errorCa, showlegend = F, line = edge)
p = add_trace(p, y = upper_errorCa, fill = "tonexty",showlegend = F, line = edge, fillcolor = 'rgba(1,1,1,0.1)')
}
㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors㤼㸱+㤼㸲 not meaningful for factors㤼㸱-㤼㸲 not meaningful for factors
p %>% layout(
       title = "Growth curve"
       ,yaxis = list(title = "OD<sub>600</sub> nm", showgrid = FALSE)
       ,xaxis = list(title = "Time (H)", showgrid = FALSE, zeroline = F))
Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Can't display both discrete & non-discrete data on same axisCalling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
  Consider 'structure(list(), *)' instead.Can't display both discrete & non-discrete data on same axis
LS0tDQp0aXRsZTogIlBsb3RseSB3b3Jrc2hvcCINCmF1dGhvcjogIlJvdGVtIEhhZGFyIg0KZGF0ZTogIjE4dGggVGFtdXoiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQojIyBEYXRhIGltcG9ydCBhbmQgdmlldw0KYGdldHdkKClgIC0gVGhpcyBjb21tYW5kIHJldHVybiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiBSIHNlc3Npb24uIGFsbCBmaWxlcyByZWFkLCBzYXZlIGV0YyB3aWxsIGhhcHBlbiBpbiB0aGF0IGRpcmVjdG9yeSBieSBkZWZhdWx0Lg0KDQpgc2V0d2QoInBhdGgvdG8vdGhlL3JpZ2h0L2RpcmVjdG9yeSIpYCAtIENoYW5nZSAoc2V0KSB3b3JraW5nIGRpcmVjdG9yeS4gV2luZG93cyB1c2VycyBzaG91bGQgdXNlIGJhY2tzbGFzaGAvYCB0byBzZXBlcmF0ZSBkaXJlY3RvcmllcyBhbmQgbm90IG5vcm1hbCBzbGFzaCAoYFxgKSBhcyBkZWZhdWx0IGluIHdpbmRvd3MuDQoNCmByZWFkLmNzdigiZmlsZW5hbWUuY3N2IilgIC0gcmVhZCBDU1YgKENvbW1hIFNlcGVyYXRlZCBWYWx1ZXMpIGZpbGUuIEZpbGUgbmFtZSBzaG91bGQgYmUgYmV0d2VlbiBxdXRvdGFpb24gbWFyay4gYnkgZGVmYXVsdCBpdCB0YWtlIHRoZSBmaXJzdCBsaW5lIGFzIGhlYWRlciAob3IgbmFtZXMpIHRvIHRoZSBjb2x1bW5zLg0KDQpgVmlldyh2YXJpYWJsZSBuYW1lKWAgLSBDb21tYW5kIHRoYXQgc2hvdyBuaWNlbHkgdGhlIHZhcmlhYmxlIGluIFJTdHVkaW8gZGVkaWNhdGVkIHdpbmRvdy4gDQoNCmB2ZWN0b3JbNV1gIC0gcmV0dXJuIHRoZSA1IHRoIGVsZW1lbnQgaW4gYSB2ZWN0b3IuDQoNCmBkYXRhLnRhYmxlWzEsXWAgLSBSZXR1cm4gdGhlIGZpcnN0IHJvdyBhbmQgYWxsIGNvbHVtbnMgZnJvbSBhIGEgdGFibGUuDQoNCmBkYXRhLnRhYmxlWywxXWAgLSBSZXR1cm4gdGhlIGZpcnN0IGNvbHVtbnMgYW5kIGFsbCByb3dzIGZyb20gYSBhIHRhYmxlLg0KDQpgbmFtZXModmFyaWFibGUpYCAtIFJldHVybiB0aGUgbmFtZXMgKG9yIGNvbHVtbnMpIG9mIHRoZSB0YWJsZS4NCg0KYGBge3IgZGF0YS1pbXBvcnR9DQoNCmdldHdkKCkNCg0KZmlsZTEgPSByZWFkLmNzdigiSXJpczFBLmNzdiIpDQpwbDhyZWFkZXIgPSBmaWxlMQ0KIyBWaWV3KHBsOHJlYWRlcikNCg0KcGw4cmVhZGVyWzEsXQ0KcGw4cmVhZGVyWywxXQ0KDQpuYW1lcyhwbDhyZWFkZXIpWzFdDQoNCmBgYA0KIyMgUGxvdCB3aXRoIHBsb3RseQ0KDQpJbnN0YWxsIHBhY2thZ2VzIC0geW91IGNhbiB1c2UgY29tbWFuZCBgaW5zdGFsbC5wYWNrYWdlcygicGFja2FnZS1uYW1lIilgLiBPciB5b3UgY2FuIHVzZSBwYWNrYWdlIHRhYiAobG93ZXIgcmlnaHQgcGFuZSkgYW5kIGNsb2NrIGluc3RhbGwuDQoNClRvIHVzZSB0aGUgcGFja2FnZSAob3IgbGlicmFyeSkgeW91IGNhbiBjbGljayBvbiBzcXVhcmUgbmVhciBwYWNrYWdlIG5hbWUgaW4gdGhlIHJpZ2h0IHdpbmRvdy4gT3IgYmV0dGVyIHVzZSB0aGUgY29tbWFuZCBgbGlicmFyeShwYWNrYWdlLW5hbWUpYC4NCg0KW3Bsb3RseSBnUmVhdCBjaGVhdHNoZWV0XShodHRwczovL2ltYWdlcy5wbG90Lmx5L3Bsb3RseS1kb2N1bWVudGF0aW9uL2ltYWdlcy9yX2NoZWF0X3NoZWV0LnBkZikNCmBgYHtyIHN0YXJ0LXBsb3RseX0NCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCmxpYnJhcnkocGxvdGx5KQ0KDQpwbG90X2x5KCBkYXRhID0gcGw4cmVhZGVyDQogICAgICAgICx4ID0gcGw4cmVhZGVyJFRpbWUuLnMuDQogICAgICAgICx5ID0gcGw4cmVhZGVyWywzXQ0KICAgICAgICApIA0KDQpgYGANCg0KDQpgYGB7ciAxfQ0KcGxvdF9seSggZGF0YSA9IHBsOHJlYWRlcg0KICAgICAgICAsdHlwZSA9ICJzY2F0dGVyIg0KICAgICAgICAsbW9kZSA9ICJsaW5lcyINCiAgICAgICAgLHggPSBwbDhyZWFkZXIkVGltZS4ucy4NCiAgICAgICAgLHkgPSBwbDhyZWFkZXJbLDNdDQogICAgICAgICkgDQpgYGANCg0KR29vZ2xlOiBbcGxvdGx5IGFkZCBsaW5lIHRvIHBsb3RdKCBodHRwczovL3d3dy5nb29nbGUuY28uaWwvc2VhcmNoP3E9cGxvdGx5K2FkZCtsaW5lK3RvK3Bsb3QpDQogICAgICAgIFtwbG90bHkgYWRkIG5hbWUgdG8gbGVnZW5kXSggaHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmlsL3NlYXJjaD9xPXBsb3RseSthZGQrbmFtZSt0bytsZWdlbmQpDQogICAgICAgIA0KYGFkZF90cmFjZSgpYCAtIENvbW1hbmQgdG8gYWRkIG5ldyB0cmFjZSB0byBhIGdyYXBoLiBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBbZG9jdW1lbnRhdGlvbiBwYWdlXShodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcvcGFja2FnZXMvcGxvdGx5L3ZlcnNpb25zLzQuNy4xL3RvcGljcy9hZGRfdHJhY2UpLg0KDQpBbm90aGVyIHdheSB0byBnZXQgdGhlIGRvY3VtZW50YXRpb24gaXMgdHlwZSBpbiB0aGUgY29uc29sZSBgP2Z1bmN0aW9uLW5hbWVgIGFuYyBjbGljayBlbnRlci4gb3IgYD8/cGFja2FnZS1uYW1lYCBmb3IgcGFja2FnZSBoZWxwLg0KYGBge3IgMn0NCnAgPSBwbG90X2x5KCBkYXRhID0gcGw4cmVhZGVyDQogICAgICAgICx0eXBlID0gInNjYXR0ZXIiDQogICAgICAgICxtb2RlID0gImxpbmVzIg0KICAgICAgICAseCA9IHBsOHJlYWRlciRUaW1lLi5zLg0KICAgICAgICAseSA9IHBsOHJlYWRlclssM10NCiAgICAgICAgLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpWzNdDQogICAgICAgICkgDQphZGRfdHJhY2UocA0KICAgICAgICAgICx5ID0gcGw4cmVhZGVyWyw0XQ0KICAgICAgICAgICxuYW1lID0gY29sbmFtZXMocGw4cmVhZGVyKVs0XQ0KICAgICAgICAgICkNCmBgYA0KDQoNCg0KYGxheW91dCgpYCAtIFtkb2N1bWVudGF0aW9uIHBhZ2VdKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9wbG90bHkvdmVyc2lvbnMvNC43LjEvdG9waWNzL2xheW91dCkNCkdvb2dsZTogW3Bsb3RseSByIGFkZCBtYWluIHRpdGxlXSggaHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmlsL3NlYXJjaD9xPXBsb3RseStyK2FkZCttYWluK3RpdGxlKQ0KYGBge3IgM30NCg0KcCA9IHBsb3RfbHkoIGRhdGEgPSBwbDhyZWFkZXINCiAgICAgICAgLHR5cGUgPSAic2NhdHRlciINCiAgICAgICAgLG1vZGUgPSAibGluZXMiDQogICAgICAgICx4ID0gcGw4cmVhZGVyJFRpbWUuLnMuIC8zNjAwDQogICAgICAgICx5ID0gcGw4cmVhZGVyWywzXQ0KICAgICAgICAsbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbM10NCiAgICAgICAgKSANCnAgPSBhZGRfdHJhY2UocA0KICAgICAgICAgICx5ID0gcGw4cmVhZGVyWyw0XQ0KICAgICAgICAgICxuYW1lID0gY29sbmFtZXMocGw4cmVhZGVyKVs0XQ0KICAgICAgICAgICkNCmxheW91dChwDQogICAgICAgLHRpdGxlID0gIkdyb3d0aCBjdXJ2ZSINCiAgICAgICAseWF4aXMgPSBsaXN0KHRpdGxlID0gIk9EPHN1Yj42MDA8L3N1Yj4gbm0iKQ0KICAgICAgICx4YXhpcyA9IGxpc3QodGl0bGUgPSAiVGltZSAoSCkiKQ0KICAgICAgICkNCmBgYA0KDQpHb29nbGU6IFtwbG90bHkgciBlcnJvciBiYXJzXSggaHR0cHM6Ly93d3cuZ29vZ2xlLmNvLmlsL3NlYXJjaD9xPXBsb3RseStyK2Vycm9yK2JhcnMpDQpgYGB7ciA0fQ0KcCA9IHBsb3RfbHkoIGRhdGEgPSBwbDhyZWFkZXINCiAgICAgICAgLHR5cGUgPSAic2NhdHRlciINCiAgICAgICAgLG1vZGUgPSAibGluZXMiDQogICAgICAgICx4ID0gcGw4cmVhZGVyJFRpbWUuLnMuLzM2MDANCiAgICAgICAgLHkgPSBwbDhyZWFkZXJbLDNdDQogICAgICAgICxuYW1lID0gY29sbmFtZXMocGw4cmVhZGVyKVszXQ0KICAgICAgICAsZXJyb3JfeSA9IH5saXN0KHZhbHVlID0gcGw4cmVhZGVyWyw1XSkNCiAgICAgICAgDQogICAgICAgICkgDQpwID0gYWRkX3RyYWNlKHANCiAgICAgICAgICAseSA9IHBsOHJlYWRlclssNF0NCiAgICAgICAgICAsbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbNF0NCiAgICAgICAgICAsZXJyb3JfeSA9IH5saXN0KHZhbHVlID0gcGw4cmVhZGVyWyw2XSkNCiAgICAgICAgICApDQpsYXlvdXQocA0KICAgICAgICx0aXRsZSA9ICJHcm93dGggY3VydmUiDQogICAgICAgLHlheGlzID0gbGlzdCh0aXRsZSA9ICJPRDxzdWI+NjAwPC9zdWI+IG5tIikNCiAgICAgICAseGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpbWUgKEgpIikNCiAgICAgICApDQoNCmBgYA0KDQpgYGB7ciA1fQ0KdXBwZXJfZXJyb3JCNCA9IHBsOHJlYWRlclssM10gKyBwbDhyZWFkZXJbLDVdDQpsb3dlcl9lcnJvckI0ID0gcGw4cmVhZGVyWywzXSAtIHBsOHJlYWRlclssNV0NCnVwcGVyX2Vycm9yQ2EgPSBwbDhyZWFkZXJbLDRdICsgcGw4cmVhZGVyWyw2XQ0KbG93ZXJfZXJyb3JDYSA9IHBsOHJlYWRlclssNF0gLSBwbDhyZWFkZXJbLDZdDQoNCnAgPSBwbG90X2x5KCBkYXRhID0gcGw4cmVhZGVyDQogICAgICAgICx0eXBlID0gInNjYXR0ZXIiDQogICAgICAgICxtb2RlID0gImxpbmVzIg0KICAgICAgICAseCA9IHBsOHJlYWRlciRUaW1lLi5zLi8zNjAwDQogICAgICAgICx5ID0gcGw4cmVhZGVyWywzXQ0KICAgICAgICAsbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbM10NCikNCnAgPSBhZGRfdHJhY2UocCwgeSA9IGxvd2VyX2Vycm9yQjQpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckI0LCBmaWxsID0gInRvbmV4dHkiKQ0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLDRdLCBuYW1lID0gY29sbmFtZXMocGw4cmVhZGVyKVs0XSkNCnAgPSBhZGRfdHJhY2UocCwgeSA9IGxvd2VyX2Vycm9yQ2EpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckNhLCBmaWxsID0gInRvbmV4dHkiKQ0KDQpsYXlvdXQocA0KICAgICAgICx0aXRsZSA9ICJHcm93dGggY3VydmUiDQogICAgICAgLHlheGlzID0gbGlzdCh0aXRsZSA9ICJPRDxzdWI+NjAwPC9zdWI+IG5tIikNCiAgICAgICAseGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpbWUgKEgpIikNCiAgICAgICApDQpgYGANCg0KYGBge3IgNn0NCmVkZ2UgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMCwwLDAsMCknKQ0KDQpwID0gcGxvdF9seSggZGF0YSA9IHBsOHJlYWRlcg0KICAgICAgICAsdHlwZSA9ICJzY2F0dGVyIg0KICAgICAgICAsbW9kZSA9ICJsaW5lcyINCiAgICAgICAgLHggPSBwbDhyZWFkZXIkVGltZS4ucy4vMzYwMA0KICAgICAgICAseSA9IHBsOHJlYWRlclssM10NCiAgICAgICAgLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpWzNdDQopDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBsb3dlcl9lcnJvckI0LCBzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckI0LCBmaWxsID0gInRvbmV4dHkiLHNob3dsZWdlbmQgPSBGLCBsaW5lID0gZWRnZSwgZmlsbGNvbG9yID0gJ3JnYmEoMSwxLDEsMC4xKScpDQoNCnAgPSBhZGRfdHJhY2UocCwgeSA9IHBsOHJlYWRlclssNF0sbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbNF0pDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBsb3dlcl9lcnJvckNhLCBzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckNhLCBmaWxsID0gInRvbmV4dHkiLHNob3dsZWdlbmQgPSBGLCBsaW5lID0gZWRnZSwgZmlsbGNvbG9yID0gJ3JnYmEoMSwxLDEsMC4xKScpDQoNCmxheW91dChwDQogICAgICAgLHRpdGxlID0gIkdyb3d0aCBjdXJ2ZSINCiAgICAgICAseWF4aXMgPSBsaXN0KHRpdGxlID0gIk9EPHN1Yj42MDA8L3N1Yj4gbm0iKQ0KICAgICAgICx4YXhpcyA9IGxpc3QodGl0bGUgPSAiVGltZSAoSCkiKQ0KICAgICAgICkNCmBgYA0KDQpgYGB7ciA3fQ0KcCA9IHBsb3RfbHkoIGRhdGEgPSBwbDhyZWFkZXINCiAgICAgICAgLHR5cGUgPSAic2NhdHRlciINCiAgICAgICAgLG1vZGUgPSAibGluZXMiDQogICAgICAgICx4ID0gcGw4cmVhZGVyJFRpbWUuLnMuLzM2MDANCiAgICAgICAgLHkgPSBwbDhyZWFkZXJbLDNdDQogICAgICAgICxuYW1lID0gY29sbmFtZXMocGw4cmVhZGVyKVszXQ0KKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JCNCwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JCNCwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLDRdLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpWzRdKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JDYSwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JDYSwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KDQpsYXlvdXQocA0KICAgICAgICx0aXRsZSA9ICJHcm93dGggY3VydmUiDQogICAgICAgLHlheGlzID0gbGlzdCh0aXRsZSA9ICJPRDxzdWI+NjAwPC9zdWI+IG5tIiwgc2hvd2dyaWQgPSBGQUxTRSkNCiAgICAgICAseGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpbWUgKEgpIiwgc2hvd2dyaWQgPSBGQUxTRSwgemVyb2xpbmUgPSBGKQ0KICAgICAgICkNCg0KYGBgDQoNCmBgYHtyIDh9DQpwID0gcGxvdF9seSggZGF0YSA9IHBsOHJlYWRlcg0KICAgICAgICAsdHlwZSA9ICJzY2F0dGVyIg0KICAgICAgICAsbW9kZSA9ICJsaW5lcyINCikNCg0KZm9yKGkgaW4gc2VxKGZyb20gPSAzLCB0byA9IDI5LCBieSA9IDQpKXsNCmo9aSsxDQp1cHBlcl9lcnJvckI0ID0gcGw4cmVhZGVyWyxpXSArIHBsOHJlYWRlclssaSsyXQ0KbG93ZXJfZXJyb3JCNCA9IHBsOHJlYWRlclssaV0gLSBwbDhyZWFkZXJbLGkrMl0NCmxvd2VyX2Vycm9yQjRbbG93ZXJfZXJyb3JCNDwwXSA9IDANCnVwcGVyX2Vycm9yQ2EgPSBwbDhyZWFkZXJbLGpdICsgcGw4cmVhZGVyWyxqKzJdDQpsb3dlcl9lcnJvckNhID0gcGw4cmVhZGVyWyxqXSAtIHBsOHJlYWRlclssaisyXQ0KbG93ZXJfZXJyb3JDYVtsb3dlcl9lcnJvckNhPDBdID0gMA0KDQoNCnAgPSBhZGRfdHJhY2UocCwgeSA9IHBsOHJlYWRlclssaV0sbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbaV0pDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBsb3dlcl9lcnJvckI0LCBzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckI0LCBmaWxsID0gInRvbmV4dHkiLHNob3dsZWdlbmQgPSBGLCBsaW5lID0gZWRnZSwgZmlsbGNvbG9yID0gJ3JnYmEoMSwxLDEsMC4xKScpDQoNCnAgPSBhZGRfdHJhY2UocCwgeSA9IHBsOHJlYWRlclssal0sbmFtZSA9IGNvbG5hbWVzKHBsOHJlYWRlcilbal0pDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBsb3dlcl9lcnJvckNhLCBzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UpDQpwID0gYWRkX3RyYWNlKHAsIHkgPSB1cHBlcl9lcnJvckNhLCBmaWxsID0gInRvbmV4dHkiLHNob3dsZWdlbmQgPSBGLCBsaW5lID0gZWRnZSwgZmlsbGNvbG9yID0gJ3JnYmEoMSwxLDEsMC4xKScpDQp9DQoNCnAgJT4lIGxheW91dCgNCiAgICAgICB0aXRsZSA9ICJHcm93dGggY3VydmUiDQogICAgICAgLHlheGlzID0gbGlzdCh0aXRsZSA9ICJPRDxzdWI+NjAwPC9zdWI+IG5tIiwgc2hvd2dyaWQgPSBGQUxTRSkNCiAgICAgICAseGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpbWUgKEgpIiwgc2hvd2dyaWQgPSBGQUxTRSwgemVyb2xpbmUgPSBGKSkNCg0KYGBgDQoNCmBgYHtyIDl9DQoNCmZpbGUyID0gcmVhZC5jc3YoIklyaXMyQS5jc3YiKQ0KcGw4cmVhZGVyID0gZmlsZTINCg0KZGltKHBsOHJlYWRlcikNCg0KcCA9IHBsb3RfbHkoIGRhdGEgPSBwbDhyZWFkZXINCiAgICAgICAgLHR5cGUgPSAic2NhdHRlciINCiAgICAgICAgLG1vZGUgPSAibGluZXMiDQopDQoNCmZvcihpIGluIHNlcShmcm9tID0gMiwgdG8gPSAyNSwgYnkgPSA0KSl7DQpqPWkrMQ0KdXBwZXJfZXJyb3JCNCA9IHBsOHJlYWRlclssaV0gKyBwbDhyZWFkZXJbLGkrMl0NCmxvd2VyX2Vycm9yQjQgPSBwbDhyZWFkZXJbLGldIC0gcGw4cmVhZGVyWyxpKzJdDQpsb3dlcl9lcnJvckI0W2xvd2VyX2Vycm9yQjQ8MF0gPSAwDQp1cHBlcl9lcnJvckNhID0gcGw4cmVhZGVyWyxqXSArIHBsOHJlYWRlclssaisyXQ0KbG93ZXJfZXJyb3JDYSA9IHBsOHJlYWRlclssal0gLSBwbDhyZWFkZXJbLGorMl0NCmxvd2VyX2Vycm9yQ2FbbG93ZXJfZXJyb3JDYTwwXSA9IDANCg0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLGldLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpW2ldKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JCNCwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JCNCwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLGpdLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpW2pdKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JDYSwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JDYSwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KfQ0KDQpwICU+JSBsYXlvdXQoDQogICAgICAgdGl0bGUgPSAiR3Jvd3RoIGN1cnZlIg0KICAgICAgICx5YXhpcyA9IGxpc3QodGl0bGUgPSAiT0Q8c3ViPjYwMDwvc3ViPiBubSIsIHNob3dncmlkID0gRkFMU0UpDQogICAgICAgLHhheGlzID0gbGlzdCh0aXRsZSA9ICJUaW1lIChIKSIsIHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRikpDQoNCmBgYA0KDQpHb29nbGU6IFtyIHJlYWQgY3N2IHNraXAgZW1wdHkgbGluZXNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jby5pbC9zZWFyY2g/cT1yK3JlYWQrY3N2K3NraXArZW1wdHkrbGluZXMpDQpUaGVyZSBpcyBzb21lIHByb2JsZW0gYWJvdXQgc3RkDQpgYGB7ciAxMH0NCg0KIyBmaWxlMyA9IHJlYWQuY3N2KCJJcmlzM0EuY3N2IikNCiMgZmlsZTMgPSByZWFkLmNzdihmaWxlID0gIklyaXMzQS5jc3YiICxza2lwID0gYXMubnVtZXJpYyhyb3duYW1lcyhmaWxlM1t3aGljaChmaWxlM1ssMV0hPScnKSxdKVsxXSkpDQojIHBsOHJlYWRlciA9IGZpbGUzWzM6bGVuZ3RoKGZpbGUzKSxdDQojIA0KIyBWaWV3KHBsOHJlYWRlcikNCg0KcCA9IHBsb3RfbHkoIGRhdGEgPSBwbDhyZWFkZXINCiAgICAgICAgLHR5cGUgPSAic2NhdHRlciINCiAgICAgICAgLG1vZGUgPSAibGluZXMiDQopDQoNCmZvcihpIGluIHNlcShmcm9tID0gMiwgdG8gPSAyOSwgYnkgPSA0KSl7DQpqPWkrMQ0KdXBwZXJfZXJyb3JCNCA9IHBsOHJlYWRlclssaV0gKyBwbDhyZWFkZXJbLGkrMl0NCmxvd2VyX2Vycm9yQjQgPSBwbDhyZWFkZXJbLGldIC0gcGw4cmVhZGVyWyxpKzJdDQpsb3dlcl9lcnJvckI0W2xvd2VyX2Vycm9yQjQ8MF0gPSAwDQp1cHBlcl9lcnJvckNhID0gcGw4cmVhZGVyWyxqXSArIHBsOHJlYWRlclssaisyXQ0KbG93ZXJfZXJyb3JDYSA9IHBsOHJlYWRlclssal0gLSBwbDhyZWFkZXJbLGorMl0NCmxvd2VyX2Vycm9yQ2FbbG93ZXJfZXJyb3JDYTwwXSA9IDANCg0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLGldLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpW2ldKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JCNCwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JCNCwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KDQpwID0gYWRkX3RyYWNlKHAsIHkgPSBwbDhyZWFkZXJbLGpdLG5hbWUgPSBjb2xuYW1lcyhwbDhyZWFkZXIpW2pdKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gbG93ZXJfZXJyb3JDYSwgc2hvd2xlZ2VuZCA9IEYsIGxpbmUgPSBlZGdlKQ0KcCA9IGFkZF90cmFjZShwLCB5ID0gdXBwZXJfZXJyb3JDYSwgZmlsbCA9ICJ0b25leHR5IixzaG93bGVnZW5kID0gRiwgbGluZSA9IGVkZ2UsIGZpbGxjb2xvciA9ICdyZ2JhKDEsMSwxLDAuMSknKQ0KfQ0KDQpwICU+JSBsYXlvdXQoDQogICAgICAgdGl0bGUgPSAiR3Jvd3RoIGN1cnZlIg0KICAgICAgICx5YXhpcyA9IGxpc3QodGl0bGUgPSAiT0Q8c3ViPjYwMDwvc3ViPiBubSIsIHNob3dncmlkID0gRkFMU0UpDQogICAgICAgLHhheGlzID0gbGlzdCh0aXRsZSA9ICJUaW1lIChIKSIsIHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRikpDQoNCmBgYA0K