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"))
edges_roots_of_unity <- function(n, length = 10) {
  x_coords <- cos(2 * pi * (0:(n-1)) / n)
  y_coords <- sin(2 * pi * (0:(n-1)) / n)
  return(lapply(1:n, function(i) {rbind(c(0, 0), c(length*x_coords[i], length*y_coords[i]))}))
}
n <- 3
my_length <- 2
edges <-edges_roots_of_unity(n, length = my_length)
#edges[[1]] <- edges[[1]][2:1,]
graph <- metric_graph$new(edges = edges)
graph_disc <- graph$clone()
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

e3_ini_x <- edges[[3]][1,1]; e3_ini_y <- edges[[3]][1,2]; e3_ini_z <- 0
e3_fin_x <- edges[[3]][2,1]; e3_fin_y <- edges[[3]][2,2]; e3_fin_z <- 0

# Midpoint
xm3 <- (e3_fin_x + e3_ini_x)/2
ym3 <- (e3_fin_y + e3_ini_y)/2
zm3 <- (e3_fin_z + e3_ini_z)/2

# Direction vector
dx3 <- e3_fin_x - e3_ini_x
dy3 <- e3_fin_y - e3_ini_y
dz3 <- e3_fin_z - e3_ini_z

e4_ini_x <- 0; e4_ini_y <- 0; e4_ini_z <- 0
e4_fin_x <- -my_length; e4_fin_y <- 0; e4_fin_z <- 0

# Midpoint
xm4 <- (e4_fin_x + e4_ini_x)/2
ym4 <- (e4_fin_y + e4_ini_y)/2
zm4 <- (e4_fin_z + e4_ini_z)/2

# Direction vector
dx4 <- e4_fin_x - e4_ini_x
dy4 <- e4_fin_y - e4_ini_y
dz4 <- e4_fin_z - e4_ini_z

sizeref <- 0.2
h = 0.02
graph$build_mesh(h = h)
graph_disc$build_mesh(h = h, continuous = FALSE)
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]
  
  # s_true <- ifelse(graph$edge_orientation[edge] == -1,
  #                edge_lengths[edge] * (1 - s_norm),
  #                edge_lengths[edge] * s_norm)

  
  # out <- numeric(length(edge))
  # for (e in seq_len(graph$nE)) {
  #   idx <- which(edge == e)
  #   out[idx] <- f_list[[e]](s_true[idx])
  # }
  # return(out)
  out <- sapply(seq_len(nrow(VtE)), function(i) f_list[[edge[i]]](s_true[i]))
  return(out)
}

1 Example of a function \(f\in C(\Gamma)\cap \mathcal{K}(\Gamma)\setminus C^1(\Gamma)\)

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

\[ f_{e_1}(s) = a + b_1 s - \frac{b_1 s^3}{3\ell^2}, \quad f_{e_2}(s) = a + b_2 s - \frac{b_2 s^3}{3\ell^2}, \quad f_{e_3}(s) = a + b_3 s - \frac{b_3 s^3}{3\ell^2}, \]

where \(a\) (to be chosen) is the value of \(f\) at the central vertex and \(b_1, b_2, b_3\) are constants (to be chosen) such that \(b_1 + b_2 + b_3 = 0\). Clearly, \(f\) is a continuous function since

\[ f_{e_1}(0) = f_{e_2}(0) = f_{e_3}(0) = a. \]

The derivative \(f' = \{f'_e\}_{e\in\mathcal{E}}\) of \(f\) on each edge is given by

\[ f_{e_1}'(s) = b_1 - \frac{b_1 s^2}{\ell^2}, \quad f_{e_2}'(s) = b_2 - \frac{b_2 s^2}{\ell^2}, \quad f_{e_3}'(s) = b_3 - \frac{b_3 s^2}{\ell^2}. \] Since \(f_{e_1}'(0) = b_1\), \(f_{e_2}'(0) = b_2\) and \(f_{e_3}'(0) = b_3\), we can choose \(b_1, b_2, b_3\) such that \(f'\) is discontinuous at the central vertex and satisfies the Kirchhoff vertex conditions simultaneously. The Kirchhoff vertex conditions at the central vertex are satisfied since

\[ f_{e_1}'(0) + f_{e_2}'(0) + f_{e_3}'(0) = b_1 + b_2 + b_3 = 0. \]

and at the outer vertices we have

\[ f_{e_1}'(\ell) = f_{e_2}'(\ell) = f_{e_3}'(\ell) = 0. \]

For instance, we can choose \(b_1 = 1\), \(b_2 = 1\) and \(b_3 = -2\). This choice ensures \(f\) to be continuous and satisfy the Kirchhoff vertex conditions while \(f'\) is discontinuous at the central vertex. See Figure 1 and 2.

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

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


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

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

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

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

f <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph_disc, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph_disc, dddf_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- df1(l_mesh)
dfl2 <- df2(l_mesh)
dfl3 <- df3(l_mesh)

l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)

DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)
x_eye <- 5#8
y_eye <- -1#-2
z_eye <- 2#3
graph_disc$plot_function(X = df, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |> 
  config(mathjax = 'cdn') |>
  plotly::layout(title = TeX("f'"), 
                 font = list(family = "Palatino"),
                 scene = list(
                   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))
                 ))
star3f <- 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3df <- graph$plot_function(X = f*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
  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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  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("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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3ddf <- graph$plot_function(X = ddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = TRUE, interpolate_plot = TRUE, type = "plotly") |> 
  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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3dddf <- graph_disc$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |> 
  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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))


save(star3f, file = here::here("data_files/star3f.Rdata"))
save(star3df, file = here::here("data_files/star3df.Rdata"))
save(star3ddf, file = here::here("data_files/star3ddf.Rdata"))
save(star3dddf, file = here::here("data_files/star3dddf.Rdata"))

For illustration purposes, Figure 3 and 4 shows \(f''\) and \(f'''\).

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

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

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

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

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

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

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

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

2 Example of a function \(g\in C^1(\Gamma)\cap \mathcal{K}(\Gamma)\)

Let us consider the function \(g = \{g_e\}_{e\in\mathcal{E}}\) defined on the \(3\)-star graph with common edge length \(\ell\) via \[ g_{e_1}(s) = \cos\left(\frac{\pi s}{\ell}\right), \quad g_{e_2}(s) = \cos\left(\frac{\pi s}{\ell}\right), \quad g_{e_3}(s) = \cos\left(\frac{\pi s}{\ell}\right). \] Clearly, \(g\) is a continuous function (see Figure 5) on \(\Gamma\) since \[ g_{e_1}(0) = g_{e_2}(0) = g_{e_3}(0) = 1. \] The derivative \(g' = \{g'_e\}_{e\in\mathcal{E}}\) of \(g\) on each edge is given by \[ g_{e_1}'(s) = -\frac{\pi}{\ell}\sin\left(\frac{\pi s}{\ell}\right), \quad g_{e_2}'(s) = -\frac{\pi}{\ell}\sin\left(\frac{\pi s}{\ell}\right), \quad g_{e_3}'(s) = -\frac{\pi}{\ell}\sin\left(\frac{\pi s}{\ell}\right). \] Since \(g_{e_1}'(0) = g_{e_2}'(0) = g_{e_3}'(0) = 0\), \(g\) satisfies the Kirchhoff vertex conditions \[ g_{e_1}'(0) + g_{e_2}'(0) + g_{e_3}'(0) = 0\text{ and }g_{e_1}'(\ell) = g_{e_2}'(\ell) = g_{e_3}'(\ell) = 0. \] Moreover, \(g'\) is a continuous function. See Figure 6.

g1 <- function(s) cos(pi*s/L)
g2 <- function(s) cos(pi*s/L)
g3 <- function(s) cos(pi*s/L)

dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)

ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)

dddg1 <- function(s) pi^3/L^3*sin(pi*s/L)
dddg2 <- function(s) pi^3/L^3*sin(pi*s/L)
dddg3 <- function(s) pi^3/L^3*sin(pi*s/L)

g_list <- list(g1, g2, g3)
dg_list <- list(dg1, dg2, dg3)
ddg_list <- list(ddg1, ddg2, ddg3)
dddg_list <- list(dddg1, dddg2, dddg3)

g <- apply_edge_functions_fast(graph, g_list)
dg <- apply_edge_functions_fast(graph, dg_list)
ddg <- apply_edge_functions_fast(graph, ddg_list)
dddg <- apply_edge_functions_fast(graph, dddg_list)
star3g <- graph$plot_function(X = g, 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  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 = 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3dg <- graph$plot_function(X = dg, 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  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 = 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3ddg <- graph$plot_function(X = ddg, 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  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 = 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star3dddg <- graph$plot_function(X = dddg, 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  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 = 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))





save(star3g, file = here::here("data_files/star3g.Rdata"))
save(star3dg, file = here::here("data_files/star3dg.Rdata"))
save(star3ddg, file = here::here("data_files/star3ddg.Rdata"))
save(star3dddg, file = here::here("data_files/star3dddg.Rdata"))
dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)*0
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)

dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)


star3dg_path1 <- graph$plot_function(X = dg, 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("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = -dy3,
  v = -dx3,
  w = -dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
    x = c(e2_ini_y, e2_fin_y),
    y = c(e2_ini_x, e2_fin_x),
    z = c(e2_ini_z, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e3_fin_y, 0, e1_fin_y),
    y = c(e3_fin_x, 0, e1_fin_x),
    z = c(e3_fin_z, 0, e1_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_3e_1}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("\\hat{e}_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))



dg1 <- function(s) -pi/L*sin(pi*s/L)*0
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)

dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)


star3dg_path2 <- graph$plot_function(X = dg, 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("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("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = -dy3,
  v = -dx3,
  w = -dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
    x = c(e1_ini_y, e1_fin_y),
    y = c(e1_ini_x, e1_fin_x),
    z = c(e1_ini_z, e1_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e3_fin_y, 0, e2_fin_y),
    y = c(e3_fin_x, 0, e2_fin_x),
    z = c(e3_fin_z, 0, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_3e_2}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("\\hat{e}_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))



dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)*(-1)
dg3 <- function(s) -pi/L*sin(pi*s/L)*0

dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)


star3dg_path3 <- graph$plot_function(X = dg, 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
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
    x = c(e3_ini_y, e3_fin_y),
    y = c(e3_ini_x, e3_fin_x),
    z = c(e3_ini_z, e3_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e1_fin_y, 0, e2_fin_y),
    y = c(e1_fin_x, 0, e2_fin_x),
    z = c(e1_fin_z, 0, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_2e_1}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))











dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)

dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)


star3dg_path_ok <- graph$plot_function(X = dg, 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("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(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = -dy3,
  v = -dx3,
  w = -dz3,
  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("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 = 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("\\hat{e}_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))



save(star3dg_path1, file = here::here("data_files/star3dg_path1.Rdata"))
save(star3dg_path2, file = here::here("data_files/star3dg_path2.Rdata"))
save(star3dg_path3, file = here::here("data_files/star3dg_path3.Rdata"))
save(star3dg_path_ok, file = here::here("data_files/star3dg_path_ok.Rdata"))
ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)*0
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)



ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)

l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)

l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)

DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)



star3ddg_path1 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", 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("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = -dy3,
  v = -dx3,
  w = -dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  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) |>
  add_trace(
    x = c(e2_ini_y, e2_fin_y),
    y = c(e2_ini_x, e2_fin_x),
    z = c(e2_ini_z, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e3_fin_y, 0, e1_fin_y),
    y = c(e3_fin_x, 0, e1_fin_x),
    z = c(e3_fin_z, 0, e1_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_3e_1}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("\\hat{e}_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))


ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)*0
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)



ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)


l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)

l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)

DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)



star3ddg_path2 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", 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("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("green", "green")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = -dy3,
  v = -dx3,
  w = -dz3,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("green", "green")),
  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) |>
  add_trace(
    x = c(e1_ini_y, e1_fin_y),
    y = c(e1_ini_x, e1_fin_x),
    z = c(e1_ini_z, e1_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e3_fin_y, 0, e2_fin_y),
    y = c(e3_fin_x, 0, e2_fin_x),
    z = c(e3_fin_z, 0, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_3e_2}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("\\hat{e}_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*0



ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)


l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)

l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)

DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)



star3ddg_path3 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", 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
) |>
  add_trace(
  type = "cone",
  x = ym3,
  y = xm3,
  z = zm3,
  u = dy3,
  v = dx3,
  w = dz3,
  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) |>
  add_trace(
    x = c(e3_ini_y, e3_fin_y),
    y = c(e3_ini_x, e3_fin_x),
    z = c(e3_ini_z, e3_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "black", width = 7),
    showlegend = FALSE
  ) |>
  add_trace(
    x = c(e1_fin_y, 0, e2_fin_y),
    y = c(e1_fin_x, 0, e2_fin_x),
    z = c(e1_fin_z, 0, e2_fin_z),
    type = "scatter3d",
    mode = "lines",
    line = list(color = "green", width = 7),
    showlegend = FALSE
  ) |>
  plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_2e_1}})'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
               text = TeX("v_3"),
               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)"),
             list(
               x = ym3, y = xm3, z = zm3,
               text = TeX("e_3"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))


save(star3ddg_path1, file = here::here("data_files/star3ddg_path1.Rdata"))
save(star3ddg_path2, file = here::here("data_files/star3ddg_path2.Rdata"))
save(star3ddg_path3, file = here::here("data_files/star3ddg_path3.Rdata"))

For illustration purposes, Figure 7 and 8 shows \(g''\) and \(g'''\).

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

Figure 5: Function \(g = \{g_e\}_{e\in\mathcal{E}}\) given by \(g_{e_i}(s) = \cos(\dfrac{\pi s}{\ell})\) for \(i=1,2,3\).

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

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

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

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

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

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

3 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, 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\) to the outer vertex \(v_i\) for \(i=1,2\) in such a way that \(v = \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.

n <- 2
my_length <- 2
edges <-edges_roots_of_unity(n, length = my_length)
edges[[1]] <- rbind(c(0, 0), c(my_length, 0))
edges[[2]] <- rbind(c(0, 0), c(-my_length, 0))
graph <- metric_graph$new(edges = edges)
graph_disc <- graph$clone()
graph$build_mesh(h = h)
graph_disc$build_mesh(h = h, continuous = FALSE)
# 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]*s - b[1]*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]*s^2/L^2
df2 <- function(s) b[2] - b[2]*s^2/L^2

ddf1 <- function(s) -2*b[1]*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 <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph_disc, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph_disc, dddf_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- df1(l_mesh)
dfl2 <- df2(l_mesh)

l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)

DF <- rbind(DF1, rep(NA, 3), DF2)
DF_NO_NA <- rbind(DF1, DF2)
star2f <- 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("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym4,
  y = xm4,
  z = zm4,
  u = dy4,
  v = dx4,
  w = dz4,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("h"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e4_fin_y, y = e4_fin_x, z = e4_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 = ym4, y = xm4, z = zm4,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star2df <- graph$plot_function(X = f*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
  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 = ym4,
  y = xm4,
  z = zm4,
  u = dy4,
  v = dx4,
  w = dz4,
  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_NO_NA$y, each = 3), 
            y = rep(DF_NO_NA$x, each = 3), 
            z = unlist(lapply(DF_NO_NA$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("h'"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e4_fin_y, y = e4_fin_x, z = e4_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 = ym4, y = xm4, z = zm4,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star2ddf <- 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("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  add_trace(
  type = "cone",
  x = ym4,
  y = xm4,
  z = zm4,
  u = dy4,
  v = dx4,
  w = dz4,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  plotly::layout(title = list(text = TeX("h''"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e4_fin_y, y = e4_fin_x, z = e4_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 = ym4, y = xm4, z = zm4,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))

star2dddf <- graph_disc$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |> 
  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 = ym4,
  y = xm4,
  z = zm4,
  u = dy4,
  v = dx4,
  w = dz4,
  sizemode = "absolute",
  sizeref = sizeref,
  showscale = FALSE,
  showlegend = FALSE,
  colorscale = list(c(0, 1), c("red", "red")),
  cmin = 0,
  cmax = 1
) |>
  config(mathjax = 'cdn') |>
  plotly::layout(title = list(text = TeX("h'''"), 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_fin_y, y = e1_fin_x, z = e1_fin_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 = e4_fin_y, y = e4_fin_x, z = e4_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 = ym4, y = xm4, z = zm4,
               text = TeX("e_2"),
               textangle = 0, ax = 0, ay = 35,
               font = list(color = "black", size = gfsize),
               arrowcolor = "rgba(0,0,0,0)"))
                 ))


save(star2f, file = here::here("data_files/star2f.Rdata"))
save(star2df, file = here::here("data_files/star2df.Rdata"))
save(star2ddf, file = here::here("data_files/star2ddf.Rdata"))
save(star2dddf, file = here::here("data_files/star2dddf.Rdata"))

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

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

Figure 9: 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/star2df.Rdata"))
star2df

Figure 10: 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/star2ddf.Rdata"))
star2ddf

Figure 11: 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/star2dddf.Rdata"))
star2dddf

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

4 Path derivatives

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

Figure 13: 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/star3dg_path2.Rdata"))
star3dg_path2

Figure 14: 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/star3dg_path3.Rdata"))
star3dg_path3

Figure 15: 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/star3dg_path_ok.Rdata"))
star3dg_path_ok

Figure 16: 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\).

5 Path derivatives 2

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

Figure 17: 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/star3ddg_path2.Rdata"))
star3ddg_path2

Figure 18: 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/star3ddg_path3.Rdata"))
star3ddg_path3

Figure 19: 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\).

6 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), pracma v. 2.4.4 (Borchers 2023), 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.
Borchers, Hans W. 2023. pracma: Practical Numerical Math Functions. https://doi.org/10.32614/CRAN.package.pracma.
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+UHJlc3MgU2hvdyB0byByZXZlYWwgdGhlIGNvZGUgY2h1bmtzLjwvc3Ryb25nPiAgCgoqKioqKioqKgo8L2Rpdj4KCgpgYGB7cn0KIyBDcmVhdGUgYSBjbGlwYm9hcmQgYnV0dG9uIG9uIHRoZSByZW5kZXJlZCBIVE1MIHBhZ2UKc291cmNlKGhlcmU6OmhlcmUoImNsaXBib2FyZC5SIikpOyBjbGlwYm9hcmQKIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDE5ODIpIAojIFNldCBnbG9iYWwgb3B0aW9ucyBmb3IgYWxsIGNvZGUgY2h1bmtzCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAjIERpc2FibGUgbWVzc2FnZXMgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAKICAjIERpc2FibGUgd2FybmluZ3MgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAKICAjIFNob3cgUiBjb2RlIHdpdGhpbiBjb2RlIGNodW5rcyBpbiBvdXRwdXQKICBlY2hvID0gVFJVRSwgICAgICAgIAogICMgSW5jbHVkZSBib3RoIFIgY29kZSBhbmQgaXRzIHJlc3VsdHMgaW4gb3V0cHV0CiAgaW5jbHVkZSA9IFRSVUUsICAgICAKICAjIEV2YWx1YXRlIFIgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgIAogICMgRW5hYmxlIGNhY2hpbmcgb2YgUiBjb2RlIGNodW5rcyBmb3IgZmFzdGVyIHJlbmRlcmluZwogIGNhY2hlID0gRkFMU0UsICAgICAgCiAgIyBBbGlnbiBmaWd1cmVzIGluIHRoZSBjZW50ZXIgb2YgdGhlIG91dHB1dAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogICMgRW5hYmxlIHJldGluYSBkaXNwbGF5IGZvciBoaWdoLXJlc29sdXRpb24gZmlndXJlcwogIHJldGluYSA9IDIsCiAgIyBTaG93IGVycm9ycyBpbiB0aGUgb3V0cHV0IGluc3RlYWQgb2Ygc3RvcHBpbmcgcmVuZGVyaW5nCiAgZXJyb3IgPSBUUlVFLAogICMgRG8gbm90IGNvbGxhcHNlIGNvZGUgYW5kIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrCiAgY29sbGFwc2UgPSBGQUxTRQopCiMgU3RhcnQgdGhlIGZpZ3VyZSBjb3VudGVyCmZpZ19jb3VudCA8LSAwCiMgRGVmaW5lIHRoZSBjYXB0aW9uZXIgZnVuY3Rpb24KY2FwdGlvbmVyIDwtIGZ1bmN0aW9uKGNhcHRpb24pIHsKICBmaWdfY291bnQgPDwtIGZpZ19jb3VudCArIDEKICBwYXN0ZTAoIkZpZ3VyZSAiLCBmaWdfY291bnQsICI6ICIsIGNhcHRpb24pCn0KCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFfQpsaWJyYXJ5KE1ldHJpY0dyYXBoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KHNsYWNrcikKc291cmNlKCJrZXlzLlIiKQpzbGFja3Jfc2V0dXAodG9rZW4gPSB0b2tlbikgIyB0b2tlbiBjb21lcyBmcm9tIGtleXMuUgpgYGAKCgpgYGB7cn0KY2FwdHVyZS5vdXRwdXQoCiAga25pdHI6OnB1cmwoaGVyZTo6aGVyZSgiZnVuY3Rpb25hbGl0eTEuUm1kIiksIG91dHB1dCA9IGhlcmU6OmhlcmUoImZ1bmN0aW9uYWxpdHkxLlIiKSksCiAgZmlsZSA9IGhlcmU6OmhlcmUoIm9sZC9wdXJsX2xvZy50eHQiKQopCnNvdXJjZShoZXJlOjpoZXJlKCJmdW5jdGlvbmFsaXR5MS5SIikpCmBgYAoKYGBge3J9CmVkZ2VzX3Jvb3RzX29mX3VuaXR5IDwtIGZ1bmN0aW9uKG4sIGxlbmd0aCA9IDEwKSB7CiAgeF9jb29yZHMgPC0gY29zKDIgKiBwaSAqICgwOihuLTEpKSAvIG4pCiAgeV9jb29yZHMgPC0gc2luKDIgKiBwaSAqICgwOihuLTEpKSAvIG4pCiAgcmV0dXJuKGxhcHBseSgxOm4sIGZ1bmN0aW9uKGkpIHtyYmluZChjKDAsIDApLCBjKGxlbmd0aCp4X2Nvb3Jkc1tpXSwgbGVuZ3RoKnlfY29vcmRzW2ldKSl9KSkKfQpuIDwtIDMKbXlfbGVuZ3RoIDwtIDIKZWRnZXMgPC1lZGdlc19yb290c19vZl91bml0eShuLCBsZW5ndGggPSBteV9sZW5ndGgpCiNlZGdlc1tbMV1dIDwtIGVkZ2VzW1sxXV1bMjoxLF0KZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhlZGdlcyA9IGVkZ2VzKQpncmFwaF9kaXNjIDwtIGdyYXBoJGNsb25lKCkKYGBgCgoKYGBge3J9CmUxX2luaV94IDwtIGVkZ2VzW1sxXV1bMSwxXTsgZTFfaW5pX3kgPC0gZWRnZXNbWzFdXVsxLDJdOyBlMV9pbmlfeiA8LSAwCmUxX2Zpbl94IDwtIGVkZ2VzW1sxXV1bMiwxXTsgZTFfZmluX3kgPC0gZWRnZXNbWzFdXVsyLDJdOyBlMV9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMSA8LSAoZTFfZmluX3ggKyBlMV9pbmlfeCkvMgp5bTEgPC0gKGUxX2Zpbl95ICsgZTFfaW5pX3kpLzIKem0xIDwtIChlMV9maW5feiArIGUxX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgxIDwtIGUxX2Zpbl94IC0gZTFfaW5pX3gKZHkxIDwtIGUxX2Zpbl95IC0gZTFfaW5pX3kKZHoxIDwtIGUxX2Zpbl96IC0gZTFfaW5pX3oKCmUyX2luaV94IDwtIGVkZ2VzW1syXV1bMSwxXTsgZTJfaW5pX3kgPC0gZWRnZXNbWzJdXVsxLDJdOyBlMl9pbmlfeiA8LSAwCmUyX2Zpbl94IDwtIGVkZ2VzW1syXV1bMiwxXTsgZTJfZmluX3kgPC0gZWRnZXNbWzJdXVsyLDJdOyBlMl9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMiA8LSAoZTJfZmluX3ggKyBlMl9pbmlfeCkvMgp5bTIgPC0gKGUyX2Zpbl95ICsgZTJfaW5pX3kpLzIKem0yIDwtIChlMl9maW5feiArIGUyX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgyIDwtIGUyX2Zpbl94IC0gZTJfaW5pX3gKZHkyIDwtIGUyX2Zpbl95IC0gZTJfaW5pX3kKZHoyIDwtIGUyX2Zpbl96IC0gZTJfaW5pX3oKCmUzX2luaV94IDwtIGVkZ2VzW1szXV1bMSwxXTsgZTNfaW5pX3kgPC0gZWRnZXNbWzNdXVsxLDJdOyBlM19pbmlfeiA8LSAwCmUzX2Zpbl94IDwtIGVkZ2VzW1szXV1bMiwxXTsgZTNfZmluX3kgPC0gZWRnZXNbWzNdXVsyLDJdOyBlM19maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMyA8LSAoZTNfZmluX3ggKyBlM19pbmlfeCkvMgp5bTMgPC0gKGUzX2Zpbl95ICsgZTNfaW5pX3kpLzIKem0zIDwtIChlM19maW5feiArIGUzX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgzIDwtIGUzX2Zpbl94IC0gZTNfaW5pX3gKZHkzIDwtIGUzX2Zpbl95IC0gZTNfaW5pX3kKZHozIDwtIGUzX2Zpbl96IC0gZTNfaW5pX3oKCmU0X2luaV94IDwtIDA7IGU0X2luaV95IDwtIDA7IGU0X2luaV96IDwtIDAKZTRfZmluX3ggPC0gLW15X2xlbmd0aDsgZTRfZmluX3kgPC0gMDsgZTRfZmluX3ogPC0gMAoKIyBNaWRwb2ludAp4bTQgPC0gKGU0X2Zpbl94ICsgZTRfaW5pX3gpLzIKeW00IDwtIChlNF9maW5feSArIGU0X2luaV95KS8yCnptNCA8LSAoZTRfZmluX3ogKyBlNF9pbmlfeikvMgoKIyBEaXJlY3Rpb24gdmVjdG9yCmR4NCA8LSBlNF9maW5feCAtIGU0X2luaV94CmR5NCA8LSBlNF9maW5feSAtIGU0X2luaV95CmR6NCA8LSBlNF9maW5feiAtIGU0X2luaV96CgpzaXplcmVmIDwtIDAuMgpgYGAKCgpgYGB7cn0KaCA9IDAuMDIKZ3JhcGgkYnVpbGRfbWVzaChoID0gaCkKZ3JhcGhfZGlzYyRidWlsZF9tZXNoKGggPSBoLCBjb250aW51b3VzID0gRkFMU0UpCmBgYAoKCgoKYGBge3J9CmFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QgPC0gZnVuY3Rpb24oZ3JhcGgsIGZfbGlzdCkgewogIAogIGlmIChsZW5ndGgoZl9saXN0KSAhPSBncmFwaCRuRSkgewogICAgc3RvcChzcHJpbnRmKAogICAgICAiTnVtYmVyIG9mIGZ1bmN0aW9ucyAoJWQpIG11c3QgZXF1YWwgbnVtYmVyIG9mIGVkZ2VzICglZCkuIiwKICAgICAgbGVuZ3RoKGZfbGlzdCksIGdyYXBoJG5FCiAgICApKQogIH0KICBWdEUgPC0gZ3JhcGgkbWVzaCRWdEUKICBlZGdlX2xlbmd0aHMgPC0gZ3JhcGgkZWRnZV9sZW5ndGhzCiAgCiAgZWRnZSAgIDwtIFZ0RVssMV0KICBzX25vcm0gPC0gVnRFWywyXQogIHNfdHJ1ZSA8LSBzX25vcm0gKiBlZGdlX2xlbmd0aHNbZWRnZV0KICAKICAjIHNfdHJ1ZSA8LSBpZmVsc2UoZ3JhcGgkZWRnZV9vcmllbnRhdGlvbltlZGdlXSA9PSAtMSwKICAjICAgICAgICAgICAgICAgIGVkZ2VfbGVuZ3Roc1tlZGdlXSAqICgxIC0gc19ub3JtKSwKICAjICAgICAgICAgICAgICAgIGVkZ2VfbGVuZ3Roc1tlZGdlXSAqIHNfbm9ybSkKCiAgCiAgIyBvdXQgPC0gbnVtZXJpYyhsZW5ndGgoZWRnZSkpCiAgIyBmb3IgKGUgaW4gc2VxX2xlbihncmFwaCRuRSkpIHsKICAjICAgaWR4IDwtIHdoaWNoKGVkZ2UgPT0gZSkKICAjICAgb3V0W2lkeF0gPC0gZl9saXN0W1tlXV0oc190cnVlW2lkeF0pCiAgIyB9CiAgIyByZXR1cm4ob3V0KQogIG91dCA8LSBzYXBwbHkoc2VxX2xlbihucm93KFZ0RSkpLCBmdW5jdGlvbihpKSBmX2xpc3RbW2VkZ2VbaV1dXShzX3RydWVbaV0pKQogIHJldHVybihvdXQpCn0KYGBgCgoKIyBFeGFtcGxlIG9mIGEgZnVuY3Rpb24gJGZcaW4gQyhcR2FtbWEpXGNhcCBcbWF0aGNhbHtLfShcR2FtbWEpXHNldG1pbnVzIENeMShcR2FtbWEpJAoKCkxldCB1cyBjb25zaWRlciB0aGUgJDMkLXN0YXIgZ3JhcGggJFxHYW1tYSA9IChcbWF0aGNhbHtWfSwgXG1hdGhjYWx7RX0pJCwgd2hlcmUgJFxtYXRoY2Fse1Z9ID0gXHt2LCB2XzEsIHZfMiwgdl8zXH0kIGFuZCAkXG1hdGhjYWx7RX0gPSBce2VfMSwgZV8yLCBlXzNcfSQuIEVhY2ggZWRnZSAkZV9pJCBoYXMgY29tbW9uIGxlbmd0aCAkXGVsbCQgYW5kIGNvbm5lY3RzIHRoZSBjZW50cmFsIHZlcnRleCAkdiQgdG8gdGhlIG91dGVyIHZlcnRleCAkdl9pJCBmb3IgJGk9MSwyLDMkIGluIHN1Y2ggYSB3YXkgdGhhdCAkdiA9IFx1bmRlcmxpbmV7ZV8xfSA9IFx1bmRlcmxpbmV7ZV8yfSA9IFx1bmRlcmxpbmV7ZV8zfSQuIE9uICRcR2FtbWEkLCB3ZSBkZWZpbmUgdGhlIGZ1bmN0aW9uICRmID0gXHtmX2VcfV97ZVxpblxtYXRoY2Fse0V9fSQgdmlhCgokJApmX3tlXzF9KHMpID0gYSArIGJfMSBzIC0gXGZyYWN7Yl8xIHNeM317M1xlbGxeMn0sIFxxdWFkIGZfe2VfMn0ocykgPSBhICsgYl8yIHMgLSBcZnJhY3tiXzIgc14zfXszXGVsbF4yfSwgXHF1YWQgZl97ZV8zfShzKSA9IGEgKyBiXzMgcyAtIFxmcmFje2JfMyBzXjN9ezNcZWxsXjJ9LAokJAoKd2hlcmUgJGEkICh0byBiZSBjaG9zZW4pIGlzIHRoZSB2YWx1ZSBvZiAkZiQgYXQgdGhlIGNlbnRyYWwgdmVydGV4IGFuZCAkYl8xLCBiXzIsIGJfMyQgYXJlIGNvbnN0YW50cyAodG8gYmUgY2hvc2VuKSBzdWNoIHRoYXQgJGJfMSArIGJfMiArIGJfMyA9IDAkLiBDbGVhcmx5LCAkZiQgaXMgYSBjb250aW51b3VzIGZ1bmN0aW9uIHNpbmNlIAoKJCQKZl97ZV8xfSgwKSA9IGZfe2VfMn0oMCkgPSBmX3tlXzN9KDApID0gYS4KJCQKClRoZSBkZXJpdmF0aXZlICRmJyA9IFx7ZidfZVx9X3tlXGluXG1hdGhjYWx7RX19JCBvZiAkZiQgb24gZWFjaCBlZGdlIGlzIGdpdmVuIGJ5CgokJApmX3tlXzF9JyhzKSA9IGJfMSAtIFxmcmFje2JfMSBzXjJ9e1xlbGxeMn0sIFxxdWFkIGZfe2VfMn0nKHMpID0gYl8yIC0gXGZyYWN7Yl8yIHNeMn17XGVsbF4yfSwgXHF1YWQgZl97ZV8zfScocykgPSBiXzMgLSBcZnJhY3tiXzMgc14yfXtcZWxsXjJ9LgokJApTaW5jZSAkZl97ZV8xfScoMCkgPSBiXzEkLCAkZl97ZV8yfScoMCkgPSBiXzIkIGFuZCAkZl97ZV8zfScoMCkgPSBiXzMkLCB3ZSBjYW4gY2hvb3NlICRiXzEsIGJfMiwgYl8zJCBzdWNoIHRoYXQgJGYnJCBpcyBkaXNjb250aW51b3VzIGF0IHRoZSBjZW50cmFsIHZlcnRleCBhbmQgc2F0aXNmaWVzIHRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgc2ltdWx0YW5lb3VzbHkuIFRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgYXQgdGhlIGNlbnRyYWwgdmVydGV4IGFyZSBzYXRpc2ZpZWQgc2luY2UKCiQkCmZfe2VfMX0nKDApICsgZl97ZV8yfScoMCkgKyBmX3tlXzN9JygwKSA9IGJfMSArIGJfMiArIGJfMyA9IDAuCiQkCgphbmQgYXQgdGhlIG91dGVyIHZlcnRpY2VzIHdlIGhhdmUKCiQkCmZfe2VfMX0nKFxlbGwpID0gIGZfe2VfMn0nKFxlbGwpID0gZl97ZV8zfScoXGVsbCkgPSAwLgokJAoKRm9yIGluc3RhbmNlLCB3ZSBjYW4gY2hvb3NlICRiXzEgPSAxJCwgJGJfMiA9IDEkIGFuZCAkYl8zID0gLTIkLiBUaGlzIGNob2ljZSBlbnN1cmVzICRmJCB0byBiZSBjb250aW51b3VzIGFuZCBzYXRpc2Z5IHRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgd2hpbGUgJGYnJCBpcyBkaXNjb250aW51b3VzIGF0IHRoZSBjZW50cmFsIHZlcnRleC4gU2VlIEZpZ3VyZSAxIGFuZCAyLgoKCgpgYGB7cn0KIyBHZW5lcmFsIHBhcmFtZXRlcnMKTCA8LSBteV9sZW5ndGggICAgICAgICAgICAgIyBlZGdlIGxlbmd0aAphIDwtIDEgICAgICAgICAgICAgIyB2YWx1ZSBhdCBjZW50cmFsIHZlcnRleApiIDwtIGMoMSwgMSwgLTIpICAgIyBiMStiMitiMyBtdXN0IGJlIDAKCmYxIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzFdKnMgLSBiWzFdKnNeMy8oMypMXjIpCmYyIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzJdKnMgLSBiWzJdKnNeMy8oMypMXjIpCmYzIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzNdKnMgLSBiWzNdKnNeMy8oMypMXjIpCgoKZGYxIDwtIGZ1bmN0aW9uKHMpIGJbMV0gLSBiWzFdKnNeMi9MXjIKZGYyIDwtIGZ1bmN0aW9uKHMpIGJbMl0gLSBiWzJdKnNeMi9MXjIKZGYzIDwtIGZ1bmN0aW9uKHMpIGJbM10gLSBiWzNdKnNeMi9MXjIKCmRkZjEgPC0gZnVuY3Rpb24ocykgLTIqYlsxXSpzL0xeMgpkZGYyIDwtIGZ1bmN0aW9uKHMpIC0yKmJbMl0qcy9MXjIKZGRmMyA8LSBmdW5jdGlvbihzKSAtMipiWzNdKnMvTF4yCgpkZGRmMSA8LSBmdW5jdGlvbihzKSAtMipiWzFdL0xeMgpkZGRmMiA8LSBmdW5jdGlvbihzKSAtMipiWzJdL0xeMgpkZGRmMyA8LSBmdW5jdGlvbihzKSAtMipiWzNdL0xeMgoKZl9saXN0IDwtIGxpc3QoZjEsIGYyLCBmMykKZGZfbGlzdCA8LSBsaXN0KGRmMSwgZGYyLCBkZjMpCmRkZl9saXN0IDwtIGxpc3QoZGRmMSwgZGRmMiwgZGRmMykKZGRkZl9saXN0IDwtIGxpc3QoZGRkZjEsIGRkZGYyLCBkZGRmMykKCmYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZl9saXN0KQpkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRmX2xpc3QpCmRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGZfbGlzdCkKZGRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRkZGZfbGlzdCkKYGBgCgoKYGBge3J9CmxfbWVzaCA8LSBzZXEoMCwgbXlfbGVuZ3RoLCBieSA9IGgpCmRmbDEgPC0gZGYxKGxfbWVzaCkKZGZsMiA8LSBkZjIobF9tZXNoKQpkZmwzIDwtIGRmMyhsX21lc2gpCgpsX21lc2hfbm9ybSA8LSBsX21lc2gvbXlfbGVuZ3RoClB0RTEgPC0gY2JpbmQocmVwKDEsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTIgPC0gY2JpbmQocmVwKDIsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTMgPC0gY2JpbmQocmVwKDMsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClhZMSA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUxKQpYWTIgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMikKWFkzIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTMpCkRGMSA8LSBkYXRhLmZyYW1lKHggPSBYWTFbLDFdLCB5ID0gWFkxWywyXSwgeiA9IGRmbDEpCkRGMiA8LSBkYXRhLmZyYW1lKHggPSBYWTJbLDFdLCB5ID0gWFkyWywyXSwgeiA9IGRmbDIpCkRGMyA8LSBkYXRhLmZyYW1lKHggPSBYWTNbLDFdLCB5ID0gWFkzWywyXSwgeiA9IGRmbDMpCgpERiA8LSByYmluZChERjEsIHJlcChOQSwgMyksIERGMiwgcmVwKE5BLCAzKSwgREYzKQpERl9OT19OQSA8LSByYmluZChERjEsIERGMiwgREYzKQpgYGAKCmBgYHtyfQp4X2V5ZSA8LSA1IzgKeV9leWUgPC0gLTEjLTIKel9leWUgPC0gMiMzCmBgYAoKYGBge3IsIGV2YWwgPSBGQUxTRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnID0gXFx7ZidfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZl97ZV9pfScocykgPSBiX2kgLSBcXGRmcmFje2JfaSBzXjJ9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyLDMkLiIpfQpncmFwaF9kaXNjJHBsb3RfZnVuY3Rpb24oWCA9IGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IEZBTFNFLCBpbnRlcnBvbGF0ZV9wbG90ID0gVFJVRSwgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gVGVYKCJmJyIpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKQogICAgICAgICAgICAgICAgICkpCmBgYAoKCgoKYGBge3J9CnN0YXIzZiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJmIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCnN0YXIzZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZiowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZiciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IFRSVUUsIGludGVycG9sYXRlX3Bsb3QgPSBUUlVFLCB0eXBlID0gInBsb3RseSIpIHw+IAogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImYnJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfZmluX3ksIHkgPSBlMl9maW5feCwgeiA9IGUyX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlM19maW5feSwgeSA9IGUzX2Zpbl94LCB6ID0gZTNfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTMsIHkgPSB4bTMsIHogPSB6bTMsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzdGFyM2RkZGYgPC0gZ3JhcGhfZGlzYyRwbG90X2Z1bmN0aW9uKFggPSBkZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IEZBTFNFLCBpbnRlcnBvbGF0ZV9wbG90ID0gVFJVRSwgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJmJycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgpzYXZlKHN0YXIzZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNmLlJkYXRhIikpCnNhdmUoc3RhcjNkZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZi5SZGF0YSIpKQpzYXZlKHN0YXIzZGRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZi5SZGF0YSIpKQpzYXZlKHN0YXIzZGRkZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZGRmLlJkYXRhIikpCmBgYAoKCgpGb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCBGaWd1cmUgMyBhbmQgNCBzaG93cyAkZicnJCBhbmQgJGYnJyckLgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYgPSBcXHtmX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGZfe2VfaX0ocykgPSBhICsgYl9pIHMgLSBcXGRmcmFje2JfaSBzXjN9ezNcXGVsbF4yfSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZi5SZGF0YSIpKQpzdGFyM2YKYGBgCgoKCjo6OgoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZicgPSBcXHtmJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJ197ZV9pfShzKSA9IGJfaSAtIFxcZGZyYWN7Yl9pIHNeMn17XFxlbGxeMn0kIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RmLlJkYXRhIikpCnN0YXIzZGYKYGBgCgoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnJyA9IFxce2YnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJydfe2VfaX0ocykgPSAtXFxkZnJhY3syIGJfaSBzfXtcXGVsbF4yfSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRmLlJkYXRhIikpCnN0YXIzZGRmCmBgYAoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnJycgPSBcXHtmJycnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnJydfe2VfaX0ocykgPSAtXFxkZnJhY3syIGJfaX17XFxlbGxeMn0kIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGYuUmRhdGEiKSkKc3RhcjNkZGRmCmBgYAoKCjo6OgoKOjo6OgoKCgojIEV4YW1wbGUgb2YgYSBmdW5jdGlvbiAkZ1xpbiBDXjEoXEdhbW1hKVxjYXAgXG1hdGhjYWx7S30oXEdhbW1hKSQKCgoKTGV0IHVzIGNvbnNpZGVyIHRoZSBmdW5jdGlvbiAkZyA9IFx7Z19lXH1fe2VcaW5cbWF0aGNhbHtFfX0kIGRlZmluZWQgb24gdGhlICQzJC1zdGFyIGdyYXBoIHdpdGggY29tbW9uIGVkZ2UgbGVuZ3RoICRcZWxsJCB2aWEKJCQKZ197ZV8xfShzKSA9IFxjb3NcbGVmdChcZnJhY3tccGkgc317XGVsbH1ccmlnaHQpLCBccXVhZCBnX3tlXzJ9KHMpID0gXGNvc1xsZWZ0KFxmcmFje1xwaSBzfXtcZWxsfVxyaWdodCksIFxxdWFkIGdfe2VfM30ocykgPSBcY29zXGxlZnQoXGZyYWN7XHBpIHN9e1xlbGx9XHJpZ2h0KS4KJCQKQ2xlYXJseSwgJGckIGlzIGEgY29udGludW91cyBmdW5jdGlvbiAoc2VlIEZpZ3VyZSA1KSBvbiAkXEdhbW1hJCBzaW5jZQokJApnX3tlXzF9KDApID0gIGdfe2VfMn0oMCkgPSAgZ197ZV8zfSgwKSA9IDEuCiQkClRoZSBkZXJpdmF0aXZlICRnJyA9IFx7ZydfZVx9X3tlXGluXG1hdGhjYWx7RX19JCAgb2YgJGckIG9uIGVhY2ggZWRnZSBpcyBnaXZlbiBieQokJApnX3tlXzF9JyhzKSA9IC1cZnJhY3tccGl9e1xlbGx9XHNpblxsZWZ0KFxmcmFje1xwaSBzfXtcZWxsfVxyaWdodCksIFxxdWFkIGdfe2VfMn0nKHMpID0gLVxmcmFje1xwaX17XGVsbH1cc2luXGxlZnQoXGZyYWN7XHBpIHN9e1xlbGx9XHJpZ2h0KSwgXHF1YWQgZ197ZV8zfScocykgPSAtXGZyYWN7XHBpfXtcZWxsfVxzaW5cbGVmdChcZnJhY3tccGkgc317XGVsbH1ccmlnaHQpLgokJApTaW5jZSAkZ197ZV8xfScoMCkgPSBnX3tlXzJ9JygwKSA9IGdfe2VfM30nKDApID0gMCQsICRnJCBzYXRpc2ZpZXMgdGhlIEtpcmNoaG9mZiB2ZXJ0ZXggY29uZGl0aW9ucwokJApnX3tlXzF9JygwKSArIGdfe2VfMn0nKDApICsgZ197ZV8zfScoMCkgPSAwXHRleHR7IGFuZCB9Z197ZV8xfScoXGVsbCkgPSAgZ197ZV8yfScoXGVsbCkgPSAgZ197ZV8zfScoXGVsbCkgPSAwLgokJApNb3Jlb3ZlciwgJGcnJCBpcyBhIGNvbnRpbnVvdXMgZnVuY3Rpb24uIFNlZSBGaWd1cmUgNi4KCgpgYGB7cn0KZzEgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKZzIgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKZzMgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkKZGczIDwtIGZ1bmN0aW9uKHMpIC1waS9MKnNpbihwaSpzL0wpCgpkZGcxIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQpkZGcyIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQpkZGczIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQoKZGRkZzEgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKZGRkZzIgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKZGRkZzMgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKCmdfbGlzdCA8LSBsaXN0KGcxLCBnMiwgZzMpCmRnX2xpc3QgPC0gbGlzdChkZzEsIGRnMiwgZGczKQpkZGdfbGlzdCA8LSBsaXN0KGRkZzEsIGRkZzIsIGRkZzMpCmRkZGdfbGlzdCA8LSBsaXN0KGRkZGcxLCBkZGRnMiwgZGRkZzMpCgpnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGdfbGlzdCkKZGcgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGdfbGlzdCkKZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZ19saXN0KQpkZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZGdfbGlzdCkKYGBgCgoKCmBgYHtyfQpzdGFyM2cgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZyA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGcgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRnLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJnJyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGRnIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZGcsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+IAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSBkeTMsCiAgdiA9IGR4MywKICB3ID0gZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImcnJyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCgoKCnNhdmUoc3RhcjNnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2cuUmRhdGEiKSkKc2F2ZShzdGFyM2RnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnLlJkYXRhIikpCnNhdmUoc3RhcjNkZGcsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnLlJkYXRhIikpCnNhdmUoc3RhcjNkZGRnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGcuUmRhdGEiKSkKCmBgYAoKCmBgYHtyfQoKCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqMApkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMSA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSAtZHkzLAogIHYgPSAtZHgzLAogIHcgPSAtZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUyX2luaV95LCBlMl9maW5feSksCiAgICB5ID0gYyhlMl9pbmlfeCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTJfaW5pX3osIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2Zpbl95LCAwLCBlMV9maW5feSksCiAgICB5ID0gYyhlM19maW5feCwgMCwgZTFfZmluX3gpLAogICAgeiA9IGMoZTNfZmluX3osIDAsIGUxX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzNlXzF9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKSowCmRnMiA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSAtZHkzLAogIHYgPSAtZHgzLAogIHcgPSAtZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2luaV95LCBlMV9maW5feSksCiAgICB5ID0gYyhlMV9pbmlfeCwgZTFfZmluX3gpLAogICAgeiA9IGMoZTFfaW5pX3osIGUxX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlM19maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTNfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzNlXzJ9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqMAoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMyA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gLWR5MiwKICB2ID0gLWR4MiwKICB3ID0gLWR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2luaV95LCBlM19maW5feSksCiAgICB5ID0gYyhlM19pbmlfeCwgZTNfZmluX3gpLAogICAgeiA9IGMoZTNfaW5pX3osIGUzX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlMV9maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTFfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzJlXzF9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTMsIHkgPSB4bTMsIHogPSB6bTMsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCgoKCgoKCgoKZGcxIDwtIGZ1bmN0aW9uKHMpIC1waS9MKnNpbihwaSpzL0wpCmRnMiA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoX29rIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRnLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gLWR5MywKICB2ID0gLWR4MywKICB3ID0gLWR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgoKc2F2ZShzdGFyM2RnX3BhdGgxLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGgxLlJkYXRhIikpCnNhdmUoc3RhcjNkZ19wYXRoMiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZ19wYXRoMi5SZGF0YSIpKQpzYXZlKHN0YXIzZGdfcGF0aDMsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aDMuUmRhdGEiKSkKc2F2ZShzdGFyM2RnX3BhdGhfb2ssIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aF9vay5SZGF0YSIpKQoKCmBgYAoKCgpgYGB7cn0KZGRnMSA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkKZGRnMiA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkqMApkZGczIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKSooLTEpCgoKCmRkZ19saXN0IDwtIGxpc3QoZGRnMSwgZGRnMiwgZGRnMykKZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZ19saXN0KQoKbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZGcxKGxfbWVzaCkKZGZsMiA8LSBkZGcyKGxfbWVzaCkKZGZsMyA8LSBkZGczKGxfbWVzaCkKCmxfbWVzaF9ub3JtIDwtIGxfbWVzaC9teV9sZW5ndGgKUHRFMSA8LSBjYmluZChyZXAoMSwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMiA8LSBjYmluZChyZXAoMiwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMyA8LSBjYmluZChyZXAoMywgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKWFkxIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTEpClhZMiA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUyKQpYWTMgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMykKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKREYzIDwtIGRhdGEuZnJhbWUoeCA9IFhZM1ssMV0sIHkgPSBYWTNbLDJdLCB6ID0gZGZsMykKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyLCByZXAoTkEsIDMpLCBERjMpCkRGX05PX05BIDwtIHJiaW5kKERGMSwgREYyLCBERjMpCgoKCnN0YXIzZGRnX3BhdGgxIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZyowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IC1keTMsCiAgdiA9IC1keDMsCiAgdyA9IC1kejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlMl9pbmlfeSwgZTJfZmluX3kpLAogICAgeSA9IGMoZTJfaW5pX3gsIGUyX2Zpbl94KSwKICAgIHogPSBjKGUyX2luaV96LCBlMl9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlM19maW5feSwgMCwgZTFfZmluX3kpLAogICAgeSA9IGMoZTNfZmluX3gsIDAsIGUxX2Zpbl94KSwKICAgIHogPSBjKGUzX2Zpbl96LCAwLCBlMV9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyZWVuIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiKGcnfF97cF97XFxoYXR7ZX1fM2VfMX19KSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgpkZGcxIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKSowCmRkZzIgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpCmRkZzMgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpKigtMSkKCgoKZGRnX2xpc3QgPC0gbGlzdChkZGcxLCBkZGcyLCBkZGczKQpkZGcgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGRnX2xpc3QpCgoKbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZGcxKGxfbWVzaCkKZGZsMiA8LSBkZGcyKGxfbWVzaCkKZGZsMyA8LSBkZGczKGxfbWVzaCkKCmxfbWVzaF9ub3JtIDwtIGxfbWVzaC9teV9sZW5ndGgKUHRFMSA8LSBjYmluZChyZXAoMSwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMiA8LSBjYmluZChyZXAoMiwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMyA8LSBjYmluZChyZXAoMywgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKWFkxIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTEpClhZMiA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUyKQpYWTMgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMykKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKREYzIDwtIGRhdGEuZnJhbWUoeCA9IFhZM1ssMV0sIHkgPSBYWTNbLDJdLCB6ID0gZGZsMykKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyLCByZXAoTkEsIDMpLCBERjMpCkRGX05PX05BIDwtIHJiaW5kKERGMSwgREYyLCBERjMpCgoKCnN0YXIzZGRnX3BhdGgyIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZyowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IC1keTMsCiAgdiA9IC1keDMsCiAgdyA9IC1kejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlMV9pbmlfeSwgZTFfZmluX3kpLAogICAgeSA9IGMoZTFfaW5pX3gsIGUxX2Zpbl94KSwKICAgIHogPSBjKGUxX2luaV96LCBlMV9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlM19maW5feSwgMCwgZTJfZmluX3kpLAogICAgeSA9IGMoZTNfZmluX3gsIDAsIGUyX2Zpbl94KSwKICAgIHogPSBjKGUzX2Zpbl96LCAwLCBlMl9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyZWVuIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiKGcnfF97cF97XFxoYXR7ZX1fM2VfMn19KSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCmRkZzEgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpCmRkZzIgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpKigtMSkKZGRnMyA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkqMAoKCgpkZGdfbGlzdCA8LSBsaXN0KGRkZzEsIGRkZzIsIGRkZzMpCmRkZyA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGdfbGlzdCkKCgpsX21lc2ggPC0gc2VxKDAsIG15X2xlbmd0aCwgYnkgPSBoKQpkZmwxIDwtIGRkZzEobF9tZXNoKQpkZmwyIDwtIGRkZzIobF9tZXNoKQpkZmwzIDwtIGRkZzMobF9tZXNoKQoKbF9tZXNoX25vcm0gPC0gbF9tZXNoL215X2xlbmd0aApQdEUxIDwtIGNiaW5kKHJlcCgxLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpQdEUyIDwtIGNiaW5kKHJlcCgyLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpQdEUzIDwtIGNiaW5kKHJlcCgzLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpYWTEgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMSkKWFkyIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTIpClhZMyA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUzKQpERjEgPC0gZGF0YS5mcmFtZSh4ID0gWFkxWywxXSwgeSA9IFhZMVssMl0sIHogPSBkZmwxKQpERjIgPC0gZGF0YS5mcmFtZSh4ID0gWFkyWywxXSwgeSA9IFhZMlssMl0sIHogPSBkZmwyKQpERjMgPC0gZGF0YS5mcmFtZSh4ID0gWFkzWywxXSwgeSA9IFhZM1ssMl0sIHogPSBkZmwzKQoKREYgPC0gcmJpbmQoREYxLCByZXAoTkEsIDMpLCBERjIsIHJlcChOQSwgMyksIERGMykKREZfTk9fTkEgPC0gcmJpbmQoREYxLCBERjIsIERGMykKCgoKc3RhcjNkZGdfcGF0aDMgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRnKjAsIHZlcnRleF9zaXplID0gZ3N3LCBsaW5lX2NvbG9yID0gImJsYWNrIiwgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IC1keTIsCiAgdiA9IC1keDIsCiAgdyA9IC1kejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2luaV95LCBlM19maW5feSksCiAgICB5ID0gYyhlM19pbmlfeCwgZTNfZmluX3gpLAogICAgeiA9IGMoZTNfaW5pX3osIGUzX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlMV9maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTFfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZyd8X3twX3tcXGhhdHtlfV8yZV8xfX0pJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfZmluX3ksIHkgPSBlMl9maW5feCwgeiA9IGUyX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlM19maW5feSwgeSA9IGUzX2Zpbl94LCB6ID0gZTNfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCnNhdmUoc3RhcjNkZGdfcGF0aDEsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgxLlJkYXRhIikpCnNhdmUoc3RhcjNkZGdfcGF0aDIsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgyLlJkYXRhIikpCnNhdmUoc3RhcjNkZGdfcGF0aDMsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgzLlJkYXRhIikpCgpgYGAKCgpGb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCBGaWd1cmUgNyBhbmQgOCBzaG93cyAkZycnJCBhbmQgJGcnJyckLgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcgPSBcXHtnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGdfe2VfaX0ocykgPSBcXGNvcyhcXGRmcmFje1xccGkgc317XFxlbGx9KSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZy5SZGF0YSIpKQpzdGFyM2cKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZycgPSBcXHtnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJ197ZV9pfShzKSA9IC1cXGRmcmFje1xccGl9e1xcZWxsfVxcc2luKFxcZGZyYWN7XFxwaSBzfXtcXGVsbH0pJCBmb3IgJGk9MSwyLDMkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZy5SZGF0YSIpKQpzdGFyM2RnCmBgYAoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcnJyA9IFxce2cnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJydfe2VfaX0ocykgPSAtXFxkZnJhY3tcXHBpXjJ9e1xcZWxsXjJ9XFxjb3MoXFxkZnJhY3tcXHBpIHN9e1xcZWxsfSkkIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZy5SZGF0YSIpKQpzdGFyM2RkZwpgYGAKCgo6OjoKCjo6OiB7fQoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRnJycnID0gXFx7ZycnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJycnX3tlX2l9KHMpID0gXFxkZnJhY3tcXHBpXjN9e1xcZWxsXjN9XFxzaW4oXFxkZnJhY3tcXHBpIHN9e1xcZWxsfSkkIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGcuUmRhdGEiKSkKc3RhcjNkZGRnCmBgYAoKCjo6OgoKOjo6OgoKIyBFeGFtcGxlIG9mIGEgZnVuY3Rpb24gJGhcaW4gQ14xKFxHYW1tYSlcY2FwIFxtYXRoY2Fse0t9KFxHYW1tYSkkIHdoZXJlICRoJyQgbG9va3MgZGlzY29udGludW91cwoKCkxldCB1cyBjb25zaWRlciB0aGUgJDIkLXN0YXIgZ3JhcGggJFxHYW1tYSA9IChcbWF0aGNhbHtWfSwgXG1hdGhjYWx7RX0pJCwgd2hlcmUgJFxtYXRoY2Fse1Z9ID0gXHt2LCB2XzEsIHZfMlx9JCBhbmQgJFxtYXRoY2Fse0V9ID0gXHtlXzEsIGVfMlx9JC4gRWFjaCBlZGdlICRlX2kkIGhhcyBjb21tb24gbGVuZ3RoICRcZWxsJCBhbmQgY29ubmVjdHMgdGhlIGNlbnRyYWwgdmVydGV4ICR2JCB0byB0aGUgb3V0ZXIgdmVydGV4ICR2X2kkIGZvciAkaT0xLDIkIGluIHN1Y2ggYSB3YXkgdGhhdCAkdiA9IFx1bmRlcmxpbmV7ZV8xfSA9IFx1bmRlcmxpbmV7ZV8yfSQuIE9uICRcR2FtbWEkLCB3ZSBkZWZpbmUgdGhlIGZ1bmN0aW9uICRoID0gXHtoX2VcfV97ZVxpblxtYXRoY2Fse0V9fSQgdmlhCgokJApoX3tlXzF9KHMpID0gYSArIGJfMSBzIC0gXGZyYWN7Yl8xIHNeM317M1xlbGxeMn0sIFxxdWFkIGhfe2VfMn0ocykgPSBhICsgYl8yIHMgLSBcZnJhY3tiXzIgc14zfXszXGVsbF4yfS4KJCQKQ2xlYXJseSwgJGgkIGlzIGEgY29udGludW91cyBmdW5jdGlvbiAoc2VlIEZpZ3VyZSA5KSBzaW5jZQokJApoX3tlXzF9KDApID0gaF97ZV8yfShzKSA9IGEuCiQkClRoZSBkZXJpdmF0aXZlICRoJyA9IFx7aCdfZVx9X3tlXGluXG1hdGhjYWx7RX19JCBvZiAkaCQgb24gZWFjaCBlZGdlIGlzIGdpdmVuIGJ5CgokJApoX3tlXzF9JyhzKSA9IGJfMSAtIFxmcmFje2JfMSBzXjJ9e1xlbGxeMn0sIFxxdWFkIGhfe2VfMn0nKHMpID0gYl8yIC0gXGZyYWN7Yl8yIHNeMn17XGVsbF4yfS4KJCQKQnkgY2hvb3NpbmcgJGJfMT0xJCBhbmQgJGJfMj0tMSQsIHdlIGhhdmUgdGhhdCAKJCQKaF97ZV8xfScoMCkraF97ZV8yfScoMCkgPSBiXzErYl8yPTBccXVhZFx0ZXh0eyBhbmQgfVxxdWFkIGhfe2VfMX0nKFxlbGwpID1oX3tlXzJ9JyhcZWxsKSA9IDAsCiQkCnNvIHRoYXQgJGgkIHNhdGlzZmllcyB0aGUgS2lyY2hob2ZmIGNvbmRpdGlvbnMgYXQgZXZlcnkgdmVydGV4LiBUaGlzIG1lYW5zIHRoYXQgJGgnJCBzaG91bGQgYmUgYSBjb250aW51b3VzIGZ1bmN0aW9uLiBIb3dldmVyLCBGaWd1cmUgMTAgc2hvd3MgdGhhdCAkaCckIGlzIGRpc2NvbnRpbnVvdXMuIFRoaXMgaXMgYWN0dWFsbHkgYW4gYXJ0ZWZhY3QgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGVkZ2VzIGFyZSBub3QgY29tcGF0aWJsZSBvcmllbnRlZC4gRm9yIGEgZGlzY3Vzc2lvbiBhYm91dCBjb21wYXRpYmxlIG9yaWVudGF0aW9uLCBnbyB0byB0aGlzIFtwYWdlXShncmFwaHMzLmh0bWwpLgoKYGBge3J9Cm4gPC0gMgpteV9sZW5ndGggPC0gMgplZGdlcyA8LWVkZ2VzX3Jvb3RzX29mX3VuaXR5KG4sIGxlbmd0aCA9IG15X2xlbmd0aCkKZWRnZXNbWzFdXSA8LSByYmluZChjKDAsIDApLCBjKG15X2xlbmd0aCwgMCkpCmVkZ2VzW1syXV0gPC0gcmJpbmQoYygwLCAwKSwgYygtbXlfbGVuZ3RoLCAwKSkKZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhlZGdlcyA9IGVkZ2VzKQpncmFwaF9kaXNjIDwtIGdyYXBoJGNsb25lKCkKZ3JhcGgkYnVpbGRfbWVzaChoID0gaCkKZ3JhcGhfZGlzYyRidWlsZF9tZXNoKGggPSBoLCBjb250aW51b3VzID0gRkFMU0UpCmBgYAoKCmBgYHtyfQojIEdlbmVyYWwgcGFyYW1ldGVycwpMIDwtIG15X2xlbmd0aCAgICAgICAgICAgICAjIGVkZ2UgbGVuZ3RoCmEgPC0gMSAgICAgICAgICAgICAjIHZhbHVlIGF0IGNlbnRyYWwgdmVydGV4CmIgPC0gYygxLCAtMSkgICAjIGIxK2IyK2IzIG11c3QgYmUgMAoKZjEgPC0gZnVuY3Rpb24ocykgYSArIGJbMV0qcyAtIGJbMV0qc14zLygzKkxeMikKZjIgPC0gZnVuY3Rpb24ocykgYSArIGJbMl0qcyAtIGJbMl0qc14zLygzKkxeMikKCgpkZjEgPC0gZnVuY3Rpb24ocykgYlsxXSAtIGJbMV0qc14yL0xeMgpkZjIgPC0gZnVuY3Rpb24ocykgYlsyXSAtIGJbMl0qc14yL0xeMgoKZGRmMSA8LSBmdW5jdGlvbihzKSAtMipiWzFdKnMvTF4yCmRkZjIgPC0gZnVuY3Rpb24ocykgLTIqYlsyXSpzL0xeMgoKZGRkZjEgPC0gZnVuY3Rpb24ocykgLTIqYlsxXS9MXjIKZGRkZjIgPC0gZnVuY3Rpb24ocykgLTIqYlsyXS9MXjIKCmZfbGlzdCA8LSBsaXN0KGYxLCBmMikKZGZfbGlzdCA8LSBsaXN0KGRmMSwgZGYyKQpkZGZfbGlzdCA8LSBsaXN0KGRkZjEsIGRkZjIpCmRkZGZfbGlzdCA8LSBsaXN0KGRkZGYxLCBkZGRmMikKCmYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZl9saXN0KQpkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRmX2xpc3QpCmRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGZfbGlzdCkKZGRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRkZGZfbGlzdCkKYGBgCgpgYGB7cn0KbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZjEobF9tZXNoKQpkZmwyIDwtIGRmMihsX21lc2gpCgpsX21lc2hfbm9ybSA8LSBsX21lc2gvbXlfbGVuZ3RoClB0RTEgPC0gY2JpbmQocmVwKDEsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTIgPC0gY2JpbmQocmVwKDIsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClhZMSA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUxKQpYWTIgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMikKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyKQpERl9OT19OQSA8LSByYmluZChERjEsIERGMikKYGBgCgoKYGBge3J9CnN0YXIyZiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGU0X2Zpbl95LCB5ID0gZTRfZmluX3gsIHogPSBlNF9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTQsIHkgPSB4bTQsIHogPSB6bTQsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzdGFyMmRmIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGYqMCwgdmVydGV4X3NpemUgPSBnc3csIGxpbmVfY29sb3IgPSAiYmxhY2siLCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW00LAogIHkgPSB4bTQsCiAgeiA9IHptNCwKICB1ID0gZHk0LAogIHYgPSBkeDQsCiAgdyA9IGR6NCwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREZfTk9fTkEkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERl9OT19OQSR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERl9OT19OQSR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCciKSwgeSA9IDAuOCksIAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlNF9maW5feSwgeSA9IGU0X2Zpbl94LCB6ID0gZTRfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW00LCB5ID0geG00LCB6ID0gem00LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjJkZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCcnIiksIHkgPSAwLjgpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTRfZmluX3ksIHkgPSBlNF9maW5feCwgeiA9IGU0X2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltNCwgeSA9IHhtNCwgeiA9IHptNCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCnN0YXIyZGRkZiA8LSBncmFwaF9kaXNjJHBsb3RfZnVuY3Rpb24oWCA9IGRkZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCBjb250aW51b3VzID0gRkFMU0UsIGludGVycG9sYXRlX3Bsb3QgPSBUUlVFLCB0eXBlID0gInBsb3RseSIpIHw+IAogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJoJycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlNF9maW5feSwgeSA9IGU0X2Zpbl94LCB6ID0gZTRfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW00LCB5ID0geG00LCB6ID0gem00LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCnNhdmUoc3RhcjJmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmYuUmRhdGEiKSkKc2F2ZShzdGFyMmRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmRmLlJkYXRhIikpCnNhdmUoc3RhcjJkZGYsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZGRmLlJkYXRhIikpCnNhdmUoc3RhcjJkZGRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmRkZGYuUmRhdGEiKSkKYGBgCgoKRm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgRmlndXJlIDExIGFuZCAxMiBzaG93cyAkaCcnJCBhbmQgJGgnJyckLgoKCjo6Ojoge3N0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4NXB4IDQ4NXB4IDQ4NXB4IDQ4NXB4OyBncmlkLWNvbHVtbi1nYXA6IDBweDsifQoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCA9IFxce2hfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaF97ZV9pfShzKSA9IGEgKyBiX2kgcyAtIFxcZGZyYWN7Yl9pIHNeM317M1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZi5SZGF0YSIpKQpzdGFyMmYKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnID0gXFx7aCdfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaCdfe2VfaX0ocykgPSBiX2kgLSBcXGRmcmFje2JfaSBzXjJ9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZGYuUmRhdGEiKSkKc3RhcjJkZgpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcnID0gXFx7aCcnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnJ197ZV9pfShzKSA9ICAtIFxcZGZyYWN7MiBiX2kgc317XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjJkZGYuUmRhdGEiKSkKc3RhcjJkZGYKYGBgCgoKOjo6CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJycnID0gXFx7aCcnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJycnX3tlX2l9KHMpID0gIC0gXFxkZnJhY3syIGJfaX17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjJkZGRmLlJkYXRhIikpCnN0YXIyZGRkZgpgYGAKCgo6OjoKCgo6Ojo6CgoKIyBQYXRoIGRlcml2YXRpdmVzCgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoID0gXFx7aF9lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoX3tlX2l9KHMpID0gYSArIGJfaSBzIC0gXFxkZnJhY3tiX2kgc14zfXszXFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZ19wYXRoMS5SZGF0YSIpKQpzdGFyM2RnX3BhdGgxCmBgYAoKCjo6OgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJyA9IFxce2gnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnX3tlX2l9KHMpID0gYl9pIC0gXFxkZnJhY3tiX2kgc14yfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGgyLlJkYXRhIikpCnN0YXIzZGdfcGF0aDIKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJyA9IFxce2gnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pIHN9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aDMuUmRhdGEiKSkKc3RhcjNkZ19wYXRoMwpgYGAKCgo6OjoKCgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJycgPSBcXHtoJydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaCcnX3tlX2l9KHMpID0gIC0gXFxkZnJhY3syIGJfaSBzfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGhfb2suUmRhdGEiKSkKc3RhcjNkZ19wYXRoX29rCmBgYAoKCjo6OgoKCjo6OjoKCgoKIyBQYXRoIGRlcml2YXRpdmVzIDIKCgo6Ojo6IHtzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0ODVweCA0ODVweCA0ODVweCA0ODVweDsgZ3JpZC1jb2x1bW4tZ2FwOiAwcHg7In0KCgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGggPSBcXHtoX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGhfe2VfaX0ocykgPSBhICsgYl9pIHMgLSBcXGRmcmFje2JfaSBzXjN9ezNcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZ19wYXRoMS5SZGF0YSIpKQpzdGFyM2RkZ19wYXRoMQpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcgPSBcXHtoJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJ197ZV9pfShzKSA9IGJfaSAtIFxcZGZyYWN7Yl9pIHNeMn17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZGdfcGF0aDIuUmRhdGEiKSkKc3RhcjNkZGdfcGF0aDIKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJyA9IFxce2gnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pIHN9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgzLlJkYXRhIikpCnN0YXIzZGRnX3BhdGgzCmBgYAoKCjo6OgoKCjo6OjoKCiMgUmVmZXJlbmNlcwoKYGBge3IsIGV2YWwgPVRSVUV9CmdyYXRlZnVsOjpjaXRlX3BhY2thZ2VzKG91dHB1dCA9ICJwYXJhZ3JhcGgiLCBvdXQuZGlyID0gIi4iKQpgYGAKCg==