portais = read_csv(here::here("data/requests-portais.csv"), col_types = 'cd')

glimpse(portais)
Rows: 120
Columns: 2
$ site <chr> "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1", "g1"…
$ time <dbl> 1.600459, 1.471800, 1.398192, 1.380360, 1.386828, 1.529101, 1.393405, 1.357071, 1.402241, 1.421621, 1.5732…
boxplot(time~site,
data=portais,
main="Diferentes boxplot para cada tempo de acesso ao site",
xlab="SITES",
ylab="tempo de resposta",
col="orange",
border="brown"
)

portais %>%
  ggplot(aes(x=time, y=site, fill = ..x..)) +
  geom_density_ridges_gradient(scale = 1, rel_min_height = 0.01) +
  scale_fill_viridis(name = "Time", option = "C") +
  labs(
    title = "Gráfico de densidade dos tempos de requisição",
    y = "site",
    x = ""
  )
Picking joint bandwidth of 0.0143

Média dos tempos de respostas dos dados que tivemos.

s <- function(d, i) {
    sumarizado = d[i,] %>% 
        summarise(saida = mean(time))
    
    sumarizado %>% 
      pull(saida)
}

booted <- boot(data = filter(portais, site > 0), 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "basic",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.7126767
$ bias      <dbl> 0.0004759096
$ std.error <dbl> 0.04028966
$ conf.low  <dbl> 0.6297315
$ conf.high <dbl> 0.7880092
abusaram = nrow(filter(portais, time > 0))

estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "media do tempo"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0, 1)) +
    labs(
        title = "ic p media de requisiçoes em 
        todos os sites",
        x = "", y = "proporção da media de tempo") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='uol') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.3556272
$ bias      <dbl> 0.0001132402
$ std.error <dbl> 0.003764978
$ conf.low  <dbl> 0.3511333
$ conf.high <dbl> 0.3711073
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "uol"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0.3, 0.4)) +
    labs(
        title = "bootstrap de uol",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='g1') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 1.443589
$ bias      <dbl> -0.0003648705
$ std.error <dbl> 0.01412669
$ conf.low  <dbl> 1.41999
$ conf.high <dbl> 1.479095
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "g1"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(1.4,1.5)) +
    labs(
        title = "bootstrap de g1",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='folha') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.3791591
$ bias      <dbl> 0.0001237104
$ std.error <dbl> 0.006366766
$ conf.low  <dbl> 0.3715093
$ conf.high <dbl> 0.4046983
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "folha"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0.3, 0.5)) +
    labs(
        title = "bootstrap da folha",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='terra') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.6723314
$ bias      <dbl> 0.0002129121
$ std.error <dbl> 0.009258262
$ conf.low  <dbl> 0.6594893
$ conf.high <dbl> 0.699436
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "terra"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0.63, 0.71)) +
    labs(
        title = "bootstrap do terra",
        x = "", y = "") +
    coord_flip()

A partir daqui iremos ver a diferença entre os mais rapidos e mais lentos

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='folha') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
    
    b = d[i,] %>% 
        filter(time > 0, site=='uol') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
    a-b
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.02353193
$ bias      <dbl> -8.626706e-05
$ std.error <dbl> 0.007263431
$ conf.low  <dbl> 0.01258833
$ conf.high <dbl> 0.0447813
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "folha -uol "
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0, .2)) +
    labs(
        title = "bootstrap de folha-uol ",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='g1') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
    
    b = d[i,] %>% 
        filter(time > 0, site=='terra') %>% 
        summarise(do_grupo = mean(time)) %>% 
        pull(do_grupo)
    a-b
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 5
$ statistic <dbl> 0.7712579
$ bias      <dbl> -0.0008769099
$ std.error <dbl> 0.01678933
$ conf.low  <dbl> 0.7391313
$ conf.high <dbl> 0.8057938
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "g1- terra"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0,1)) +
    labs(
        title = "diferença entre g1- terra ",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='g1') %>% 
        summarise(do_grupo = quantile(time, 0.75)) %>% 
        pull(do_grupo)
    
    b = d[i,] %>% 
        filter(time > 0, site=='terra') %>% 
        summarise(do_grupo = quantile(time, 0.75)) %>% 
        pull(do_grupo)
    a - b
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 6
$ term      <chr> "75%"
$ statistic <dbl> 0.8024518
$ bias      <dbl> -0.001828
$ std.error <dbl> 0.02717992
$ conf.low  <dbl> 0.734869
$ conf.high <dbl> 0.8488607
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "g1- terra"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0,1)) +
    labs(
        title = "diferença entre g1- terra usando 75 
        percentil ",
        x = "", y = "") +
    coord_flip()

s <- function(d, i) {
    a = d[i,] %>% 
        filter(time > 0, site=='folha') %>% 
        summarise(do_grupo = quantile(time, 0.75)) %>% 
        pull(do_grupo)
    
    b = d[i,] %>% 
        filter(time > 0, site=='uol') %>% 
        summarise(do_grupo = quantile(time, 0.75)) %>% 
        pull(do_grupo)
    a - b
}

  booted <- boot(data = portais, 
               statistic = s, 
               R = 2000)

estimado = tidy(booted, 
                conf.level = .95,
                conf.method = "bca",
                conf.int = TRUE)

glimpse(estimado)
Rows: 1
Columns: 6
$ term      <chr> "75%"
$ statistic <dbl> 0.019703
$ bias      <dbl> 0.0009260522
$ std.error <dbl> 0.003659925
$ conf.low  <dbl> 0.01359475
$ conf.high <dbl> 0.02665727
estimado %>% 
    ggplot(aes(
        ymin = conf.low,
        y = statistic,
        ymax = conf.high,
        x = "folha - uol"
    )) +
    geom_linerange() +
    geom_point(color = "steelblue", size = 2) +
    geom_text(
        aes(
            y = conf.high,
            label = str_glue("[{round(conf.low, 2)}, {round(conf.high, 2)}]")
        ),
        size = 3,
        nudge_x = -.05,
        show.legend = F
    )  +
    scale_y_continuous(limits = c(0, .2)) +
    labs(
        title = "diferença entre folha - uol usando 75 
        percentil ",
        x = "", y = "") +
    coord_flip()

LS0tCnRpdGxlOiAiQ2FycmVnYW1lbnRvIGRlIHBvcnRhaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGhyYnJ0aGVtZXMpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShnZ3JpZGdlcykKdGhlbWVfc2V0KHRoZW1lX2lwc3VtX3JjKCkpCgpsaWJyYXJ5KGJvb3QpCmxpYnJhcnkoYnJvb20pCmBgYAoKYGBge3J9CnBvcnRhaXMgPSByZWFkX2NzdihoZXJlOjpoZXJlKCJkYXRhL3JlcXVlc3RzLXBvcnRhaXMuY3N2IiksIGNvbF90eXBlcyA9ICdjZCcpCgpnbGltcHNlKHBvcnRhaXMpCmBgYAoKYGBge3J9CmJveHBsb3QodGltZX5zaXRlLApkYXRhPXBvcnRhaXMsCm1haW49IkRpZmVyZW50ZXMgYm94cGxvdCBwYXJhIGNhZGEgdGVtcG8gZGUgYWNlc3NvIGFvIHNpdGUiLAp4bGFiPSJTSVRFUyIsCnlsYWI9InRlbXBvIGRlIHJlc3Bvc3RhIiwKY29sPSJvcmFuZ2UiLApib3JkZXI9ImJyb3duIgopCmBgYAoKCmBgYHtyfQpwb3J0YWlzICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNpdGUsIGZpbGwgPSAuLnguLikpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gMSwgcmVsX21pbl9oZWlnaHQgPSAwLjAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWUgPSAiVGltZSIsIG9wdGlvbiA9ICJDIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJHcsOhZmljbyBkZSBkZW5zaWRhZGUgZG9zIHRlbXBvcyBkZSByZXF1aXNpw6fDo28iLAogICAgeSA9ICJzaXRlIiwKICAgIHggPSAiIgogICkKYGBgCk3DqWRpYSBkb3MgdGVtcG9zIGRlIHJlc3Bvc3RhcyBkb3MgZGFkb3MgcXVlIHRpdmVtb3MuCmBgYHtyfQpzIDwtIGZ1bmN0aW9uKGQsIGkpIHsKICAgIHN1bWFyaXphZG8gPSBkW2ksXSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKHNhaWRhID0gbWVhbih0aW1lKSkKICAgIAogICAgc3VtYXJpemFkbyAlPiUgCiAgICAgIHB1bGwoc2FpZGEpCn0KCmJvb3RlZCA8LSBib290KGRhdGEgPSBmaWx0ZXIocG9ydGFpcywgc2l0ZSA+IDApLCAKICAgICAgICAgICAgICAgc3RhdGlzdGljID0gcywgCiAgICAgICAgICAgICAgIFIgPSAyMDAwKQoKZXN0aW1hZG8gPSB0aWR5KGJvb3RlZCwgCiAgICAgICAgICAgICAgICBjb25mLmxldmVsID0gLjk1LAogICAgICAgICAgICAgICAgY29uZi5tZXRob2QgPSAiYmFzaWMiLAogICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQoKZ2xpbXBzZShlc3RpbWFkbykKYGBgCgoKYGBge3J9CmFidXNhcmFtID0gbnJvdyhmaWx0ZXIocG9ydGFpcywgdGltZSA+IDApKQoKZXN0aW1hZG8gJT4lIAogICAgZ2dwbG90KGFlcygKICAgICAgICB5bWluID0gY29uZi5sb3csCiAgICAgICAgeSA9IHN0YXRpc3RpYywKICAgICAgICB5bWF4ID0gY29uZi5oaWdoLAogICAgICAgIHggPSAibWVkaWEgZG8gdGVtcG8iCiAgICApKSArCiAgICBnZW9tX2xpbmVyYW5nZSgpICsKICAgIGdlb21fcG9pbnQoY29sb3IgPSAic3RlZWxibHVlIiwgc2l6ZSA9IDIpICsKICAgIGdlb21fdGV4dCgKICAgICAgICBhZXMoCiAgICAgICAgICAgIHkgPSBjb25mLmhpZ2gsCiAgICAgICAgICAgIGxhYmVsID0gc3RyX2dsdWUoIlt7cm91bmQoY29uZi5sb3csIDIpfSwge3JvdW5kKGNvbmYuaGlnaCwgMil9XSIpCiAgICAgICAgKSwKICAgICAgICBzaXplID0gMywKICAgICAgICBudWRnZV94ID0gLS4wNSwKICAgICAgICBzaG93LmxlZ2VuZCA9IEYKICAgICkgICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gImljIHAgbWVkaWEgZGUgcmVxdWlzacOnb2VzIGVtIAogICAgICAgIHRvZG9zIG9zIHNpdGVzIiwKICAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9yw6fDo28gZGEgbWVkaWEgZGUgdGVtcG8iKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgoKYGBge3J9CnMgPC0gZnVuY3Rpb24oZCwgaSkgewogICAgYSA9IGRbaSxdICU+JSAKICAgICAgICBmaWx0ZXIodGltZSA+IDAsIHNpdGU9PSd1b2wnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCn0KCiAgYm9vdGVkIDwtIGJvb3QoZGF0YSA9IHBvcnRhaXMsIAogICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBzLCAKICAgICAgICAgICAgICAgUiA9IDIwMDApCgplc3RpbWFkbyA9IHRpZHkoYm9vdGVkLCAKICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAuOTUsCiAgICAgICAgICAgICAgICBjb25mLm1ldGhvZCA9ICJiY2EiLAogICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQoKZ2xpbXBzZShlc3RpbWFkbykKYGBgCgoKYGBge3J9CmVzdGltYWRvICU+JSAKICAgIGdncGxvdChhZXMoCiAgICAgICAgeW1pbiA9IGNvbmYubG93LAogICAgICAgIHkgPSBzdGF0aXN0aWMsCiAgICAgICAgeW1heCA9IGNvbmYuaGlnaCwKICAgICAgICB4ID0gInVvbCIKICAgICkpICsKICAgIGdlb21fbGluZXJhbmdlKCkgKwogICAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKwogICAgZ2VvbV90ZXh0KAogICAgICAgIGFlcygKICAgICAgICAgICAgeSA9IGNvbmYuaGlnaCwKICAgICAgICAgICAgbGFiZWwgPSBzdHJfZ2x1ZSgiW3tyb3VuZChjb25mLmxvdywgMil9LCB7cm91bmQoY29uZi5oaWdoLCAyKX1dIikKICAgICAgICApLAogICAgICAgIHNpemUgPSAzLAogICAgICAgIG51ZGdlX3ggPSAtLjA1LAogICAgICAgIHNob3cubGVnZW5kID0gRgogICAgKSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4zLCAwLjQpKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gImJvb3RzdHJhcCBkZSB1b2wiLAogICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgoKCmBgYHtyfQpzIDwtIGZ1bmN0aW9uKGQsIGkpIHsKICAgIGEgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0nZzEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCn0KCiAgYm9vdGVkIDwtIGJvb3QoZGF0YSA9IHBvcnRhaXMsIAogICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBzLCAKICAgICAgICAgICAgICAgUiA9IDIwMDApCgplc3RpbWFkbyA9IHRpZHkoYm9vdGVkLCAKICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAuOTUsCiAgICAgICAgICAgICAgICBjb25mLm1ldGhvZCA9ICJiY2EiLAogICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQoKZ2xpbXBzZShlc3RpbWFkbykKYGBgCgoKYGBge3J9CmVzdGltYWRvICU+JSAKICAgIGdncGxvdChhZXMoCiAgICAgICAgeW1pbiA9IGNvbmYubG93LAogICAgICAgIHkgPSBzdGF0aXN0aWMsCiAgICAgICAgeW1heCA9IGNvbmYuaGlnaCwKICAgICAgICB4ID0gImcxIgogICAgKSkgKwogICAgZ2VvbV9saW5lcmFuZ2UoKSArCiAgICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArCiAgICBnZW9tX3RleHQoCiAgICAgICAgYWVzKAogICAgICAgICAgICB5ID0gY29uZi5oaWdoLAogICAgICAgICAgICBsYWJlbCA9IHN0cl9nbHVlKCJbe3JvdW5kKGNvbmYubG93LCAyKX0sIHtyb3VuZChjb25mLmhpZ2gsIDIpfV0iKQogICAgICAgICksCiAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgbnVkZ2VfeCA9IC0uMDUsCiAgICAgICAgc2hvdy5sZWdlbmQgPSBGCiAgICApICArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygxLjQsMS41KSkgKwogICAgbGFicygKICAgICAgICB0aXRsZSA9ICJib290c3RyYXAgZGUgZzEiLAogICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgoKCmBgYHtyfQpzIDwtIGZ1bmN0aW9uKGQsIGkpIHsKICAgIGEgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0nZm9saGEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCn0KCiAgYm9vdGVkIDwtIGJvb3QoZGF0YSA9IHBvcnRhaXMsIAogICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBzLCAKICAgICAgICAgICAgICAgUiA9IDIwMDApCgplc3RpbWFkbyA9IHRpZHkoYm9vdGVkLCAKICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAuOTUsCiAgICAgICAgICAgICAgICBjb25mLm1ldGhvZCA9ICJiY2EiLAogICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQoKZ2xpbXBzZShlc3RpbWFkbykKYGBgCgoKYGBge3J9CmVzdGltYWRvICU+JSAKICAgIGdncGxvdChhZXMoCiAgICAgICAgeW1pbiA9IGNvbmYubG93LAogICAgICAgIHkgPSBzdGF0aXN0aWMsCiAgICAgICAgeW1heCA9IGNvbmYuaGlnaCwKICAgICAgICB4ID0gImZvbGhhIgogICAgKSkgKwogICAgZ2VvbV9saW5lcmFuZ2UoKSArCiAgICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArCiAgICBnZW9tX3RleHQoCiAgICAgICAgYWVzKAogICAgICAgICAgICB5ID0gY29uZi5oaWdoLAogICAgICAgICAgICBsYWJlbCA9IHN0cl9nbHVlKCJbe3JvdW5kKGNvbmYubG93LCAyKX0sIHtyb3VuZChjb25mLmhpZ2gsIDIpfV0iKQogICAgICAgICksCiAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgbnVkZ2VfeCA9IC0uMDUsCiAgICAgICAgc2hvdy5sZWdlbmQgPSBGCiAgICApICArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjMsIDAuNSkpICsKICAgIGxhYnMoCiAgICAgICAgdGl0bGUgPSAiYm9vdHN0cmFwIGRhIGZvbGhhIiwKICAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogICAgY29vcmRfZmxpcCgpCmBgYAoKCmBgYHtyfQpzIDwtIGZ1bmN0aW9uKGQsIGkpIHsKICAgIGEgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0ndGVycmEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCn0KCiAgYm9vdGVkIDwtIGJvb3QoZGF0YSA9IHBvcnRhaXMsIAogICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBzLCAKICAgICAgICAgICAgICAgUiA9IDIwMDApCgplc3RpbWFkbyA9IHRpZHkoYm9vdGVkLCAKICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAuOTUsCiAgICAgICAgICAgICAgICBjb25mLm1ldGhvZCA9ICJiY2EiLAogICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFKQoKZ2xpbXBzZShlc3RpbWFkbykKYGBgCgoKYGBge3J9CmVzdGltYWRvICU+JSAKICAgIGdncGxvdChhZXMoCiAgICAgICAgeW1pbiA9IGNvbmYubG93LAogICAgICAgIHkgPSBzdGF0aXN0aWMsCiAgICAgICAgeW1heCA9IGNvbmYuaGlnaCwKICAgICAgICB4ID0gInRlcnJhIgogICAgKSkgKwogICAgZ2VvbV9saW5lcmFuZ2UoKSArCiAgICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArCiAgICBnZW9tX3RleHQoCiAgICAgICAgYWVzKAogICAgICAgICAgICB5ID0gY29uZi5oaWdoLAogICAgICAgICAgICBsYWJlbCA9IHN0cl9nbHVlKCJbe3JvdW5kKGNvbmYubG93LCAyKX0sIHtyb3VuZChjb25mLmhpZ2gsIDIpfV0iKQogICAgICAgICksCiAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgbnVkZ2VfeCA9IC0uMDUsCiAgICAgICAgc2hvdy5sZWdlbmQgPSBGCiAgICApICArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjYzLCAwLjcxKSkgKwogICAgbGFicygKICAgICAgICB0aXRsZSA9ICJib290c3RyYXAgZG8gdGVycmEiLAogICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgICBjb29yZF9mbGlwKCkKYGBgCgpBIHBhcnRpciBkYXF1aSBpcmVtb3MgdmVyIGEgZGlmZXJlbsOnYSBlbnRyZSBvcyBtYWlzIHJhcGlkb3MgZSBtYWlzIGxlbnRvcwpgYGB7cn0KcyA8LSBmdW5jdGlvbihkLCBpKSB7CiAgICBhID0gZFtpLF0gJT4lIAogICAgICAgIGZpbHRlcih0aW1lID4gMCwgc2l0ZT09J2ZvbGhhJykgJT4lIAogICAgICAgIHN1bW1hcmlzZShkb19ncnVwbyA9IG1lYW4odGltZSkpICU+JSAKICAgICAgICBwdWxsKGRvX2dydXBvKQogICAgCiAgICBiID0gZFtpLF0gJT4lIAogICAgICAgIGZpbHRlcih0aW1lID4gMCwgc2l0ZT09J3VvbCcpICU+JSAKICAgICAgICBzdW1tYXJpc2UoZG9fZ3J1cG8gPSBtZWFuKHRpbWUpKSAlPiUgCiAgICAgICAgcHVsbChkb19ncnVwbykKICAgIGEtYgp9CgogIGJvb3RlZCA8LSBib290KGRhdGEgPSBwb3J0YWlzLCAKICAgICAgICAgICAgICAgc3RhdGlzdGljID0gcywgCiAgICAgICAgICAgICAgIFIgPSAyMDAwKQoKZXN0aW1hZG8gPSB0aWR5KGJvb3RlZCwgCiAgICAgICAgICAgICAgICBjb25mLmxldmVsID0gLjk1LAogICAgICAgICAgICAgICAgY29uZi5tZXRob2QgPSAiYmNhIiwKICAgICAgICAgICAgICAgIGNvbmYuaW50ID0gVFJVRSkKCmdsaW1wc2UoZXN0aW1hZG8pCmBgYAoKCmBgYHtyfQplc3RpbWFkbyAlPiUgCiAgICBnZ3Bsb3QoYWVzKAogICAgICAgIHltaW4gPSBjb25mLmxvdywKICAgICAgICB5ID0gc3RhdGlzdGljLAogICAgICAgIHltYXggPSBjb25mLmhpZ2gsCiAgICAgICAgeCA9ICJmb2xoYSAtdW9sICIKICAgICkpICsKICAgIGdlb21fbGluZXJhbmdlKCkgKwogICAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKwogICAgZ2VvbV90ZXh0KAogICAgICAgIGFlcygKICAgICAgICAgICAgeSA9IGNvbmYuaGlnaCwKICAgICAgICAgICAgbGFiZWwgPSBzdHJfZ2x1ZSgiW3tyb3VuZChjb25mLmxvdywgMil9LCB7cm91bmQoY29uZi5oaWdoLCAyKX1dIikKICAgICAgICApLAogICAgICAgIHNpemUgPSAzLAogICAgICAgIG51ZGdlX3ggPSAtLjA1LAogICAgICAgIHNob3cubGVnZW5kID0gRgogICAgKSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgLjIpKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gImJvb3RzdHJhcCBkZSBmb2xoYS11b2wgIiwKICAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogICAgY29vcmRfZmxpcCgpCmBgYAoKCmBgYHtyfQpzIDwtIGZ1bmN0aW9uKGQsIGkpIHsKICAgIGEgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0nZzEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCiAgICAKICAgIGIgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0ndGVycmEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gbWVhbih0aW1lKSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCiAgICBhLWIKfQoKICBib290ZWQgPC0gYm9vdChkYXRhID0gcG9ydGFpcywgCiAgICAgICAgICAgICAgIHN0YXRpc3RpYyA9IHMsIAogICAgICAgICAgICAgICBSID0gMjAwMCkKCmVzdGltYWRvID0gdGlkeShib290ZWQsIAogICAgICAgICAgICAgICAgY29uZi5sZXZlbCA9IC45NSwKICAgICAgICAgICAgICAgIGNvbmYubWV0aG9kID0gImJjYSIsCiAgICAgICAgICAgICAgICBjb25mLmludCA9IFRSVUUpCgpnbGltcHNlKGVzdGltYWRvKQpgYGAKCgpgYGB7cn0KZXN0aW1hZG8gJT4lIAogICAgZ2dwbG90KGFlcygKICAgICAgICB5bWluID0gY29uZi5sb3csCiAgICAgICAgeSA9IHN0YXRpc3RpYywKICAgICAgICB5bWF4ID0gY29uZi5oaWdoLAogICAgICAgIHggPSAiZzEtIHRlcnJhIgogICAgKSkgKwogICAgZ2VvbV9saW5lcmFuZ2UoKSArCiAgICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArCiAgICBnZW9tX3RleHQoCiAgICAgICAgYWVzKAogICAgICAgICAgICB5ID0gY29uZi5oaWdoLAogICAgICAgICAgICBsYWJlbCA9IHN0cl9nbHVlKCJbe3JvdW5kKGNvbmYubG93LCAyKX0sIHtyb3VuZChjb25mLmhpZ2gsIDIpfV0iKQogICAgICAgICksCiAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgbnVkZ2VfeCA9IC0uMDUsCiAgICAgICAgc2hvdy5sZWdlbmQgPSBGCiAgICApICArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpKSArCiAgICBsYWJzKAogICAgICAgIHRpdGxlID0gImRpZmVyZW7Dp2EgZW50cmUgZzEtIHRlcnJhICIsCiAgICAgICAgeCA9ICIiLCB5ID0gIiIpICsKICAgIGNvb3JkX2ZsaXAoKQpgYGAKCgoKYGBge3J9CnMgPC0gZnVuY3Rpb24oZCwgaSkgewogICAgYSA9IGRbaSxdICU+JSAKICAgICAgICBmaWx0ZXIodGltZSA+IDAsIHNpdGU9PSdnMScpICU+JSAKICAgICAgICBzdW1tYXJpc2UoZG9fZ3J1cG8gPSBxdWFudGlsZSh0aW1lLCAwLjc1KSkgJT4lIAogICAgICAgIHB1bGwoZG9fZ3J1cG8pCiAgICAKICAgIGIgPSBkW2ksXSAlPiUgCiAgICAgICAgZmlsdGVyKHRpbWUgPiAwLCBzaXRlPT0ndGVycmEnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gcXVhbnRpbGUodGltZSwgMC43NSkpICU+JSAKICAgICAgICBwdWxsKGRvX2dydXBvKQogICAgYSAtIGIKfQoKICBib290ZWQgPC0gYm9vdChkYXRhID0gcG9ydGFpcywgCiAgICAgICAgICAgICAgIHN0YXRpc3RpYyA9IHMsIAogICAgICAgICAgICAgICBSID0gMjAwMCkKCmVzdGltYWRvID0gdGlkeShib290ZWQsIAogICAgICAgICAgICAgICAgY29uZi5sZXZlbCA9IC45NSwKICAgICAgICAgICAgICAgIGNvbmYubWV0aG9kID0gImJjYSIsCiAgICAgICAgICAgICAgICBjb25mLmludCA9IFRSVUUpCgpnbGltcHNlKGVzdGltYWRvKQpgYGAKYGBge3J9CmVzdGltYWRvICU+JSAKICAgIGdncGxvdChhZXMoCiAgICAgICAgeW1pbiA9IGNvbmYubG93LAogICAgICAgIHkgPSBzdGF0aXN0aWMsCiAgICAgICAgeW1heCA9IGNvbmYuaGlnaCwKICAgICAgICB4ID0gImcxLSB0ZXJyYSIKICAgICkpICsKICAgIGdlb21fbGluZXJhbmdlKCkgKwogICAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMikgKwogICAgZ2VvbV90ZXh0KAogICAgICAgIGFlcygKICAgICAgICAgICAgeSA9IGNvbmYuaGlnaCwKICAgICAgICAgICAgbGFiZWwgPSBzdHJfZ2x1ZSgiW3tyb3VuZChjb25mLmxvdywgMil9LCB7cm91bmQoY29uZi5oaWdoLCAyKX1dIikKICAgICAgICApLAogICAgICAgIHNpemUgPSAzLAogICAgICAgIG51ZGdlX3ggPSAtLjA1LAogICAgICAgIHNob3cubGVnZW5kID0gRgogICAgKSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSkgKwogICAgbGFicygKICAgICAgICB0aXRsZSA9ICJkaWZlcmVuw6dhIGVudHJlIGcxLSB0ZXJyYSB1c2FuZG8gNzUgCiAgICAgICAgcGVyY2VudGlsICIsCiAgICAgICAgeCA9ICIiLCB5ID0gIiIpICsKICAgIGNvb3JkX2ZsaXAoKQpgYGAKCgpgYGB7cn0KcyA8LSBmdW5jdGlvbihkLCBpKSB7CiAgICBhID0gZFtpLF0gJT4lIAogICAgICAgIGZpbHRlcih0aW1lID4gMCwgc2l0ZT09J2ZvbGhhJykgJT4lIAogICAgICAgIHN1bW1hcmlzZShkb19ncnVwbyA9IHF1YW50aWxlKHRpbWUsIDAuNzUpKSAlPiUgCiAgICAgICAgcHVsbChkb19ncnVwbykKICAgIAogICAgYiA9IGRbaSxdICU+JSAKICAgICAgICBmaWx0ZXIodGltZSA+IDAsIHNpdGU9PSd1b2wnKSAlPiUgCiAgICAgICAgc3VtbWFyaXNlKGRvX2dydXBvID0gcXVhbnRpbGUodGltZSwgMC43NSkpICU+JSAKICAgICAgICBwdWxsKGRvX2dydXBvKQogICAgYSAtIGIKfQoKICBib290ZWQgPC0gYm9vdChkYXRhID0gcG9ydGFpcywgCiAgICAgICAgICAgICAgIHN0YXRpc3RpYyA9IHMsIAogICAgICAgICAgICAgICBSID0gMjAwMCkKCmVzdGltYWRvID0gdGlkeShib290ZWQsIAogICAgICAgICAgICAgICAgY29uZi5sZXZlbCA9IC45NSwKICAgICAgICAgICAgICAgIGNvbmYubWV0aG9kID0gImJjYSIsCiAgICAgICAgICAgICAgICBjb25mLmludCA9IFRSVUUpCgpnbGltcHNlKGVzdGltYWRvKQpgYGAKCgpgYGB7cn0KZXN0aW1hZG8gJT4lIAogICAgZ2dwbG90KGFlcygKICAgICAgICB5bWluID0gY29uZi5sb3csCiAgICAgICAgeSA9IHN0YXRpc3RpYywKICAgICAgICB5bWF4ID0gY29uZi5oaWdoLAogICAgICAgIHggPSAiZm9saGEgLSB1b2wiCiAgICApKSArCiAgICBnZW9tX2xpbmVyYW5nZSgpICsKICAgIGdlb21fcG9pbnQoY29sb3IgPSAic3RlZWxibHVlIiwgc2l6ZSA9IDIpICsKICAgIGdlb21fdGV4dCgKICAgICAgICBhZXMoCiAgICAgICAgICAgIHkgPSBjb25mLmhpZ2gsCiAgICAgICAgICAgIGxhYmVsID0gc3RyX2dsdWUoIlt7cm91bmQoY29uZi5sb3csIDIpfSwge3JvdW5kKGNvbmYuaGlnaCwgMil9XSIpCiAgICAgICAgKSwKICAgICAgICBzaXplID0gMywKICAgICAgICBudWRnZV94ID0gLS4wNSwKICAgICAgICBzaG93LmxlZ2VuZCA9IEYKICAgICkgICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIC4yKSkgKwogICAgbGFicygKICAgICAgICB0aXRsZSA9ICJkaWZlcmVuw6dhIGVudHJlIGZvbGhhIC0gdW9sIHVzYW5kbyA3NSAKICAgICAgICBwZXJjZW50aWwgIiwKICAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogICAgY29vcmRfZmxpcCgpCmBgYA==