Go back to the Contents page.


Press Show to reveal the code chunks.


# Create a clipboard button on the rendered HTML page
source(here::here("clipboard.R")); clipboard
# Set seed for reproducibility
set.seed(1982) 
# Set global options for all code chunks
knitr::opts_chunk$set(
  # Disable messages printed by R code chunks
  message = FALSE,    
  # Disable warnings printed by R code chunks
  warning = FALSE,    
  # Show R code within code chunks in output
  echo = TRUE,        
  # Include both R code and its results in output
  include = TRUE,     
  # Evaluate R code chunks
  eval = FALSE,       
  # Enable caching of R code chunks for faster rendering
  cache = FALSE,      
  # Align figures in the center of the output
  fig.align = "center",
  # Enable retina display for high-resolution figures
  retina = 2,
  # Show errors in the output instead of stopping rendering
  error = TRUE,
  # Do not collapse code and output into a single block
  collapse = FALSE
)
# Start the figure counter
fig_count <- 0
# Define the captioner function
captioner <- function(caption) {
  fig_count <<- fig_count + 1
  paste0("Figure ", fig_count, ": ", caption)
}
library(MetricGraph)
library(ggplot2)
library(reshape2)
library(dplyr)
library(viridis)
library(plotly)
library(patchwork)
library(slackr)
source("keys.R")
slackr_setup(token = token) # token comes from keys.R
## [1] "Successfully connected to Slack"
capture.output(
  knitr::purl(here::here("functionality1.Rmd"), output = here::here("functionality1.R")),
  file = here::here("old/purl_log.txt")
)
source(here::here("functionality1.R"))
apply_edge_functions_fast <- function(graph, f_list) {
  
  if (length(f_list) != graph$nE) {
    stop(sprintf(
      "Number of functions (%d) must equal number of edges (%d).",
      length(f_list), graph$nE
    ))
  }
  VtE <- graph$mesh$VtE
  edge_lengths <- graph$edge_lengths
  
  edge   <- VtE[,1]
  s_norm <- VtE[,2]
  s_true <- s_norm * edge_lengths[edge]

  out <- sapply(seq_len(nrow(VtE)), function(i) f_list[[edge[i]]](s_true[i]))
  return(out)
}
my_apply_edge_functions <- function(graph, f_list, ell1, ell2, h){
  l1_mesh <- seq(0, ell1, by = h)
  l2_mesh <- seq(0, ell2, by = h)
  f1 <- f_list[[1]](l1_mesh)
  f2 <- f_list[[2]](l2_mesh)
  l1_mesh_norm <- l1_mesh/ell1
  l2_mesh_norm <- l2_mesh/ell2
  PtE1 <- cbind(rep(1, length(l1_mesh)), l1_mesh_norm)
  PtE2 <- cbind(rep(2, length(l2_mesh)), l2_mesh_norm)
  XY1 <- graph$coordinates(PtE1)
  XY2 <- graph$coordinates(PtE2)
  DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = f1)
  DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = f2)
  DF <- rbind(DF1, rep(NA, 3), DF2)
  return(list(DF = DF))
}

1 Example of a function \(h\in C^1(\Gamma)\cap \mathcal{K}(\Gamma)\) where \(h'\) looks discontinuous

Let us consider the \(2\)-star graph \(\Gamma = (\mathcal{V}, \mathcal{E})\), where \(\mathcal{V} = \{v_0, v_1, v_2\}\) and \(\mathcal{E} = \{e_1, e_2\}\). Each edge \(e_i\) has common length \(\ell\) and connects the central vertex \(v_0\) to the outer vertex \(v_i\) for \(i=1,2\) in such a way that \(v_0 = \underline{e_1} = \underline{e_2}\). On \(\Gamma\), we define the function \(h = \{h_e\}_{e\in\mathcal{E}}\) via

\[ h_{e_1}(s) = a + b_1 s - \frac{b_1 s^3}{3\ell^2}, \quad h_{e_2}(s) = a + b_2 s - \frac{b_2 s^3}{3\ell^2}. \] Clearly, \(h\) is a continuous function (see Figure 9) since \[ h_{e_1}(0) = h_{e_2}(s) = a. \] The derivative \(h' = \{h'_e\}_{e\in\mathcal{E}}\) of \(h\) on each edge is given by

\[ h_{e_1}'(s) = b_1 - \frac{b_1 s^2}{\ell^2}, \quad h_{e_2}'(s) = b_2 - \frac{b_2 s^2}{\ell^2}. \] By choosing \(b_1=1\) and \(b_2=-1\), we have that \[ h_{e_1}'(0)+h_{e_2}'(0) = b_1+b_2=0\quad\text{ and }\quad h_{e_1}'(\ell) =h_{e_2}'(\ell) = 0, \] so that \(h\) satisfies the Kirchhoff conditions at every vertex. This means that \(h'\) should be a continuous function. However, Figure 10 shows that \(h'\) is discontinuous. This is actually an artefact due to the fact that the edges are not compatible oriented. For a discussion about compatible orientation, go to this page.

h = 0.02

x_eye <- 5#8
y_eye <- -1#-2
z_eye <- 2#3
my_length <- 2
edges <-list()
edges[[1]] <- rbind(c(-my_length, 0), c(0, 0))
edges[[2]] <- rbind(c(0, 0), c(my_length, 0))
graph <- metric_graph$new(edges = edges)
graph$build_mesh(h = h)
e1_ini_x <- edges[[1]][1,1]; e1_ini_y <- edges[[1]][1,2]; e1_ini_z <- 0
e1_fin_x <- edges[[1]][2,1]; e1_fin_y <- edges[[1]][2,2]; e1_fin_z <- 0

# Midpoint
xm1 <- (e1_fin_x + e1_ini_x)/2
ym1 <- (e1_fin_y + e1_ini_y)/2
zm1 <- (e1_fin_z + e1_ini_z)/2

# Direction vector
dx1 <- e1_fin_x - e1_ini_x
dy1 <- e1_fin_y - e1_ini_y
dz1 <- e1_fin_z - e1_ini_z

e2_ini_x <- edges[[2]][1,1]; e2_ini_y <- edges[[2]][1,2]; e2_ini_z <- 0
e2_fin_x <- edges[[2]][2,1]; e2_fin_y <- edges[[2]][2,2]; e2_fin_z <- 0

# Midpoint
xm2 <- (e2_fin_x + e2_ini_x)/2
ym2 <- (e2_fin_y + e2_ini_y)/2
zm2 <- (e2_fin_z + e2_ini_z)/2

# Direction vector
dx2 <- e2_fin_x - e2_ini_x
dy2 <- e2_fin_y - e2_ini_y
dz2 <- e2_fin_z - e2_ini_z


sizeref <- 0.3
# General parameters
L <- my_length             # edge length
a <- 1             # value at central vertex
b <- c(-1, 1)   # b1+b2+b3 must be 0

f1 <- function(s) a + b[1]*(L-s) - b[1]*(L-s)^3/(3*L^2)
f2 <- function(s) a + b[2]*s - b[2]*s^3/(3*L^2)


df1 <- function(s) -b[1] + b[1]*(L-s)^2/L^2
df2 <- function(s) b[2] - b[2]*s^2/L^2

ddf1 <- function(s) -2*b[1]*(L-s)/L^2
ddf2 <- function(s) -2*b[2]*s/L^2

dddf1 <- function(s) 2*b[1]/L^2
dddf2 <- function(s) -2*b[2]/L^2


f_list <- list(f1, f2)
df_list <- list(df1, df2)
ddf_list <- list(ddf1, ddf2)
dddf_list <- list(dddf1, dddf2)

f_list_aux <- f_list
df_list_aux <- df_list
ddf_list_aux <- ddf_list
dddf_list_aux <- dddf_list

f <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph, dddf_list)
phkok <- graph$plot_function(X = f, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  config(mathjax = 'cdn') |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("f"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
              annotations = list(
                     
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

pdhkok <- graph$plot_function(X = df, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  config(mathjax = 'cdn') |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("f'"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
              annotations = list(
                     
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))
pddhkok <- graph$plot_function(X = ddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  config(mathjax = 'cdn') |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("f''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
              annotations = list(
                     
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))
pdddhkok <- graph$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |> 
  config(mathjax = 'cdn') |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("f'''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
              annotations = list(
                     
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

save(phkok, file = here::here("h_kirchhoff.RData"))
save(pdhkok, file = here::here("dh_kirchhoff.RData"))
save(pddhkok, file = here::here("ddh_kirchhoff.RData"))
save(pdddhkok, file = here::here("dddh_kirchhoff.RData"))

For illustration purposes, Figure 11 and 12 shows \(h''\) and \(h'''\).

load(here::here("h_kirchhoff.RData"))
phkok

Figure 1: Function \(h = \{h_e\}_{e\in\mathcal{E}}\) given by \(h_{e_i}(s) = a + b_i s - \dfrac{b_i s^3}{3\ell^2}\) for \(i=1,2\).

load(here::here("dh_kirchhoff.RData"))
pdhkok

Figure 2: Function \(h' = \{h'_e\}_{e\in\mathcal{E}}\) given by \(h'_{e_i}(s) = b_i - \dfrac{b_i s^2}{\ell^2}\) for \(i=1,2\).

load(here::here("ddh_kirchhoff.RData"))
pddhkok

Figure 3: Function \(h'' = \{h''_e\}_{e\in\mathcal{E}}\) given by \(h''_{e_i}(s) = - \dfrac{2 b_i s}{\ell^2}\) for \(i=1,2\).

load(here::here("dddh_kirchhoff.RData"))
pdddhkok

Figure 4: Function \(h''' = \{h'''_e\}_{e\in\mathcal{E}}\) given by \(h'''_{e_i}(s) = - \dfrac{2 b_i}{\ell^2}\) for \(i=1,2\).

2 Flip \(e_2\)

edges <-list()
edges[[1]] <- rbind(c(-my_length, 0), c(0, 0))
edges[[2]] <- rbind(c(0, 0), c(my_length, 0))[2:1,]

graph <- metric_graph$new(edges = edges)
graph$build_mesh(h = h)
e1_ini_x <- edges[[1]][1,1]; e1_ini_y <- edges[[1]][1,2]; e1_ini_z <- 0
e1_fin_x <- edges[[1]][2,1]; e1_fin_y <- edges[[1]][2,2]; e1_fin_z <- 0

# Midpoint
xm1 <- (e1_fin_x + e1_ini_x)/2
ym1 <- (e1_fin_y + e1_ini_y)/2
zm1 <- (e1_fin_z + e1_ini_z)/2

# Direction vector
dx1 <- e1_fin_x - e1_ini_x
dy1 <- e1_fin_y - e1_ini_y
dz1 <- e1_fin_z - e1_ini_z

e2_ini_x <- edges[[2]][1,1]; e2_ini_y <- edges[[2]][1,2]; e2_ini_z <- 0
e2_fin_x <- edges[[2]][2,1]; e2_fin_y <- edges[[2]][2,2]; e2_fin_z <- 0

# Midpoint
xm2 <- (e2_fin_x + e2_ini_x)/2
ym2 <- (e2_fin_y + e2_ini_y)/2
zm2 <- (e2_fin_z + e2_ini_z)/2

# Direction vector
dx2 <- e2_fin_x - e2_ini_x
dy2 <- e2_fin_y - e2_ini_y
dz2 <- e2_fin_z - e2_ini_z
f1 <- function(s) a + b[1]*(L-s) - b[1]*(L-s)^3/(3*L^2)
f2 <- function(s) a + b[2]*(L-s) - b[2]*(L-s)^3/(3*L^2)


df1 <- function(s) -b[1] + b[1]*(L-s)^2/L^2
df2 <- function(s) -b[2] + b[2]*(L-s)^2/L^2

ddf1 <- function(s) -2*b[1]*(L-s)/L^2
ddf2 <- function(s) -2*b[2]*(L-s)/L^2

dddf1 <- function(s) 2*b[1]/L^2
dddf2 <- function(s) 2*b[2]/L^2


f_list <- list(f1, f2)
df_list <- list(df1, df2)
ddf_list <- list(ddf1, ddf2)
dddf_list <- list(dddf1, dddf2)

f <- my_apply_edge_functions(graph, f_list, L, L, h)
df <- my_apply_edge_functions(graph, df_list, L, L, h)
ddf <- my_apply_edge_functions(graph, ddf_list, L, L, h)
dddf <- my_apply_edge_functions(graph, dddf_list, L, L, h)

f_aux <- my_apply_edge_functions(graph, f_list_aux, L, L, h)
df_aux <- my_apply_edge_functions(graph, df_list_aux, L, L, h)
ddf_aux <- my_apply_edge_functions(graph, ddf_list_aux, L, L, h)
dddf_aux <- my_apply_edge_functions(graph, dddf_list_aux, L, L, h)
p_base <- graph$plot(vertex_size = gsw, edge_color = "black", edge_width = gsw, type = "plotly")
DF <- f$DF
pfkirok <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))


DF <- df$DF
pdfkirok <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g'"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- ddf$DF
pddfkirok <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- dddf$DF
pdddfkirok <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("g'''"), y = 0.8), 
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

save(pfkirok, file = here::here("data_files/pfkirok.Rdata"))
save(pdfkirok, file = here::here("data_files/pdfkirok.Rdata"))
save(pddfkirok, file = here::here("data_files/pddfkirok.Rdata"))
save(pdddfkirok, file = here::here("data_files/pdddfkirok.Rdata"))
load(here::here("data_files/pfkirok.Rdata"))
pfkirok

Figure 5: Function \(h = \{h_e\}_{e\in\mathcal{E}}\) given by \(h_{e_i}(s) = a + b_i s - \dfrac{b_i s^3}{3\ell^2}\) for \(i=1,2\).

load(here::here("data_files/pdfkirok.Rdata"))
pdfkirok

Figure 6: Function \(h' = \{h'_e\}_{e\in\mathcal{E}}\) given by \(h'_{e_i}(s) = b_i - \dfrac{b_i s^2}{\ell^2}\) for \(i=1,2\).

load(here::here("data_files/pddfkirok.Rdata"))
pddfkirok

Figure 7: Function \(h'' = \{h''_e\}_{e\in\mathcal{E}}\) given by \(h''_{e_i}(s) = - \dfrac{2 b_i s}{\ell^2}\) for \(i=1,2\).

load(here::here("data_files/pdddfkirok.Rdata"))
pdddfkirok

Figure 8: Function \(h''' = \{h'''_e\}_{e\in\mathcal{E}}\) given by \(h'''_{e_i}(s) = - \dfrac{2 b_i}{\ell^2}\) for \(i=1,2\).

3 Additional plots

DF <- f_aux$DF
pf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))
DF <- df_aux$DF
pdf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}'"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- ddf_aux$DF
pddf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}''"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

DF <- dddf_aux$DF
pdddf_aux <- p_base |>
  add_trace(
  type = "cone",
  x = ym1,
  y = xm1,
  z = zm1,
  u = dy1,
  v = dx1,
  w = dz1,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym2,
  y = xm2,
  z = zm2,
  u = dy2,
  v = dx2,
  w = dz2,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
    add_trace(data = DF,
            x = ~y, 
            y = ~x, 
            z = ~z, 
            type = "scatter3d",
            mode = "lines",  
            line = list(color = "rgb(0,0,200)", width = gsw),
            showlegend = FALSE) |>
  add_trace(x = rep(DF$y, each = 3), 
            y = rep(DF$x, each = 3), 
            z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
            type = "scatter3d", 
            mode = "lines",
            line = list(color = "gray", width = 0.5),
            showlegend = FALSE) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("\\hat{f}'''"), y = 0.8),
                 font = list(family = "Palatino"),
                 scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              yaxis = list(title = list(text = "y", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
              zaxis = list(title = list(text = "z", font = list(color = colaxnn)),  tickfont = list(color = colaxnn)),
                   aspectratio = list(x = 2, 
                                 y = 2, 
                                 z = 2),
                   camera = list(eye = list(x = x_eye, 
                                       y = y_eye, 
                                       z = z_eye),
                            center = list(x = 0, 
                                          y = 0, 
                                          z = 0)),
                   annotations = list(
                     
             list(
               x = e1_ini_y, y = e1_ini_x, z = e1_ini_z,
               text = TeX("v_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = 0, y = 0, z = 0,
               text = TeX("v"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = e2_ini_y, y = e2_ini_x, z = e2_ini_z,
               text = TeX("v_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym1, y = xm1, z = zm1,
               text = TeX("e_1"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"),
             list(
               x = ym2, y = xm2, z = zm2,
               text = TeX("\\hat{e}_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))



save(pf_aux, file = here::here("data_files/pf_aux2.Rdata"))
save(pdf_aux, file = here::here("data_files/pdf_aux2.Rdata"))
save(pddf_aux, file = here::here("data_files/pddf_aux2.Rdata"))
save(pdddf_aux, file = here::here("data_files/pdddf_aux2.Rdata"))
load(here::here("h_kirchhoff.RData"))
phkok

Figure 9: Function \(f = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{e_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pf_aux2.Rdata"))
pf_aux

Figure 10: Function \(\hat{f} = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{\hat{e}_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pfkirok.Rdata"))
pfkirok

Figure 11: Function \(g = \{g_e\}_{e\in\mathcal{E}}\) given by \(g_{e_1}(\tau) = \tau^4\) and \(g_{\hat{e}_2}(\tau) = (\tau-(\ell_1+\ell_2))^4\).

4 For \(\hat{f}\)

load(here::here("data_files/pf_aux2.Rdata"))
pf_aux

Figure 12: Function \(\hat{f} = \{f_e\}_{e\in\mathcal{E}}\) given by \(f_{e_1}(t) = t^4\) and \(f_{\hat{e}_2}(t) = (t+\ell_1)^4\).

load(here::here("data_files/pdf_aux2.Rdata"))
pdf_aux

Figure 13: Function \(\hat{f}' = \{f'_e\}_{e\in\mathcal{E}}\) given by \(f'_{e_1}(t) = 4t^3\) and \(f'_{\hat{e}_2}(t) = 4(t+\ell_1)^3\).

load(here::here("data_files/pddf_aux2.Rdata"))
pddf_aux

Figure 14: Function \(\hat{f}'' = \{f''_e\}_{e\in\mathcal{E}}\) given by \(f''_{e_1}(t) = 12t^2\) and \(f''_{\hat{e}_2}(t) = 12(t+\ell_1)^2\).

load(here::here("data_files/pdddf_aux2.Rdata"))
pdddf_aux

Figure 15: Function \(\hat{f}''' = \{f'''_e\}_{e\in\mathcal{E}}\) given by \(f'''_{e_1}(t) = 24t\) and \(f'''_{\hat{e}_2}(t) = 24(t+\ell_1)\).

5 References

grateful::cite_packages(output = "paragraph", out.dir = ".")

We used R version 4.5.2 (R Core Team 2025a) and the following R packages: cowplot v. 1.2.0 (Wilke 2025), ggmap v. 4.0.2 (Kahle and Wickham 2013), ggpubr v. 0.6.3 (Kassambara 2026), ggtext v. 0.1.2 (Wilke and Wiernik 2022), glue v. 1.8.0 (Hester and Bryan 2024), grid v. 4.5.2 (R Core Team 2025b), here v. 1.0.1 (Müller 2020), htmltools v. 0.5.8.1 (Cheng et al. 2024), INLA v. 25.11.22 (Rue, Martino, and Chopin 2009; Lindgren, Rue, and Lindström 2011; Martins et al. 2013; Lindgren and Rue 2015; De Coninck et al. 2016; Rue et al. 2017; Verbosio et al. 2017; Bakka et al. 2018; Kourounis, Fuchs, and Schenk 2018), inlabru v. 2.13.0 (Yuan et al. 2017; Bachl et al. 2019), knitr v. 1.50 (Xie 2014, 2015, 2025), latex2exp v. 0.9.8 (Meschiari 2026), Matrix v. 1.7.3 (Bates, Maechler, and Jagan 2025), MetricGraph v. 1.5.0.9000 (Bolin, Simas, and Wallin 2023a, 2023b, 2024, 2025; Bolin et al. 2024), OpenStreetMap v. 0.4.1 (Fellows and Stotz 2025), patchwork v. 1.3.1 (Pedersen 2025), plotly v. 4.11.0 (Sievert 2020), plotrix v. 3.8.14 (J 2006), renv v. 1.1.7 (Ushey and Wickham 2026), reshape2 v. 1.4.4 (Wickham 2007), reticulate v. 1.44.1 (Ushey, Allaire, and Tang 2025), rmarkdown v. 2.30 (Xie, Allaire, and Grolemund 2018; Xie, Dervieux, and Riederer 2020; Allaire et al. 2025), rSPDE v. 2.5.2.9000 (Bolin and Kirchner 2020; Bolin and Simas 2023; Bolin, Simas, and Xiong 2024), scales v. 1.4.0 (Wickham, Pedersen, and Seidel 2025), sf v. 1.1.0 (E. Pebesma 2018; E. Pebesma and Bivand 2023), slackr v. 3.4.0 (Kaye et al. 2025), sp v. 2.2.1 (E. J. Pebesma and Bivand 2005; Bivand, Pebesma, and Gomez-Rubio 2013), tidyverse v. 2.0.0 (Wickham et al. 2019), tikzDevice v. 0.12.6 (Sharpsteen and Bracken 2023), viridis v. 0.6.5 (Garnier et al. 2024), xaringanExtra v. 0.8.0 (Aden-Buie and Warkentin 2024).

Aden-Buie, Garrick, and Matthew T. Warkentin. 2024. xaringanExtra: Extras and Extensions for xaringan Slides. https://doi.org/10.32614/CRAN.package.xaringanExtra.
Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 2025. rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Bachl, Fabian E., Finn Lindgren, David L. Borchers, and Janine B. Illian. 2019. inlabru: An R Package for Bayesian Spatial Modelling from Ecological Survey Data.” Methods in Ecology and Evolution 10: 760–66. https://doi.org/10.1111/2041-210X.13168.
Bakka, Haakon, Håvard Rue, Geir-Arne Fuglstad, Andrea I. Riebler, David Bolin, Janine Illian, Elias Krainski, Daniel P. Simpson, and Finn K. Lindgren. 2018. “Spatial Modelling with INLA: A Review.” WIRES (Invited Extended Review) xx (Feb): xx–. http://arxiv.org/abs/1802.06350.
Bates, Douglas, Martin Maechler, and Mikael Jagan. 2025. Matrix: Sparse and Dense Matrix Classes and Methods. https://doi.org/10.32614/CRAN.package.Matrix.
Bivand, Roger S., Edzer Pebesma, and Virgilio Gomez-Rubio. 2013. Applied Spatial Data Analysis with R, Second Edition. Springer, NY. https://asdar-book.org/.
Bolin, David, and Kristin Kirchner. 2020. “The Rational SPDE Approach for Gaussian Random Fields with General Smoothness.” Journal of Computational and Graphical Statistics 29 (2): 274–85. https://doi.org/10.1080/10618600.2019.1665537.
Bolin, David, Mihály Kovács, Vivek Kumar, and Alexandre B. Simas. 2024. “Regularity and Numerical Approximation of Fractional Elliptic Differential Equations on Compact Metric Graphs.” Mathematics of Computation 93 (349): 2439–72. https://doi.org/10.1090/mcom/3929.
Bolin, David, and Alexandre B. Simas. 2023. rSPDE: Rational Approximations of Fractional Stochastic Partial Differential Equations. https://CRAN.R-project.org/package=rSPDE.
Bolin, David, Alexandre B. Simas, and Jonas Wallin. 2023a. MetricGraph: Random Fields on Metric Graphs. https://CRAN.R-project.org/package=MetricGraph.
———. 2023b. “Statistical Inference for Gaussian Whittle-Matérn Fields on Metric Graphs.” arXiv Preprint arXiv:2304.10372. https://doi.org/10.48550/arXiv.2304.10372.
———. 2024. “Gaussian Whittle-Matérn Fields on Metric Graphs.” Bernoulli 30 (2): 1611–39. https://doi.org/10.3150/23-BEJ1647.
———. 2025. “Markov Properties of Gaussian Random Fields on Compact Metric Graphs.” Bernoulli. https://doi.org/10.48550/arXiv.2304.03190.
Bolin, David, Alexandre B. Simas, and Zhen Xiong. 2024. “Covariance-Based Rational Approximations of Fractional SPDEs for Computationally Efficient Bayesian Inference.” Journal of Computational and Graphical Statistics 33 (1): 64–74. https://doi.org/10.1080/10618600.2023.2231051.
Cheng, Joe, Carson Sievert, Barret Schloerke, Winston Chang, Yihui Xie, and Jeff Allen. 2024. htmltools: Tools for HTML. https://github.com/rstudio/htmltools.
De Coninck, Arne, Bernard De Baets, Drosos Kourounis, Fabio Verbosio, Olaf Schenk, Steven Maenhout, and Jan Fostier. 2016. Needles: Toward Large-Scale Genomic Prediction with Marker-by-Environment Interaction.” Genetics 203 (1): 543–55. https://doi.org/10.1534/genetics.115.179887.
Fellows, Ian, and Jan-Peter Stotz. 2025. OpenStreetMap: Access to Open Street Map Raster Images. https://doi.org/10.32614/CRAN.package.OpenStreetMap.
Garnier, Simon, Ross, Noam, Rudis, Robert, Camargo, et al. 2024. viridis(Lite) - Colorblind-Friendly Color Maps for r. https://doi.org/10.5281/zenodo.4679423.
Hester, Jim, and Jennifer Bryan. 2024. glue: Interpreted String Literals. https://glue.tidyverse.org/.
J, Lemon. 2006. Plotrix: A Package in the Red Light District of r.” R-News 6 (4): 8–12.
Kahle, David, and Hadley Wickham. 2013. ggmap: Spatial Visualization with Ggplot2.” The R Journal 5 (1): 144–61. https://journal.r-project.org/archive/2013-1/kahle-wickham.pdf.
Kassambara, Alboukadel. 2026. ggpubr: ggplot2 Based Publication Ready Plots. https://doi.org/10.32614/CRAN.package.ggpubr.
Kaye, Matt, Bob Rudis, Andrie de Vries, and Jonathan Sidi. 2025. slackr: Send Messages, Images, r Objects and Files to Slack Channels/Users. https://github.com/mrkaye97/slackr.
Kourounis, D., A. Fuchs, and O. Schenk. 2018. “Towards the Next Generation of Multiperiod Optimal Power Flow Solvers.” IEEE Transactions on Power Systems PP (99): 1–10. https://doi.org/10.1109/TPWRS.2017.2789187.
Lindgren, Finn, and Håvard Rue. 2015. “Bayesian Spatial Modelling with R-INLA.” Journal of Statistical Software 63 (19): 1–25. http://www.jstatsoft.org/v63/i19/.
Lindgren, Finn, Håvard Rue, and Johan Lindström. 2011. “An Explicit Link Between Gaussian Fields and Gaussian Markov Random Fields: The Stochastic Partial Differential Equation Approach (with Discussion).” Journal of the Royal Statistical Society B 73 (4): 423–98.
Martins, Thiago G., Daniel Simpson, Finn Lindgren, and Håvard Rue. 2013. “Bayesian Computing with INLA: New Features.” Computational Statistics and Data Analysis 67: 68–83.
Meschiari, Stefano. 2026. Latex2exp: Use LaTeX Expressions in Plots. https://doi.org/10.32614/CRAN.package.latex2exp.
Müller, Kirill. 2020. here: A Simpler Way to Find Your Files. https://doi.org/10.32614/CRAN.package.here.
Pebesma, Edzer. 2018. Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer J., and Roger Bivand. 2005. “Classes and Methods for Spatial Data in R.” R News 5 (2): 9–13. https://CRAN.R-project.org/doc/Rnews/.
Pebesma, Edzer, and Roger Bivand. 2023. Spatial Data Science: With applications in R. Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
Pedersen, Thomas Lin. 2025. patchwork: The Composer of Plots. https://doi.org/10.32614/CRAN.package.patchwork.
R Core Team. 2025a. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
———. 2025b. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Rue, Håvard, Sara Martino, and Nicholas Chopin. 2009. “Approximate Bayesian Inference for Latent Gaussian Models Using Integrated Nested Laplace Approximations (with Discussion).” Journal of the Royal Statistical Society B 71: 319–92.
Rue, Håvard, Andrea I. Riebler, Sigrunn H. Sørbye, Janine B. Illian, Daniel P. Simpson, and Finn K. Lindgren. 2017. “Bayesian Computing with INLA: A Review.” Annual Reviews of Statistics and Its Applications 4 (March): 395–421. http://arxiv.org/abs/1604.00860.
Sharpsteen, Charlie, and Cameron Bracken. 2023. tikzDevice: R Graphics Output in LaTeX Format. https://doi.org/10.32614/CRAN.package.tikzDevice.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.
Ushey, Kevin, JJ Allaire, and Yuan Tang. 2025. reticulate: Interface to Python. https://doi.org/10.32614/CRAN.package.reticulate.
Ushey, Kevin, and Hadley Wickham. 2026. renv: Project Environments. https://doi.org/10.32614/CRAN.package.renv.
Verbosio, Fabio, Arne De Coninck, Drosos Kourounis, and Olaf Schenk. 2017. “Enhancing the Scalability of Selected Inversion Factorization Algorithms in Genomic Prediction.” Journal of Computational Science 22 (Supplement C): 99–108. https://doi.org/10.1016/j.jocs.2017.08.013.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Thomas Lin Pedersen, and Dana Seidel. 2025. scales: Scale Functions for Visualization. https://scales.r-lib.org.
Wilke, Claus O. 2025. cowplot: Streamlined Plot Theme and Plot Annotations for ggplot2. https://doi.org/10.32614/CRAN.package.cowplot.
Wilke, Claus O., and Brenton M. Wiernik. 2022. ggtext: Improved Text Rendering Support for ggplot2. https://doi.org/10.32614/CRAN.package.ggtext.
Xie, Yihui. 2014. knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2025. knitr: A General-Purpose Package for Dynamic Report Generation in R. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
Yuan, Yuan, Bachl, Fabian E., Lindgren, Finn, Borchers, et al. 2017. “Point Process Models for Spatio-Temporal Distance Sampling Data from a Large-Scale Survey of Blue Whales.” Ann. Appl. Stat. 11 (4): 2270–97. https://doi.org/10.1214/17-AOAS1078.
LS0tCnRpdGxlOiAiS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zIgpkYXRlOiAiTGFzdCBtb2RpZmllZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWS4nKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgbWF0aGpheDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbWF0aGpheEAzL2VzNS90ZXgtbW1sLWNodG1sLmpzIgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdGhlbWU6IGZsYXRseQogICAgY29kZV9mb2xkaW5nOiBoaWRlICMgY2xhc3Muc291cmNlID0gImZvbGQtaGlkZSIgdG8gaGlkZSBjb2RlIGFuZCBhZGQgYSBidXR0b24gdG8gc2hvdyBpdAogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNzczogdmlzdWFsLmNzcwphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQpiaWJsaW9ncmFwaHk6IAogIC0gcmVmZXJlbmNlcy5iaWIKICAtIGdyYXRlZnVsLXJlZnMuYmliCmhlYWRlci1pbmNsdWRlczoKICAtIFxuZXdjb21tYW5ke1xhcn17XG1hdGhiYntSfX0KICAtIFxuZXdjb21tYW5ke1xsbGF2fVsxXXtcbGVmdFx7IzFccmlnaHRcfX0KICAtIFxuZXdjb21tYW5ke1xwYXJlfVsxXXtcbGVmdCgjMVxyaWdodCl9CiAgLSBcbmV3Y29tbWFuZHtcTmNhbH17XG1hdGhjYWx7Tn19CiAgLSBcbmV3Y29tbWFuZHtcVmNhbH17XG1hdGhjYWx7Vn19CiAgLSBcbmV3Y29tbWFuZHtcRWNhbH17XG1hdGhjYWx7RX19CiAgLSBcbmV3Y29tbWFuZHtcV2NhbH17XG1hdGhjYWx7V319CiAgLSBcbmV3Y29tbWFuZHtcYWxtb3N0ZXZlcnl3aGVyZX17XG1hdGhybXthLmUufVw7fQotLS0KCkdvIGJhY2sgdG8gdGhlIFtDb250ZW50c10oYWJvdXQuaHRtbCkgcGFnZS4KCjxkaXYgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyB0ZXh0LWFsaWduOiByaWdodDsiPgoqKioqKioqKiAgCjxzdHJvbmc+UHJlc3MgU2hvdyB0byByZXZlYWwgdGhlIGNvZGUgY2h1bmtzLjwvc3Ryb25nPiAgCgoqKioqKioqKgo8L2Rpdj4KCgpgYGB7cn0KIyBDcmVhdGUgYSBjbGlwYm9hcmQgYnV0dG9uIG9uIHRoZSByZW5kZXJlZCBIVE1MIHBhZ2UKc291cmNlKGhlcmU6OmhlcmUoImNsaXBib2FyZC5SIikpOyBjbGlwYm9hcmQKIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDE5ODIpIAojIFNldCBnbG9iYWwgb3B0aW9ucyBmb3IgYWxsIGNvZGUgY2h1bmtzCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAjIERpc2FibGUgbWVzc2FnZXMgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAKICAjIERpc2FibGUgd2FybmluZ3MgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAKICAjIFNob3cgUiBjb2RlIHdpdGhpbiBjb2RlIGNodW5rcyBpbiBvdXRwdXQKICBlY2hvID0gVFJVRSwgICAgICAgIAogICMgSW5jbHVkZSBib3RoIFIgY29kZSBhbmQgaXRzIHJlc3VsdHMgaW4gb3V0cHV0CiAgaW5jbHVkZSA9IFRSVUUsICAgICAKICAjIEV2YWx1YXRlIFIgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgIAogICMgRW5hYmxlIGNhY2hpbmcgb2YgUiBjb2RlIGNodW5rcyBmb3IgZmFzdGVyIHJlbmRlcmluZwogIGNhY2hlID0gRkFMU0UsICAgICAgCiAgIyBBbGlnbiBmaWd1cmVzIGluIHRoZSBjZW50ZXIgb2YgdGhlIG91dHB1dAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogICMgRW5hYmxlIHJldGluYSBkaXNwbGF5IGZvciBoaWdoLXJlc29sdXRpb24gZmlndXJlcwogIHJldGluYSA9IDIsCiAgIyBTaG93IGVycm9ycyBpbiB0aGUgb3V0cHV0IGluc3RlYWQgb2Ygc3RvcHBpbmcgcmVuZGVyaW5nCiAgZXJyb3IgPSBUUlVFLAogICMgRG8gbm90IGNvbGxhcHNlIGNvZGUgYW5kIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrCiAgY29sbGFwc2UgPSBGQUxTRQopCiMgU3RhcnQgdGhlIGZpZ3VyZSBjb3VudGVyCmZpZ19jb3VudCA8LSAwCiMgRGVmaW5lIHRoZSBjYXB0aW9uZXIgZnVuY3Rpb24KY2FwdGlvbmVyIDwtIGZ1bmN0aW9uKGNhcHRpb24pIHsKICBmaWdfY291bnQgPDwtIGZpZ19jb3VudCArIDEKICBwYXN0ZTAoIkZpZ3VyZSAiLCBmaWdfY291bnQsICI6ICIsIGNhcHRpb24pCn0KCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFfQpsaWJyYXJ5KE1ldHJpY0dyYXBoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KHNsYWNrcikKc291cmNlKCJrZXlzLlIiKQpzbGFja3Jfc2V0dXAodG9rZW4gPSB0b2tlbikgIyB0b2tlbiBjb21lcyBmcm9tIGtleXMuUgpgYGAKCgpgYGB7cn0KY2FwdHVyZS5vdXRwdXQoCiAga25pdHI6OnB1cmwoaGVyZTo6aGVyZSgiZnVuY3Rpb25hbGl0eTEuUm1kIiksIG91dHB1dCA9IGhlcmU6OmhlcmUoImZ1bmN0aW9uYWxpdHkxLlIiKSksCiAgZmlsZSA9IGhlcmU6OmhlcmUoIm9sZC9wdXJsX2xvZy50eHQiKQopCnNvdXJjZShoZXJlOjpoZXJlKCJmdW5jdGlvbmFsaXR5MS5SIikpCmBgYAoKCmBgYHtyfQphcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0IDwtIGZ1bmN0aW9uKGdyYXBoLCBmX2xpc3QpIHsKICAKICBpZiAobGVuZ3RoKGZfbGlzdCkgIT0gZ3JhcGgkbkUpIHsKICAgIHN0b3Aoc3ByaW50ZigKICAgICAgIk51bWJlciBvZiBmdW5jdGlvbnMgKCVkKSBtdXN0IGVxdWFsIG51bWJlciBvZiBlZGdlcyAoJWQpLiIsCiAgICAgIGxlbmd0aChmX2xpc3QpLCBncmFwaCRuRQogICAgKSkKICB9CiAgVnRFIDwtIGdyYXBoJG1lc2gkVnRFCiAgZWRnZV9sZW5ndGhzIDwtIGdyYXBoJGVkZ2VfbGVuZ3RocwogIAogIGVkZ2UgICA8LSBWdEVbLDFdCiAgc19ub3JtIDwtIFZ0RVssMl0KICBzX3RydWUgPC0gc19ub3JtICogZWRnZV9sZW5ndGhzW2VkZ2VdCgogIG91dCA8LSBzYXBwbHkoc2VxX2xlbihucm93KFZ0RSkpLCBmdW5jdGlvbihpKSBmX2xpc3RbW2VkZ2VbaV1dXShzX3RydWVbaV0pKQogIHJldHVybihvdXQpCn0KYGBgCgoKYGBge3J9Cm15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zIDwtIGZ1bmN0aW9uKGdyYXBoLCBmX2xpc3QsIGVsbDEsIGVsbDIsIGgpewogIGwxX21lc2ggPC0gc2VxKDAsIGVsbDEsIGJ5ID0gaCkKICBsMl9tZXNoIDwtIHNlcSgwLCBlbGwyLCBieSA9IGgpCiAgZjEgPC0gZl9saXN0W1sxXV0obDFfbWVzaCkKICBmMiA8LSBmX2xpc3RbWzJdXShsMl9tZXNoKQogIGwxX21lc2hfbm9ybSA8LSBsMV9tZXNoL2VsbDEKICBsMl9tZXNoX25vcm0gPC0gbDJfbWVzaC9lbGwyCiAgUHRFMSA8LSBjYmluZChyZXAoMSwgbGVuZ3RoKGwxX21lc2gpKSwgbDFfbWVzaF9ub3JtKQogIFB0RTIgPC0gY2JpbmQocmVwKDIsIGxlbmd0aChsMl9tZXNoKSksIGwyX21lc2hfbm9ybSkKICBYWTEgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMSkKICBYWTIgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMikKICBERjEgPC0gZGF0YS5mcmFtZSh4ID0gWFkxWywxXSwgeSA9IFhZMVssMl0sIHogPSBmMSkKICBERjIgPC0gZGF0YS5mcmFtZSh4ID0gWFkyWywxXSwgeSA9IFhZMlssMl0sIHogPSBmMikKICBERiA8LSByYmluZChERjEsIHJlcChOQSwgMyksIERGMikKICByZXR1cm4obGlzdChERiA9IERGKSkKfQpgYGAKCgojIEV4YW1wbGUgb2YgYSBmdW5jdGlvbiAkaFxpbiBDXjEoXEdhbW1hKVxjYXAgXG1hdGhjYWx7S30oXEdhbW1hKSQgd2hlcmUgJGgnJCBsb29rcyBkaXNjb250aW51b3VzCgoKTGV0IHVzIGNvbnNpZGVyIHRoZSAkMiQtc3RhciBncmFwaCAkXEdhbW1hID0gKFxtYXRoY2Fse1Z9LCBcbWF0aGNhbHtFfSkkLCB3aGVyZSAkXG1hdGhjYWx7Vn0gPSBce3ZfMCwgdl8xLCB2XzJcfSQgYW5kICRcbWF0aGNhbHtFfSA9IFx7ZV8xLCBlXzJcfSQuIEVhY2ggZWRnZSAkZV9pJCBoYXMgY29tbW9uIGxlbmd0aCAkXGVsbCQgYW5kIGNvbm5lY3RzIHRoZSBjZW50cmFsIHZlcnRleCAkdl8wJCB0byB0aGUgb3V0ZXIgdmVydGV4ICR2X2kkIGZvciAkaT0xLDIkIGluIHN1Y2ggYSB3YXkgdGhhdCAkdl8wID0gXHVuZGVybGluZXtlXzF9ID0gXHVuZGVybGluZXtlXzJ9JC4gT24gJFxHYW1tYSQsIHdlIGRlZmluZSB0aGUgZnVuY3Rpb24gJGggPSBce2hfZVx9X3tlXGluXG1hdGhjYWx7RX19JCB2aWEKCiQkCmhfe2VfMX0ocykgPSBhICsgYl8xIHMgLSBcZnJhY3tiXzEgc14zfXszXGVsbF4yfSwgXHF1YWQgaF97ZV8yfShzKSA9IGEgKyBiXzIgcyAtIFxmcmFje2JfMiBzXjN9ezNcZWxsXjJ9LgokJApDbGVhcmx5LCAkaCQgaXMgYSBjb250aW51b3VzIGZ1bmN0aW9uIChzZWUgRmlndXJlIDkpIHNpbmNlCiQkCmhfe2VfMX0oMCkgPSBoX3tlXzJ9KHMpID0gYS4KJCQKVGhlIGRlcml2YXRpdmUgJGgnID0gXHtoJ19lXH1fe2VcaW5cbWF0aGNhbHtFfX0kIG9mICRoJCBvbiBlYWNoIGVkZ2UgaXMgZ2l2ZW4gYnkKCiQkCmhfe2VfMX0nKHMpID0gYl8xIC0gXGZyYWN7Yl8xIHNeMn17XGVsbF4yfSwgXHF1YWQgaF97ZV8yfScocykgPSBiXzIgLSBcZnJhY3tiXzIgc14yfXtcZWxsXjJ9LgokJApCeSBjaG9vc2luZyAkYl8xPTEkIGFuZCAkYl8yPS0xJCwgd2UgaGF2ZSB0aGF0IAokJApoX3tlXzF9JygwKStoX3tlXzJ9JygwKSA9IGJfMStiXzI9MFxxdWFkXHRleHR7IGFuZCB9XHF1YWQgaF97ZV8xfScoXGVsbCkgPWhfe2VfMn0nKFxlbGwpID0gMCwKJCQKc28gdGhhdCAkaCQgc2F0aXNmaWVzIHRoZSBLaXJjaGhvZmYgY29uZGl0aW9ucyBhdCBldmVyeSB2ZXJ0ZXguIFRoaXMgbWVhbnMgdGhhdCAkaCckIHNob3VsZCBiZSBhIGNvbnRpbnVvdXMgZnVuY3Rpb24uIEhvd2V2ZXIsIEZpZ3VyZSAxMCBzaG93cyB0aGF0ICRoJyQgaXMgZGlzY29udGludW91cy4gVGhpcyBpcyBhY3R1YWxseSBhbiBhcnRlZmFjdCBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgZWRnZXMgYXJlIG5vdCBjb21wYXRpYmxlIG9yaWVudGVkLiBGb3IgYSBkaXNjdXNzaW9uIGFib3V0IGNvbXBhdGlibGUgb3JpZW50YXRpb24sIGdvIHRvIHRoaXMgW3BhZ2VdKGdyYXBoczMuaHRtbCkuCgoKYGBge3J9CmggPSAwLjAyCgp4X2V5ZSA8LSA1IzgKeV9leWUgPC0gLTEjLTIKel9leWUgPC0gMiMzCmBgYAoKCmBgYHtyfQpteV9sZW5ndGggPC0gMgplZGdlcyA8LWxpc3QoKQplZGdlc1tbMV1dIDwtIHJiaW5kKGMoLW15X2xlbmd0aCwgMCksIGMoMCwgMCkpCmVkZ2VzW1syXV0gPC0gcmJpbmQoYygwLCAwKSwgYyhteV9sZW5ndGgsIDApKQpncmFwaCA8LSBtZXRyaWNfZ3JhcGgkbmV3KGVkZ2VzID0gZWRnZXMpCmdyYXBoJGJ1aWxkX21lc2goaCA9IGgpCmBgYAoKCgpgYGB7cn0KZTFfaW5pX3ggPC0gZWRnZXNbWzFdXVsxLDFdOyBlMV9pbmlfeSA8LSBlZGdlc1tbMV1dWzEsMl07IGUxX2luaV96IDwtIDAKZTFfZmluX3ggPC0gZWRnZXNbWzFdXVsyLDFdOyBlMV9maW5feSA8LSBlZGdlc1tbMV1dWzIsMl07IGUxX2Zpbl96IDwtIDAKCiMgTWlkcG9pbnQKeG0xIDwtIChlMV9maW5feCArIGUxX2luaV94KS8yCnltMSA8LSAoZTFfZmluX3kgKyBlMV9pbmlfeSkvMgp6bTEgPC0gKGUxX2Zpbl96ICsgZTFfaW5pX3opLzIKCiMgRGlyZWN0aW9uIHZlY3RvcgpkeDEgPC0gZTFfZmluX3ggLSBlMV9pbmlfeApkeTEgPC0gZTFfZmluX3kgLSBlMV9pbmlfeQpkejEgPC0gZTFfZmluX3ogLSBlMV9pbmlfegoKZTJfaW5pX3ggPC0gZWRnZXNbWzJdXVsxLDFdOyBlMl9pbmlfeSA8LSBlZGdlc1tbMl1dWzEsMl07IGUyX2luaV96IDwtIDAKZTJfZmluX3ggPC0gZWRnZXNbWzJdXVsyLDFdOyBlMl9maW5feSA8LSBlZGdlc1tbMl1dWzIsMl07IGUyX2Zpbl96IDwtIDAKCiMgTWlkcG9pbnQKeG0yIDwtIChlMl9maW5feCArIGUyX2luaV94KS8yCnltMiA8LSAoZTJfZmluX3kgKyBlMl9pbmlfeSkvMgp6bTIgPC0gKGUyX2Zpbl96ICsgZTJfaW5pX3opLzIKCiMgRGlyZWN0aW9uIHZlY3RvcgpkeDIgPC0gZTJfZmluX3ggLSBlMl9pbmlfeApkeTIgPC0gZTJfZmluX3kgLSBlMl9pbmlfeQpkejIgPC0gZTJfZmluX3ogLSBlMl9pbmlfegoKCnNpemVyZWYgPC0gMC4zCmBgYAoKCmBgYHtyfQojIEdlbmVyYWwgcGFyYW1ldGVycwpMIDwtIG15X2xlbmd0aCAgICAgICAgICAgICAjIGVkZ2UgbGVuZ3RoCmEgPC0gMSAgICAgICAgICAgICAjIHZhbHVlIGF0IGNlbnRyYWwgdmVydGV4CmIgPC0gYygtMSwgMSkgICAjIGIxK2IyK2IzIG11c3QgYmUgMAoKZjEgPC0gZnVuY3Rpb24ocykgYSArIGJbMV0qKEwtcykgLSBiWzFdKihMLXMpXjMvKDMqTF4yKQpmMiA8LSBmdW5jdGlvbihzKSBhICsgYlsyXSpzIC0gYlsyXSpzXjMvKDMqTF4yKQoKCmRmMSA8LSBmdW5jdGlvbihzKSAtYlsxXSArIGJbMV0qKEwtcyleMi9MXjIKZGYyIDwtIGZ1bmN0aW9uKHMpIGJbMl0gLSBiWzJdKnNeMi9MXjIKCmRkZjEgPC0gZnVuY3Rpb24ocykgLTIqYlsxXSooTC1zKS9MXjIKZGRmMiA8LSBmdW5jdGlvbihzKSAtMipiWzJdKnMvTF4yCgpkZGRmMSA8LSBmdW5jdGlvbihzKSAyKmJbMV0vTF4yCmRkZGYyIDwtIGZ1bmN0aW9uKHMpIC0yKmJbMl0vTF4yCgoKZl9saXN0IDwtIGxpc3QoZjEsIGYyKQpkZl9saXN0IDwtIGxpc3QoZGYxLCBkZjIpCmRkZl9saXN0IDwtIGxpc3QoZGRmMSwgZGRmMikKZGRkZl9saXN0IDwtIGxpc3QoZGRkZjEsIGRkZGYyKQoKZl9saXN0X2F1eCA8LSBmX2xpc3QKZGZfbGlzdF9hdXggPC0gZGZfbGlzdApkZGZfbGlzdF9hdXggPC0gZGRmX2xpc3QKZGRkZl9saXN0X2F1eCA8LSBkZGRmX2xpc3QKCmYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZl9saXN0KQpkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZl9saXN0KQpkZGYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGRmX2xpc3QpCmRkZGYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGRkZl9saXN0KQoKCmBgYAoKCgpgYGB7cn0KcGhrb2sgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZiwgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZiIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpwZGhrb2sgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+IAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImYnIiksIHkgPSAwLjgpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfZmluX3ksIHkgPSBlMl9maW5feCwgeiA9IGUyX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKcGRkaGtvayA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+IAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImYnJyIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCnBkZGRoa29rIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+IAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImYnJyciKSwgeSA9IDAuOCksIAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc2F2ZShwaGtvaywgZmlsZSA9IGhlcmU6OmhlcmUoImhfa2lyY2hob2ZmLlJEYXRhIikpCnNhdmUocGRoa29rLCBmaWxlID0gaGVyZTo6aGVyZSgiZGhfa2lyY2hob2ZmLlJEYXRhIikpCnNhdmUocGRkaGtvaywgZmlsZSA9IGhlcmU6OmhlcmUoImRkaF9raXJjaGhvZmYuUkRhdGEiKSkKc2F2ZShwZGRkaGtvaywgZmlsZSA9IGhlcmU6OmhlcmUoImRkZGhfa2lyY2hob2ZmLlJEYXRhIikpCgpgYGAKCgpGb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCBGaWd1cmUgMTEgYW5kIDEyIHNob3dzICRoJyckIGFuZCAkaCcnJyQuCgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoID0gXFx7aF9lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoX3tlX2l9KHMpID0gYSArIGJfaSBzIC0gXFxkZnJhY3tiX2kgc14zfXszXFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImhfa2lyY2hob2ZmLlJEYXRhIikpCnBoa29rCmBgYAoKCjo6OgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJyA9IFxce2gnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnX3tlX2l9KHMpID0gYl9pIC0gXFxkZnJhY3tiX2kgc14yfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGhfa2lyY2hob2ZmLlJEYXRhIikpCnBkaGtvawpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcnID0gXFx7aCcnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnJ197ZV9pfShzKSA9ICAtIFxcZGZyYWN7MiBiX2kgc317XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRkaF9raXJjaGhvZmYuUkRhdGEiKSkKcGRkaGtvawpgYGAKCgo6OjoKCgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJycgPSBcXHtoJycnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGRkaF9raXJjaGhvZmYuUkRhdGEiKSkKcGRkZGhrb2sKYGBgCgoKOjo6CgoKOjo6OgoKCiMgRmxpcCAkZV8yJAoKCgoKYGBge3J9CmVkZ2VzIDwtbGlzdCgpCmVkZ2VzW1sxXV0gPC0gcmJpbmQoYygtbXlfbGVuZ3RoLCAwKSwgYygwLCAwKSkKZWRnZXNbWzJdXSA8LSByYmluZChjKDAsIDApLCBjKG15X2xlbmd0aCwgMCkpWzI6MSxdCgpncmFwaCA8LSBtZXRyaWNfZ3JhcGgkbmV3KGVkZ2VzID0gZWRnZXMpCmdyYXBoJGJ1aWxkX21lc2goaCA9IGgpCmBgYAoKCgpgYGB7cn0KZTFfaW5pX3ggPC0gZWRnZXNbWzFdXVsxLDFdOyBlMV9pbmlfeSA8LSBlZGdlc1tbMV1dWzEsMl07IGUxX2luaV96IDwtIDAKZTFfZmluX3ggPC0gZWRnZXNbWzFdXVsyLDFdOyBlMV9maW5feSA8LSBlZGdlc1tbMV1dWzIsMl07IGUxX2Zpbl96IDwtIDAKCiMgTWlkcG9pbnQKeG0xIDwtIChlMV9maW5feCArIGUxX2luaV94KS8yCnltMSA8LSAoZTFfZmluX3kgKyBlMV9pbmlfeSkvMgp6bTEgPC0gKGUxX2Zpbl96ICsgZTFfaW5pX3opLzIKCiMgRGlyZWN0aW9uIHZlY3RvcgpkeDEgPC0gZTFfZmluX3ggLSBlMV9pbmlfeApkeTEgPC0gZTFfZmluX3kgLSBlMV9pbmlfeQpkejEgPC0gZTFfZmluX3ogLSBlMV9pbmlfegoKZTJfaW5pX3ggPC0gZWRnZXNbWzJdXVsxLDFdOyBlMl9pbmlfeSA8LSBlZGdlc1tbMl1dWzEsMl07IGUyX2luaV96IDwtIDAKZTJfZmluX3ggPC0gZWRnZXNbWzJdXVsyLDFdOyBlMl9maW5feSA8LSBlZGdlc1tbMl1dWzIsMl07IGUyX2Zpbl96IDwtIDAKCiMgTWlkcG9pbnQKeG0yIDwtIChlMl9maW5feCArIGUyX2luaV94KS8yCnltMiA8LSAoZTJfZmluX3kgKyBlMl9pbmlfeSkvMgp6bTIgPC0gKGUyX2Zpbl96ICsgZTJfaW5pX3opLzIKCiMgRGlyZWN0aW9uIHZlY3RvcgpkeDIgPC0gZTJfZmluX3ggLSBlMl9pbmlfeApkeTIgPC0gZTJfZmluX3kgLSBlMl9pbmlfeQpkejIgPC0gZTJfZmluX3ogLSBlMl9pbmlfegpgYGAKCgpgYGB7cn0KZjEgPC0gZnVuY3Rpb24ocykgYSArIGJbMV0qKEwtcykgLSBiWzFdKihMLXMpXjMvKDMqTF4yKQpmMiA8LSBmdW5jdGlvbihzKSBhICsgYlsyXSooTC1zKSAtIGJbMl0qKEwtcyleMy8oMypMXjIpCgoKZGYxIDwtIGZ1bmN0aW9uKHMpIC1iWzFdICsgYlsxXSooTC1zKV4yL0xeMgpkZjIgPC0gZnVuY3Rpb24ocykgLWJbMl0gKyBiWzJdKihMLXMpXjIvTF4yCgpkZGYxIDwtIGZ1bmN0aW9uKHMpIC0yKmJbMV0qKEwtcykvTF4yCmRkZjIgPC0gZnVuY3Rpb24ocykgLTIqYlsyXSooTC1zKS9MXjIKCmRkZGYxIDwtIGZ1bmN0aW9uKHMpIDIqYlsxXS9MXjIKZGRkZjIgPC0gZnVuY3Rpb24ocykgMipiWzJdL0xeMgoKCmZfbGlzdCA8LSBsaXN0KGYxLCBmMikKZGZfbGlzdCA8LSBsaXN0KGRmMSwgZGYyKQpkZGZfbGlzdCA8LSBsaXN0KGRkZjEsIGRkZjIpCmRkZGZfbGlzdCA8LSBsaXN0KGRkZGYxLCBkZGRmMikKCmYgPC0gbXlfYXBwbHlfZWRnZV9mdW5jdGlvbnMoZ3JhcGgsIGZfbGlzdCwgTCwgTCwgaCkKZGYgPC0gbXlfYXBwbHlfZWRnZV9mdW5jdGlvbnMoZ3JhcGgsIGRmX2xpc3QsIEwsIEwsIGgpCmRkZiA8LSBteV9hcHBseV9lZGdlX2Z1bmN0aW9ucyhncmFwaCwgZGRmX2xpc3QsIEwsIEwsIGgpCmRkZGYgPC0gbXlfYXBwbHlfZWRnZV9mdW5jdGlvbnMoZ3JhcGgsIGRkZGZfbGlzdCwgTCwgTCwgaCkKCmZfYXV4IDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBmX2xpc3RfYXV4LCBMLCBMLCBoKQpkZl9hdXggPC0gbXlfYXBwbHlfZWRnZV9mdW5jdGlvbnMoZ3JhcGgsIGRmX2xpc3RfYXV4LCBMLCBMLCBoKQpkZGZfYXV4IDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBkZGZfbGlzdF9hdXgsIEwsIEwsIGgpCmRkZGZfYXV4IDwtIG15X2FwcGx5X2VkZ2VfZnVuY3Rpb25zKGdyYXBoLCBkZGRmX2xpc3RfYXV4LCBMLCBMLCBoKQoKYGBgCgpgYGB7cn0KcF9iYXNlIDwtIGdyYXBoJHBsb3QodmVydGV4X3NpemUgPSBnc3csIGVkZ2VfY29sb3IgPSAiYmxhY2siLCBlZGdlX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpCkRGIDwtIGYkREYKcGZraXJvayA8LSBwX2Jhc2UgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfaW5pX3ksIHkgPSBlMl9pbmlfeCwgeiA9IGUyX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKREYgPC0gZGYkREYKcGRma2lyb2sgPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJnJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCkRGIDwtIGRkZiRERgpwZGRma2lyb2sgPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJnJyciKSwgeSA9IDAuOCksIAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2luaV95LCB5ID0gZTJfaW5pX3gsIHogPSBlMl9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKREYgPC0gZGRkZiRERgpwZGRkZmtpcm9rIDwtIHBfYmFzZSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZycnJyIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfaW5pX3ksIHkgPSBlMl9pbmlfeCwgeiA9IGUyX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzYXZlKHBma2lyb2ssIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3Bma2lyb2suUmRhdGEiKSkKc2F2ZShwZGZraXJvaywgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRma2lyb2suUmRhdGEiKSkKc2F2ZShwZGRma2lyb2ssIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGZraXJvay5SZGF0YSIpKQpzYXZlKHBkZGRma2lyb2ssIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGRma2lyb2suUmRhdGEiKSkKYGBgCgoKCjo6Ojoge3N0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4NXB4IDQ4NXB4IDQ4NXB4IDQ4NXB4OyBncmlkLWNvbHVtbi1nYXA6IDBweDsifQoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCA9IFxce2hfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaF97ZV9pfShzKSA9IGEgKyBiX2kgcyAtIFxcZGZyYWN7Yl9pIHNeM317M1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3Bma2lyb2suUmRhdGEiKSkKcGZraXJvawpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcgPSBcXHtoJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJ197ZV9pfShzKSA9IGJfaSAtIFxcZGZyYWN7Yl9pIHNeMn17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRma2lyb2suUmRhdGEiKSkKcGRma2lyb2sKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJyA9IFxce2gnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pIHN9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGZraXJvay5SZGF0YSIpKQpwZGRma2lyb2sKYGBgCgoKOjo6CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJycnID0gXFx7aCcnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJycnX3tlX2l9KHMpID0gIC0gXFxkZnJhY3syIGJfaX17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGZraXJvay5SZGF0YSIpKQpwZGRkZmtpcm9rCmBgYAoKCjo6OgoKCjo6OjoKCgojIEFkZGl0aW9uYWwgcGxvdHMKCmBgYHtyfQpERiA8LSBmX2F1eCRERgpwZl9hdXggPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJcXGhhdHtmfSIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKREYgPC0gZGZfYXV4JERGCnBkZl9hdXggPC0gcF9iYXNlIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogICAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJcXGhhdHtmfSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2luaV95LCB5ID0gZTFfaW5pX3gsIHogPSBlMV9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfaW5pX3ksIHkgPSBlMl9pbmlfeCwgeiA9IGUyX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpERiA8LSBkZGZfYXV4JERGCnBkZGZfYXV4IDwtIHBfYmFzZSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiXFxoYXR7Zn0nJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfaW5pX3ksIHkgPSBlMV9pbmlfeCwgeiA9IGUxX2luaV96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9pbmlfeSwgeSA9IGUyX2luaV94LCB6ID0gZTJfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCkRGIDwtIGRkZGZfYXV4JERGCnBkZGRmX2F1eCA8LSBwX2Jhc2UgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoIlxcaGF0e2Z9JycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9pbmlfeSwgeSA9IGUxX2luaV94LCB6ID0gZTFfaW5pX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2luaV95LCB5ID0gZTJfaW5pX3gsIHogPSBlMl9pbmlfeiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCgpzYXZlKHBmX2F1eCwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGZfYXV4Mi5SZGF0YSIpKQpzYXZlKHBkZl9hdXgsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZl9hdXgyLlJkYXRhIikpCnNhdmUocGRkZl9hdXgsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3BkZGZfYXV4Mi5SZGF0YSIpKQpzYXZlKHBkZGRmX2F1eCwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGZfYXV4Mi5SZGF0YSIpKQpgYGAKCgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRmID0gXFx7Zl9lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmX3tlXzF9KHQpID0gdF40JCBhbmQgJGZfe2VfMn0odCkgPSAodCtcXGVsbF8xKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJoX2tpcmNoaG9mZi5SRGF0YSIpKQpwaGtvawpgYGAKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRcXGhhdHtmfSA9IFxce2ZfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZl97ZV8xfSh0KSA9IHReNCQgYW5kICRmX3tcXGhhdHtlfV8yfSh0KSA9ICh0K1xcZWxsXzEpXjQkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGZfYXV4Mi5SZGF0YSIpKQpwZl9hdXgKYGBgCgo6OjoKCjo6OiB7fQoKYGBge3IsIGV2YWw9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRnID0gXFx7Z19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnX3tlXzF9KFxcdGF1KSA9IFxcdGF1XjQkIGFuZCAkZ197XFxoYXR7ZX1fMn0oXFx0YXUpID0gKFxcdGF1LShcXGVsbF8xK1xcZWxsXzIpKV40JC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3Bma2lyb2suUmRhdGEiKSkKcGZraXJvawpgYGAKCjo6OgoKOjo6OgoKCiMgRm9yICRcaGF0e2Z9JAoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRcXGhhdHtmfSA9IFxce2ZfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZl97ZV8xfSh0KSA9IHReNCQgYW5kICRmX3tcXGhhdHtlfV8yfSh0KSA9ICh0K1xcZWxsXzEpXjQkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGZfYXV4Mi5SZGF0YSIpKQpwZl9hdXgKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID0gVFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJFxcaGF0e2Z9JyA9IFxce2YnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnX3tlXzF9KHQpID0gNHReMyQgYW5kICRmJ197XFxoYXR7ZX1fMn0odCkgPSA0KHQrXFxlbGxfMSleMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9wZGZfYXV4Mi5SZGF0YSIpKQpwZGZfYXV4CmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRcXGhhdHtmfScnID0gXFx7ZicnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnJ197ZV8xfSh0KSA9IDEydF4yJCBhbmQgJGYnJ197XFxoYXR7ZX1fMn0odCkgPSAxMih0K1xcZWxsXzEpXjIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZl9hdXgyLlJkYXRhIikpCnBkZGZfYXV4CmBgYAoKOjo6CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9IFRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRcXGhhdHtmfScnJyA9IFxce2YnJydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZicnJ197ZV8xfSh0KSA9IDI0dCQgYW5kICRmJycnX3tcXGhhdHtlfV8yfSh0KSA9IDI0KHQrXFxlbGxfMSkkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvcGRkZGZfYXV4Mi5SZGF0YSIpKQpwZGRkZl9hdXgKYGBgCgoKOjo6Cgo6Ojo6CgoKCgoKIyBSZWZlcmVuY2VzCgpgYGB7ciwgZXZhbCA9VFJVRX0KZ3JhdGVmdWw6OmNpdGVfcGFja2FnZXMob3V0cHV0ID0gInBhcmFncmFwaCIsIG91dC5kaXIgPSAiLiIpCmBgYAoK