Tugas Pertemuan 11

Seven Tools Analysis

Logo

1 Several Application : Marketing

2 Cheet Sheet in R

##       Tanggal         Media                                    Respon
## 1  2025-05-01 Instagram Ads                 Tertarik, visualnya bagus
## 2  2025-05-02       YouTube                 Tertarik, visualnya bagus
## 3  2025-05-03        TikTok       Tidak relevan dengan kebutuhan saya
## 4  2025-05-04      Facebook       Tidak tertarik, terlalu banyak teks
## 5  2025-05-05     Billboard         Tidak suka, terlalu sering muncul
## 6  2025-05-06 Instagram Ads      Sangat tertarik, akan coba produknya
## 7  2025-05-07       YouTube             Biasa saja, kurang meyakinkan
## 8  2025-05-08         Radio         Tidak suka, terlalu sering muncul
## 9  2025-05-09      Facebook     Bagus, tapi tampilannya terlalu ramai
## 10 2025-05-10        TikTok       Tidak relevan dengan kebutuhan saya
## 11 2025-05-11 Instagram Ads      Sangat tertarik, akan coba produknya
## 12 2025-05-12       YouTube                 Tertarik, visualnya bagus
## 13 2025-05-13      Facebook     Bagus, tapi tampilannya terlalu ramai
## 14 2025-05-14     Billboard     Bagus, tapi tampilannya terlalu ramai
## 15 2025-05-15 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 16 2025-05-16       YouTube                 Tertarik, visualnya bagus
## 17 2025-05-17        TikTok                         Kurang informatif
## 18 2025-05-18      Facebook       Tidak relevan dengan kebutuhan saya
## 19 2025-05-19 Instagram Ads           Tertarik, karena diskon menarik
## 20 2025-05-20       YouTube       Tidak relevan dengan kebutuhan saya
## 21 2025-05-21 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 22 2025-05-22      Facebook                 Tertarik, visualnya bagus
## 23 2025-05-23       YouTube             Biasa saja, kurang meyakinkan
## 24 2025-05-24        TikTok Tertarik, iklannya menarik dan informatif
## 25 2025-05-25 Instagram Ads           Tertarik, karena diskon menarik
## 26 2025-05-26         Radio      Sangat tertarik, akan coba produknya
## 27 2025-05-27      Facebook       Tidak relevan dengan kebutuhan saya
## 28 2025-05-28        TikTok           Tertarik, karena diskon menarik
## 29 2025-05-29 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 30 2025-05-30       YouTube     Bagus, tapi tampilannya terlalu ramai
## 31 2025-05-31      Facebook       Tidak relevan dengan kebutuhan saya
## 32 2025-06-01 Instagram Ads           Tertarik, karena diskon menarik
## 33 2025-06-02       YouTube      Sangat tertarik, akan coba produknya
## 34 2025-06-03        TikTok           Tertarik, karena diskon menarik
## 35 2025-06-04 Instagram Ads      Sangat tertarik, akan coba produknya
## 36 2025-06-05         Radio         Tidak suka, terlalu sering muncul
## 37 2025-06-06      Facebook     Bagus, tapi tampilannya terlalu ramai
## 38 2025-06-07       YouTube       Tidak tertarik, terlalu banyak teks
## 39 2025-06-08 Instagram Ads      Sangat tertarik, akan coba produknya
## 40 2025-06-09        TikTok                         Kurang informatif
## 41 2025-06-10       YouTube       Tidak tertarik, terlalu banyak teks
## 42 2025-06-11      Facebook Tertarik, iklannya menarik dan informatif
## 43 2025-06-12 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 44 2025-06-13       YouTube     Bagus, tapi tampilannya terlalu ramai
## 45 2025-06-14      Facebook         Tidak suka, terlalu sering muncul
## 46 2025-06-15        TikTok      Sangat tertarik, akan coba produknya
## 47 2025-06-16 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 48 2025-06-17       YouTube       Tidak relevan dengan kebutuhan saya
## 49 2025-06-18      Facebook             Biasa saja, kurang meyakinkan
## 50 2025-06-19 Instagram Ads         Tidak suka, terlalu sering muncul
## 51 2025-06-20        TikTok                         Kurang informatif
## 52 2025-06-21       YouTube         Tidak suka, terlalu sering muncul
## 53 2025-06-22 Instagram Ads         Tidak suka, terlalu sering muncul
## 54 2025-06-23      Facebook           Tertarik, karena diskon menarik
## 55 2025-06-24        TikTok Tertarik, iklannya menarik dan informatif
## 56 2025-06-25       YouTube         Tidak suka, terlalu sering muncul
## 57 2025-06-26 Instagram Ads       Tidak tertarik, terlalu banyak teks
## 58 2025-06-27      Facebook Tertarik, iklannya menarik dan informatif
## 59 2025-06-28       YouTube       Tidak tertarik, terlalu banyak teks
## 60 2025-06-29 Instagram Ads             Biasa saja, kurang meyakinkan
## 61 2025-06-30        TikTok      Sangat tertarik, akan coba produknya
## 62 2025-07-01      Facebook         Tidak suka, terlalu sering muncul
## 63 2025-07-02       YouTube                 Tertarik, visualnya bagus
## 64 2025-07-03 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 65 2025-07-04        TikTok             Biasa saja, kurang meyakinkan
## 66 2025-07-05      Facebook         Tidak suka, terlalu sering muncul
## 67 2025-07-06 Instagram Ads     Bagus, tapi tampilannya terlalu ramai
## 68 2025-07-07       YouTube     Bagus, tapi tampilannya terlalu ramai
## 69 2025-07-08      Facebook           Tertarik, karena diskon menarik
## 70 2025-07-09        TikTok                 Tertarik, visualnya bagus
## 71 2025-07-10 Instagram Ads                         Kurang informatif
## 72 2025-07-11       YouTube     Bagus, tapi tampilannya terlalu ramai
## 73 2025-07-12        TikTok                 Tertarik, visualnya bagus
## 74 2025-07-13 Instagram Ads           Tertarik, karena diskon menarik
## 75 2025-07-14      Facebook                 Tertarik, visualnya bagus
## 76 2025-07-15       YouTube           Tertarik, karena diskon menarik
## 77 2025-07-16 Instagram Ads         Tidak suka, terlalu sering muncul
## 78 2025-07-17      Facebook       Tidak relevan dengan kebutuhan saya
## 79 2025-07-18        TikTok      Sangat tertarik, akan coba produknya
## 80 2025-07-19       YouTube      Sangat tertarik, akan coba produknya
## 81 2025-07-20 Instagram Ads                         Kurang informatif
## 82 2025-07-21        TikTok                 Tertarik, visualnya bagus
## 83 2025-07-22      Facebook       Tidak relevan dengan kebutuhan saya
## 84 2025-07-23       YouTube       Tidak tertarik, terlalu banyak teks
## 85 2025-07-24 Instagram Ads       Tidak relevan dengan kebutuhan saya
## 86 2025-07-25        TikTok       Tidak tertarik, terlalu banyak teks
## 87 2025-07-26       YouTube       Tidak relevan dengan kebutuhan saya
## 88 2025-07-27      Facebook         Tidak suka, terlalu sering muncul

2.1 Tabulasi Frekuensi

## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

2.1.1 Visualisasi Sederhana

## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...

3 Histogram

# Install and load necessary libraries
library(plotly)
library(dplyr)

# Menghitung frekuensi setiap media yang digunakan
media_freq <- data %>%
  group_by(Media) %>%
  summarise(Frequency = n())

# Membuat histogram dari frekuensi media yang digunakan
media_plot <- plot_ly(
  x = media_freq$Media,  # Media
  y = media_freq$Frequency,  # Frekuensi penggunaan media
  type = 'bar',  # Jenis plot adalah bar chart
  marker = list(color = 'lightblue', line = list(color = 'black', width = 1)),
  name = 'Frekuensi Media'
) %>%
  layout(
    title = 'Frekuensi Penggunaan Media Iklan',
    xaxis = list(title = 'Media', showgrid = FALSE),
    yaxis = list(title = 'Frekuensi', showgrid = FALSE),
    plot_bgcolor = 'white',
    paper_bgcolor = 'white',
    showlegend = TRUE,
    legend = list(
      orientation = 'v',    # vertical legend
      x = 0.98,             # almost at the right edge
      xanchor = 'right',
      y = 0.98,             # almost at the top
      yanchor = 'top',
      bgcolor = 'rgba(255,255,255,0.8)',  # semi-transparent background
      bordercolor = 'black',
      borderwidth = 0.3
    )
  )

# Menampilkan plot
media_plot

4 Pareto Chart

# Load libraries
library(dplyr)
library(plotly)
library(RColorBrewer)

# Ringkas data: jumlah respon per media promosi
pareto_data <- data %>%
  count(Media, sort = TRUE) %>%
  mutate(
    cum_freq = cumsum(n) / sum(n) * 100,  # Persentase kumulatif
    Media = factor(Media, levels = unique(Media))  # Atur urutan faktor
  )

# Buat warna untuk masing-masing media
colors <- RColorBrewer::brewer.pal(n = nrow(pareto_data), name = "Set3")

# Buat grafik Plotly
fig <- plot_ly(data = pareto_data)

# Tambahkan diagram batang
fig <- fig %>% add_bars(
  x = ~Media,
  y = ~n,
  name = 'Jumlah Responden',
  marker = list(color = colors),
  yaxis = "y1"
)

# Tambahkan garis kumulatif
fig <- fig %>% add_lines(
  x = ~Media,
  y = ~cum_freq,
  name = 'Kumulatif (%)',
  yaxis = "y2",
  line = list(color = 'red', dash = 'dash')
)

# Tambahkan garis batas 80%
fig <- fig %>% add_lines(
  x = ~Media,
  y = rep(80, nrow(pareto_data)),
  name = 'Batas 80%',
  yaxis = "y2",
  line = list(color = 'green', dash = 'dot')
)

# Atur tampilan layout
fig <- fig %>% layout(
  title = "Pareto Chart - Saluran Promosi Efektif",
  xaxis = list(
    title = "Media Promosi",
    tickangle = -45
  ),
  yaxis = list(title = "Jumlah Responden"),
  yaxis2 = list(
    title = "Persentase Kumulatif (%)",
    overlaying = "y",
    side = "right",
    range = c(0, 100)
  ),
  legend = list(x = 0.75, y = 0.75)
)

# Tampilkan grafik
fig

5 Scatter Diagram

# Install plotly jika belum terpasang
# install.packages("plotly")

# Muat library
library(plotly)

# Data yang kamu berikan
set.seed(123)
data <- data.frame(
  Tanggal = seq.Date(from = as.Date("2025-05-01"), by = "day", length.out = 88),
  Media = sample(c("Instagram Ads", "YouTube", "TikTok", "Facebook", "Billboard", "Radio"), 88, replace = TRUE),
  Respon = sample(c(
    "Tertarik, iklannya menarik dan informatif",
    "Tidak tertarik, terlalu banyak teks",
    "Tertarik, visualnya bagus",
    "Biasa saja, kurang meyakinkan",
    "Sangat tertarik, akan coba produknya",
    "Tidak suka, terlalu sering muncul",
    "Tertarik, karena diskon menarik",
    "Kurang informatif",
    "Bagus, tapi tampilannya terlalu ramai",
    "Tidak relevan dengan kebutuhan saya"
  ), size = 88, replace = TRUE)
)

# Simulasikan Anggaran Iklan (dalam juta) dan Hasil Penjualan (dalam juta)
set.seed(42)
data$Anggaran_Iklan <- round(runif(88, 10, 100), 1)
data$Hasil_Penjualan <- data$Anggaran_Iklan * runif(88, 0.8, 1.2) + rnorm(88, 0, 5)

# Hitung korelasi
correlation_value <- cor(data$Anggaran_Iklan, data$Hasil_Penjualan)

# Scatter plot dengan plotly
fig <- plot_ly(data,
               x = ~Anggaran_Iklan,
               y = ~Hasil_Penjualan,
               type = 'scatter',
               mode = 'markers',
               marker = list(color = 'blue', size = 10),
               text = ~paste("Media:", Media, "<br>Respon:", Respon),
               hoverinfo = "text+x+y") %>%
  add_lines(x = data$Anggaran_Iklan,
            y = predict(lm(Hasil_Penjualan ~ Anggaran_Iklan, data = data)),
            line = list(color = 'red', dash = 'solid', width = 2)) %>%
  layout(title = paste("Scatter Plot: Hubungan Anggaran Iklan dan Hasil Penjualan\nKorelasi: ", round(correlation_value, 2)),
         xaxis = list(title = "Anggaran Iklan (juta)"),
         yaxis = list(title = "Hasil Penjualan (juta)"))

# Tampilkan plot
fig
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...

6 Control Chart

# Load libraries
library(plotly)
library(dplyr)

# Hitung jumlah keterlibatan per tanggal
engagement_data <- data %>%
  group_by(Tanggal) %>%
  summarise(Jumlah_Respon = n())

# Hitung nilai Control Limit
CL <- mean(engagement_data$Jumlah_Respon)
UCL <- CL + 3 * sd(engagement_data$Jumlah_Respon)
LCL <- CL - 3 * sd(engagement_data$Jumlah_Respon)

# Tandai outlier
engagement_data <- engagement_data %>%
  mutate(Outlier = ifelse(Jumlah_Respon > UCL | Jumlah_Respon < LCL, "Ya", "Tidak"))

# Buat Control Chart
plot_ly(engagement_data,
        x = ~Tanggal,
        y = ~Jumlah_Respon,
        type = 'scatter',
        mode = 'lines+markers',
        line = list(color = 'blue'),
        marker = list(size = 8, color = ifelse(engagement_data$Outlier == "Ya", "red", "blue")),
        hoverinfo = 'text',
        text = ~paste("Tanggal:", Tanggal, "<br>Jumlah Respon:", Jumlah_Respon)) %>%
  add_lines(y = rep(CL, nrow(engagement_data)), name = "CL", line = list(color = 'green', dash = 'dot')) %>%
  add_lines(y = rep(UCL, nrow(engagement_data)), name = "UCL", line = list(color = 'red', dash = 'dot')) %>%
  add_lines(y = rep(LCL, nrow(engagement_data)), name = "LCL", line = list(color = 'red', dash = 'dot')) %>%
  layout(title = "Control Chart – Fluktuasi Keterlibatan Media Sosial",
         xaxis = list(title = "Tanggal"),
         yaxis = list(title = "Jumlah Respon"),
         legend = list(orientation = 'h', x = 0.3, y = -0.2))
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...
## A marker object has been specified, but markers is not in the mode
## Adding markers to the mode...

7 Fishbone

# Pastikan semua package terinstal
if (!requireNamespace("DiagrammeR", quietly = TRUE)) install.packages("DiagrammeR")
if (!requireNamespace("DiagrammeRsvg", quietly = TRUE)) install.packages("DiagrammeRsvg")
if (!requireNamespace("rsvg", quietly = TRUE)) install.packages("rsvg")

library(DiagrammeR)
## Warning: package 'DiagrammeR' was built under R version 4.4.3
library(DiagrammeRsvg)
## Warning: package 'DiagrammeRsvg' was built under R version 4.4.3
library(rsvg)
## Warning: package 'rsvg' was built under R version 4.4.3
## Linking to librsvg 2.57.0
# Buat diagram fishbone
graph <- grViz("
digraph fishbone {
  graph [layout = dot, rankdir = LR]

  node [fontname=Helvetica, fontsize=25, style=filled]

  Problem [label='Kampanye Gagal\\nMeningkatkan Penjualan', shape=ellipse, fillcolor=lightcoral, width=5.0, height=1.2]

  node [shape=diamond, width=2.5, height=1.0, fillcolor='#FFD700']
  A1 [label='Media']
  A2 [label='Konten']
  A3 [label='Targeting']
  A4 [label='Frekuensi']
  A5 [label='Anggaran']
  A6 [label='Waktu']

  node [shape=ellipse, width=2.5, height=0.6, fillcolor='#90EE90']
  A1a [label='Media kurang sesuai']
  A1b [label='Terlalu banyak platform']
  A2a [label='Konten tidak menarik']
  A2b [label='Terlalu banyak teks']
  A3a [label='Tidak sesuai segmentasi']
  A3b [label='Iklan tidak relevan']
  A4a [label='Frekuensi terlalu tinggi']
  A4b [label='Frekuensi terlalu rendah']
  A5a [label='Anggaran terlalu kecil']
  A5b [label='Distribusi tidak optimal']
  A6a [label='Waktu kampanye kurang tepat']
  A6b [label='Terlambat merespon tren']

  A1 -> Problem
  A2 -> Problem
  A3 -> Problem
  A4 -> Problem
  A5 -> Problem
  A6 -> Problem

  A1a -> A1
  A1b -> A1
  A2a -> A2
  A2b -> A2
  A3a -> A3
  A3b -> A3
  A4a -> A4
  A4b -> A4
  A5a -> A5
  A5b -> A5
  A6a -> A6
  A6b -> A6
}
")

# Simpan hasil sebagai gambar
dir.create("images/bab8", recursive = TRUE, showWarnings = FALSE)
svg_code <- DiagrammeRsvg::export_svg(graph)

rsvg_png(charToRaw(svg_code), file = "images/bab8/fishbone_campaign_fail.png", width = 1200, height = 800)
rsvg_pdf(charToRaw(svg_code), file = "images/bab8/fishbone_campaign_fail.pdf")

# Tampilkan gambar dalam dokumen
knitr::include_graphics("images/bab8/fishbone_campaign_fail.png")

8 Flowchart

# Pastikan paket DiagrammeR sudah terpasang
# install.packages("DiagrammeR")

library(DiagrammeR)

grViz("
digraph kampanye {
  
  graph [rankdir = TB, layout = dot]

  node [shape = box, style=filled, fillcolor=lightblue]
  A [label = 'Riset Pasar & Audiens']
  B [label = 'Susun Strategi Iklan']
  C [label = 'Luncurkan Iklan']
  D [label = 'Monitor Respons & Engagement']
  E [label = 'Tindak Lanjut ke Calon Pelanggan']
  F [label = 'Kumpulkan Data & Feedback']
  G [label = 'Evaluasi Hasil Kampanye']
  
  node [shape = diamond, style=filled, fillcolor=lemonchiffon]
  H [label = 'Apakah Target Tercapai?']
  
  node [shape = ellipse, style=filled, fillcolor=pink]
  I [label = 'No']
  
  node [shape = box, style=filled, fillcolor=lightgray]
  J [label = 'Perbaiki Strategi']

  node [shape = box, style=filled, fillcolor=lightgreen]
  K [label = 'Kampanye Sukses']

  node [shape = circle, style=filled, fillcolor=cyan]
  Start [label = 'Start']

  Start -> A -> B -> C -> D -> E -> F -> G -> H
  H -> K [label='Yes']
  H -> I
  I -> J -> B
}
")

```

LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiAxMSINCnN1YnRpdGxlOiAiU2V2ZW4gVG9vbHMgQW5hbHlzaXMiDQphdXRob3I6IA0KICAtICJEd2kgU3JpIFlhbnRpIE1hbnVsbGFuZyINCiAgLSAiTmFiaWxhIEFuZ2dpdGEgUHV0cmkiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogIkM6L1VzZXJzL0R3aSBNYW51bGxhbmcvRG93bmxvYWRzL3N0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIGlkPSJsb2dvLXV0YW1hIiBzcmM9IkM6L1VzZXJzL0R3aSBNYW51bGxhbmcvUGljdHVyZXMvRk9UTy5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjUwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCg0KIyBTZXZlcmFsIEFwcGxpY2F0aW9uIDogTWFya2V0aW5nDQojIENoZWV0IFNoZWV0IGluIFINCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBUYW5nZ2FsID0gYXMuRGF0ZShjKA0KICAgICIyMDI1LTA1LTAxIiwgIjIwMjUtMDUtMDIiLCAiMjAyNS0wNS0wMyIsICIyMDI1LTA1LTA0IiwgIjIwMjUtMDUtMDUiLA0KICAgICIyMDI1LTA1LTA2IiwgIjIwMjUtMDUtMDciLCAiMjAyNS0wNS0wOCIsICIyMDI1LTA1LTA5IiwgIjIwMjUtMDUtMTAiLA0KICAgICIyMDI1LTA1LTExIiwgIjIwMjUtMDUtMTIiLCAiMjAyNS0wNS0xMyIsICIyMDI1LTA1LTE0IiwgIjIwMjUtMDUtMTUiLA0KICAgICIyMDI1LTA1LTE2IiwgIjIwMjUtMDUtMTciLCAiMjAyNS0wNS0xOCIsICIyMDI1LTA1LTE5IiwgIjIwMjUtMDUtMjAiLA0KICAgICIyMDI1LTA1LTIxIiwgIjIwMjUtMDUtMjIiLCAiMjAyNS0wNS0yMyIsICIyMDI1LTA1LTI0IiwgIjIwMjUtMDUtMjUiLA0KICAgICIyMDI1LTA1LTI2IiwgIjIwMjUtMDUtMjciLCAiMjAyNS0wNS0yOCIsICIyMDI1LTA1LTI5IiwgIjIwMjUtMDUtMzAiLA0KICAgICIyMDI1LTA1LTMxIiwgIjIwMjUtMDYtMDEiLCAiMjAyNS0wNi0wMiIsICIyMDI1LTA2LTAzIiwgIjIwMjUtMDYtMDQiLA0KICAgICIyMDI1LTA2LTA1IiwgIjIwMjUtMDYtMDYiLCAiMjAyNS0wNi0wNyIsICIyMDI1LTA2LTA4IiwgIjIwMjUtMDYtMDkiLA0KICAgICIyMDI1LTA2LTEwIiwgIjIwMjUtMDYtMTEiLCAiMjAyNS0wNi0xMiIsICIyMDI1LTA2LTEzIiwgIjIwMjUtMDYtMTQiLA0KICAgICIyMDI1LTA2LTE1IiwgIjIwMjUtMDYtMTYiLCAiMjAyNS0wNi0xNyIsICIyMDI1LTA2LTE4IiwgIjIwMjUtMDYtMTkiLA0KICAgICIyMDI1LTA2LTIwIiwgIjIwMjUtMDYtMjEiLCAiMjAyNS0wNi0yMiIsICIyMDI1LTA2LTIzIiwgIjIwMjUtMDYtMjQiLA0KICAgICIyMDI1LTA2LTI1IiwgIjIwMjUtMDYtMjYiLCAiMjAyNS0wNi0yNyIsICIyMDI1LTA2LTI4IiwgIjIwMjUtMDYtMjkiLA0KICAgICIyMDI1LTA2LTMwIiwgIjIwMjUtMDctMDEiLCAiMjAyNS0wNy0wMiIsICIyMDI1LTA3LTAzIiwgIjIwMjUtMDctMDQiLA0KICAgICIyMDI1LTA3LTA1IiwgIjIwMjUtMDctMDYiLCAiMjAyNS0wNy0wNyIsICIyMDI1LTA3LTA4IiwgIjIwMjUtMDctMDkiLA0KICAgICIyMDI1LTA3LTEwIiwgIjIwMjUtMDctMTEiLCAiMjAyNS0wNy0xMiIsICIyMDI1LTA3LTEzIiwgIjIwMjUtMDctMTQiLA0KICAgICIyMDI1LTA3LTE1IiwgIjIwMjUtMDctMTYiLCAiMjAyNS0wNy0xNyIsICIyMDI1LTA3LTE4IiwgIjIwMjUtMDctMTkiLA0KICAgICIyMDI1LTA3LTIwIiwgIjIwMjUtMDctMjEiLCAiMjAyNS0wNy0yMiIsICIyMDI1LTA3LTIzIiwgIjIwMjUtMDctMjQiLA0KICAgICIyMDI1LTA3LTI1IiwgIjIwMjUtMDctMjYiLCAiMjAyNS0wNy0yNyINCiAgKSksDQogIE1lZGlhID0gYygNCiAgICAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIlRpa1RvayIsICJGYWNlYm9vayIsICJCaWxsYm9hcmQiLA0KICAgICJJbnN0YWdyYW0gQWRzIiwgIllvdVR1YmUiLCAiUmFkaW8iLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwNCiAgICAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIkJpbGxib2FyZCIsICJJbnN0YWdyYW0gQWRzIiwNCiAgICAiWW91VHViZSIsICJUaWtUb2siLCAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwNCiAgICAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsICJZb3VUdWJlIiwgIlRpa1RvayIsICJJbnN0YWdyYW0gQWRzIiwNCiAgICAiUmFkaW8iLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsDQogICAgIkZhY2Vib29rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlJhZGlvIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsICJUaWtUb2siLA0KICAgICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJGYWNlYm9vayIsDQogICAgIlRpa1RvayIsICJJbnN0YWdyYW0gQWRzIiwgIllvdVR1YmUiLCAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJZb3VUdWJlIiwgIkluc3RhZ3JhbSBBZHMiLCAiRmFjZWJvb2siLCAiVGlrVG9rIiwNCiAgICAiWW91VHViZSIsICJJbnN0YWdyYW0gQWRzIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJGYWNlYm9vayIsICJZb3VUdWJlIiwgIkluc3RhZ3JhbSBBZHMiLCAiVGlrVG9rIiwNCiAgICAiRmFjZWJvb2siLCAiSW5zdGFncmFtIEFkcyIsICJZb3VUdWJlIiwgIkZhY2Vib29rIiwgIlRpa1RvayIsDQogICAgIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsDQogICAgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsICJGYWNlYm9vayIsICJUaWtUb2siLCAiWW91VHViZSIsDQogICAgIkluc3RhZ3JhbSBBZHMiLCAiVGlrVG9rIiwgIkZhY2Vib29rIiwgIllvdVR1YmUiLCAiSW5zdGFncmFtIEFkcyIsDQogICAgIlRpa1RvayIsICJZb3VUdWJlIiwgIkZhY2Vib29rIg0KICApLA0KICBSZXNwb24gPSByZXAoIlRlcnRhcmlrLCBpa2xhbm55YSBtZW5hcmlrIGRhbiBpbmZvcm1hdGlmIiwgODgpDQopDQoNCiMgVmFyaWFzaSByZXNwb24NCnNldC5zZWVkKDEyMykgICMgU3VwYXlhIGhhc2lsIGFjYWsgdGV0YXAga29uc2lzdGVuDQpyZXNwb25fdmFyaWFzaSA8LSBjKA0KICAiVGVydGFyaWssIGlrbGFubnlhIG1lbmFyaWsgZGFuIGluZm9ybWF0aWYiLA0KICAiVGlkYWsgdGVydGFyaWssIHRlcmxhbHUgYmFueWFrIHRla3MiLA0KICAiVGVydGFyaWssIHZpc3VhbG55YSBiYWd1cyIsDQogICJCaWFzYSBzYWphLCBrdXJhbmcgbWV5YWtpbmthbiIsDQogICJTYW5nYXQgdGVydGFyaWssIGFrYW4gY29iYSBwcm9kdWtueWEiLA0KICAiVGlkYWsgc3VrYSwgdGVybGFsdSBzZXJpbmcgbXVuY3VsIiwNCiAgIlRlcnRhcmlrLCBrYXJlbmEgZGlza29uIG1lbmFyaWsiLA0KICAiS3VyYW5nIGluZm9ybWF0aWYiLA0KICAiQmFndXMsIHRhcGkgdGFtcGlsYW5ueWEgdGVybGFsdSByYW1haSIsDQogICJUaWRhayByZWxldmFuIGRlbmdhbiBrZWJ1dHVoYW4gc2F5YSINCikNCg0KIyBVcGRhdGUga29sb20gUmVzcG9uIGRlbmdhbiBwaWxpaGFuIGFjYWsNCmRhdGEkUmVzcG9uIDwtIHNhbXBsZShyZXNwb25fdmFyaWFzaSwgc2l6ZSA9IG5yb3coZGF0YSksIHJlcGxhY2UgPSBUUlVFKQ0KDQojIENldGFrIGRhdGENCnByaW50KGRhdGEpDQoNCmBgYA0KDQoNCiMjIFRhYnVsYXNpIEZyZWt1ZW5zaQ0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCg0KIyBIaXR1bmcgZnJla3VlbnNpIHRpYXAgcmVzcG9uDQpyZXNwb25fc3VtbWFyeSA8LSBkYXRhICU+JQ0KICBjb3VudChSZXNwb24sIHNvcnQgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKEZyZXF1ZW5jeSA9IG4pDQoNCiMgVGFtcGlsa2FuIHRhYmVsIHN1bW1hcnkNCmRhdGF0YWJsZSgNCiAgcmVzcG9uX3N1bW1hcnksDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgIHNjcm9sbENvbGxhcHNlID0gVFJVRSwNCiAgICBzZWFyY2hpbmcgPSBGQUxTRSwgICAjIEhhcHVzIGtvdGFrIHBlbmNhcmlhbg0KICAgIHBhZ2luZyA9IEZBTFNFICAgICAgICMgSGFwdXMgcGFnaW5hc2kNCiAgKSwNCiAgcm93bmFtZXMgPSBGQUxTRSwNCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKA0KICAgIHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyB0ZXh0LWFsaWduOiBsZWZ0OyANCiAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOycsDQogICAgJ1N1bW1hcnkgb2YgQ3VzdG9tZXIgUmVzcG9uc2VzIHRvIEFkIENhbXBhaWducycNCiAgKSwNCiAgY2xhc3MgPSAnc3RyaXBlIGhvdmVyIGNvbXBhY3QnDQopDQoNCmBgYA0KDQojIyMgVmlzdWFsaXNhc2kgU2VkZXJoYW5hDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgSW50ZXJhY3RpdmUgYmFyIGNoYXJ0IHdpdGggbGFiZWxzIG9uIGJhcnMNCnBsb3RfbHkocmVzcG9uX3N1bW1hcnksDQogICAgICAgIHggPSB+RnJlcXVlbmN5LA0KICAgICAgICB5ID0gfnJlb3JkZXIoUmVzcG9uLCBGcmVxdWVuY3kpLA0KICAgICAgICB0eXBlID0gJ2JhcicsDQogICAgICAgIG9yaWVudGF0aW9uID0gJ2gnLA0KICAgICAgICBtYXJrZXIgPSBsaXN0KA0KICAgICAgICAgIGNvbG9yID0gfkZyZXF1ZW5jeSwNCiAgICAgICAgICBjb2xvcnNjYWxlID0gJ0JsdWVyZWQnLCAgIyBCaXNhIGNvYmEgd2FybmEgbGFpbg0KICAgICAgICAgIHNob3dzY2FsZSA9IFRSVUUNCiAgICAgICAgKQ0KKSAlPiUgDQogIGxheW91dCgNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICJTdW1tYXJ5IG9mIEN1c3RvbWVyIFJlc3BvbnNlcyB0byBBZCBDYW1wYWlnbnMiLCBmb250ID0gbGlzdChzaXplID0gMTgpKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJlcXVlbmN5IiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlc3BvbnNlIiksDQogICAgbWFyZ2luID0gbGlzdChsID0gMTIwKSwNCiAgICBzaG93bGVnZW5kID0gRkFMU0UNCiAgKSAlPiUNCiAgYWRkX3RleHQoDQogICAgdGV4dCA9IH5GcmVxdWVuY3ksICAjIE1lbmFtYmFoa2FuIGxhYmVsIGZyZWt1ZW5zaSBwYWRhIHNldGlhcCBiYXINCiAgICB0ZXh0cG9zaXRpb24gPSAnYXV0bycsDQogICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDEyLCBjb2xvciA9ICdibGFjaycpDQogICkNCg0KDQpgYGANCg0KDQojIEhpc3RvZ3JhbQ0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgTWVuZ2hpdHVuZyBmcmVrdWVuc2kgc2V0aWFwIG1lZGlhIHlhbmcgZGlndW5ha2FuDQptZWRpYV9mcmVxIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KE1lZGlhKSAlPiUNCiAgc3VtbWFyaXNlKEZyZXF1ZW5jeSA9IG4oKSkNCg0KIyBNZW1idWF0IGhpc3RvZ3JhbSBkYXJpIGZyZWt1ZW5zaSBtZWRpYSB5YW5nIGRpZ3VuYWthbg0KbWVkaWFfcGxvdCA8LSBwbG90X2x5KA0KICB4ID0gbWVkaWFfZnJlcSRNZWRpYSwgICMgTWVkaWENCiAgeSA9IG1lZGlhX2ZyZXEkRnJlcXVlbmN5LCAgIyBGcmVrdWVuc2kgcGVuZ2d1bmFhbiBtZWRpYQ0KICB0eXBlID0gJ2JhcicsICAjIEplbmlzIHBsb3QgYWRhbGFoIGJhciBjaGFydA0KICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJ2xpZ2h0Ymx1ZScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJywgd2lkdGggPSAxKSksDQogIG5hbWUgPSAnRnJla3VlbnNpIE1lZGlhJw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gJ0ZyZWt1ZW5zaSBQZW5nZ3VuYWFuIE1lZGlhIElrbGFuJywNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnTWVkaWEnLCBzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRnJla3VlbnNpJywgc2hvd2dyaWQgPSBGQUxTRSksDQogICAgcGxvdF9iZ2NvbG9yID0gJ3doaXRlJywNCiAgICBwYXBlcl9iZ2NvbG9yID0gJ3doaXRlJywNCiAgICBzaG93bGVnZW5kID0gVFJVRSwNCiAgICBsZWdlbmQgPSBsaXN0KA0KICAgICAgb3JpZW50YXRpb24gPSAndicsICAgICMgdmVydGljYWwgbGVnZW5kDQogICAgICB4ID0gMC45OCwgICAgICAgICAgICAgIyBhbG1vc3QgYXQgdGhlIHJpZ2h0IGVkZ2UNCiAgICAgIHhhbmNob3IgPSAncmlnaHQnLA0KICAgICAgeSA9IDAuOTgsICAgICAgICAgICAgICMgYWxtb3N0IGF0IHRoZSB0b3ANCiAgICAgIHlhbmNob3IgPSAndG9wJywNCiAgICAgIGJnY29sb3IgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjgpJywgICMgc2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kDQogICAgICBib3JkZXJjb2xvciA9ICdibGFjaycsDQogICAgICBib3JkZXJ3aWR0aCA9IDAuMw0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCm1lZGlhX3Bsb3QNCg0KDQpgYGANCg0KDQojIFBhcmV0byBDaGFydA0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCg0KIyBMb2FkIGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgUmluZ2thcyBkYXRhOiBqdW1sYWggcmVzcG9uIHBlciBtZWRpYSBwcm9tb3NpDQpwYXJldG9fZGF0YSA8LSBkYXRhICU+JQ0KICBjb3VudChNZWRpYSwgc29ydCA9IFRSVUUpICU+JQ0KICBtdXRhdGUoDQogICAgY3VtX2ZyZXEgPSBjdW1zdW0obikgLyBzdW0obikgKiAxMDAsICAjIFBlcnNlbnRhc2Uga3VtdWxhdGlmDQogICAgTWVkaWEgPSBmYWN0b3IoTWVkaWEsIGxldmVscyA9IHVuaXF1ZShNZWRpYSkpICAjIEF0dXIgdXJ1dGFuIGZha3Rvcg0KICApDQoNCiMgQnVhdCB3YXJuYSB1bnR1ayBtYXNpbmctbWFzaW5nIG1lZGlhDQpjb2xvcnMgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG4gPSBucm93KHBhcmV0b19kYXRhKSwgbmFtZSA9ICJTZXQzIikNCg0KIyBCdWF0IGdyYWZpayBQbG90bHkNCmZpZyA8LSBwbG90X2x5KGRhdGEgPSBwYXJldG9fZGF0YSkNCg0KIyBUYW1iYWhrYW4gZGlhZ3JhbSBiYXRhbmcNCmZpZyA8LSBmaWcgJT4lIGFkZF9iYXJzKA0KICB4ID0gfk1lZGlhLA0KICB5ID0gfm4sDQogIG5hbWUgPSAnSnVtbGFoIFJlc3BvbmRlbicsDQogIG1hcmtlciA9IGxpc3QoY29sb3IgPSBjb2xvcnMpLA0KICB5YXhpcyA9ICJ5MSINCikNCg0KIyBUYW1iYWhrYW4gZ2FyaXMga3VtdWxhdGlmDQpmaWcgPC0gZmlnICU+JSBhZGRfbGluZXMoDQogIHggPSB+TWVkaWEsDQogIHkgPSB+Y3VtX2ZyZXEsDQogIG5hbWUgPSAnS3VtdWxhdGlmICglKScsDQogIHlheGlzID0gInkyIiwNCiAgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJywgZGFzaCA9ICdkYXNoJykNCikNCg0KIyBUYW1iYWhrYW4gZ2FyaXMgYmF0YXMgODAlDQpmaWcgPC0gZmlnICU+JSBhZGRfbGluZXMoDQogIHggPSB+TWVkaWEsDQogIHkgPSByZXAoODAsIG5yb3cocGFyZXRvX2RhdGEpKSwNCiAgbmFtZSA9ICdCYXRhcyA4MCUnLA0KICB5YXhpcyA9ICJ5MiIsDQogIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkb3QnKQ0KKQ0KDQojIEF0dXIgdGFtcGlsYW4gbGF5b3V0DQpmaWcgPC0gZmlnICU+JSBsYXlvdXQoDQogIHRpdGxlID0gIlBhcmV0byBDaGFydCAtIFNhbHVyYW4gUHJvbW9zaSBFZmVrdGlmIiwNCiAgeGF4aXMgPSBsaXN0KA0KICAgIHRpdGxlID0gIk1lZGlhIFByb21vc2kiLA0KICAgIHRpY2thbmdsZSA9IC00NQ0KICApLA0KICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSnVtbGFoIFJlc3BvbmRlbiIpLA0KICB5YXhpczIgPSBsaXN0KA0KICAgIHRpdGxlID0gIlBlcnNlbnRhc2UgS3VtdWxhdGlmICglKSIsDQogICAgb3ZlcmxheWluZyA9ICJ5IiwNCiAgICBzaWRlID0gInJpZ2h0IiwNCiAgICByYW5nZSA9IGMoMCwgMTAwKQ0KICApLA0KICBsZWdlbmQgPSBsaXN0KHggPSAwLjc1LCB5ID0gMC43NSkNCikNCg0KIyBUYW1waWxrYW4gZ3JhZmlrDQpmaWcNCg0KDQpgYGANCg0KIyBTY2F0dGVyIERpYWdyYW0NCg0KYGBge3IsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBlY2hvPVRSVUV9DQoNCiMgSW5zdGFsbCBwbG90bHkgamlrYSBiZWx1bSB0ZXJwYXNhbmcNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCg0KIyBNdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgeWFuZyBrYW11IGJlcmlrYW4NCnNldC5zZWVkKDEyMykNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgVGFuZ2dhbCA9IHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDI1LTA1LTAxIiksIGJ5ID0gImRheSIsIGxlbmd0aC5vdXQgPSA4OCksDQogIE1lZGlhID0gc2FtcGxlKGMoIkluc3RhZ3JhbSBBZHMiLCAiWW91VHViZSIsICJUaWtUb2siLCAiRmFjZWJvb2siLCAiQmlsbGJvYXJkIiwgIlJhZGlvIiksIDg4LCByZXBsYWNlID0gVFJVRSksDQogIFJlc3BvbiA9IHNhbXBsZShjKA0KICAgICJUZXJ0YXJpaywgaWtsYW5ueWEgbWVuYXJpayBkYW4gaW5mb3JtYXRpZiIsDQogICAgIlRpZGFrIHRlcnRhcmlrLCB0ZXJsYWx1IGJhbnlhayB0ZWtzIiwNCiAgICAiVGVydGFyaWssIHZpc3VhbG55YSBiYWd1cyIsDQogICAgIkJpYXNhIHNhamEsIGt1cmFuZyBtZXlha2lua2FuIiwNCiAgICAiU2FuZ2F0IHRlcnRhcmlrLCBha2FuIGNvYmEgcHJvZHVrbnlhIiwNCiAgICAiVGlkYWsgc3VrYSwgdGVybGFsdSBzZXJpbmcgbXVuY3VsIiwNCiAgICAiVGVydGFyaWssIGthcmVuYSBkaXNrb24gbWVuYXJpayIsDQogICAgIkt1cmFuZyBpbmZvcm1hdGlmIiwNCiAgICAiQmFndXMsIHRhcGkgdGFtcGlsYW5ueWEgdGVybGFsdSByYW1haSIsDQogICAgIlRpZGFrIHJlbGV2YW4gZGVuZ2FuIGtlYnV0dWhhbiBzYXlhIg0KICApLCBzaXplID0gODgsIHJlcGxhY2UgPSBUUlVFKQ0KKQ0KDQojIFNpbXVsYXNpa2FuIEFuZ2dhcmFuIElrbGFuIChkYWxhbSBqdXRhKSBkYW4gSGFzaWwgUGVuanVhbGFuIChkYWxhbSBqdXRhKQ0Kc2V0LnNlZWQoNDIpDQpkYXRhJEFuZ2dhcmFuX0lrbGFuIDwtIHJvdW5kKHJ1bmlmKDg4LCAxMCwgMTAwKSwgMSkNCmRhdGEkSGFzaWxfUGVuanVhbGFuIDwtIGRhdGEkQW5nZ2FyYW5fSWtsYW4gKiBydW5pZig4OCwgMC44LCAxLjIpICsgcm5vcm0oODgsIDAsIDUpDQoNCiMgSGl0dW5nIGtvcmVsYXNpDQpjb3JyZWxhdGlvbl92YWx1ZSA8LSBjb3IoZGF0YSRBbmdnYXJhbl9Ja2xhbiwgZGF0YSRIYXNpbF9QZW5qdWFsYW4pDQoNCiMgU2NhdHRlciBwbG90IGRlbmdhbiBwbG90bHkNCmZpZyA8LSBwbG90X2x5KGRhdGEsDQogICAgICAgICAgICAgICB4ID0gfkFuZ2dhcmFuX0lrbGFuLA0KICAgICAgICAgICAgICAgeSA9IH5IYXNpbF9QZW5qdWFsYW4sDQogICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgICAgICAgICAgICAgbW9kZSA9ICdtYXJrZXJzJywNCiAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIHNpemUgPSAxMCksDQogICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJNZWRpYToiLCBNZWRpYSwgIjxicj5SZXNwb246IiwgUmVzcG9uKSwNCiAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0K3greSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IGRhdGEkQW5nZ2FyYW5fSWtsYW4sDQogICAgICAgICAgICB5ID0gcHJlZGljdChsbShIYXNpbF9QZW5qdWFsYW4gfiBBbmdnYXJhbl9Ja2xhbiwgZGF0YSA9IGRhdGEpKSwNCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcsIGRhc2ggPSAnc29saWQnLCB3aWR0aCA9IDIpKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gcGFzdGUoIlNjYXR0ZXIgUGxvdDogSHVidW5nYW4gQW5nZ2FyYW4gSWtsYW4gZGFuIEhhc2lsIFBlbmp1YWxhblxuS29yZWxhc2k6ICIsIHJvdW5kKGNvcnJlbGF0aW9uX3ZhbHVlLCAyKSksDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQW5nZ2FyYW4gSWtsYW4gKGp1dGEpIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSGFzaWwgUGVuanVhbGFuIChqdXRhKSIpKQ0KDQojIFRhbXBpbGthbiBwbG90DQpmaWcNCg0KYGBgDQoNCg0KIyBDb250cm9sIENoYXJ0DQoNCmBgYHtyLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgZWNobz1UUlVFfQ0KDQojIExvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZHBseXIpDQoNCiMgSGl0dW5nIGp1bWxhaCBrZXRlcmxpYmF0YW4gcGVyIHRhbmdnYWwNCmVuZ2FnZW1lbnRfZGF0YSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShUYW5nZ2FsKSAlPiUNCiAgc3VtbWFyaXNlKEp1bWxhaF9SZXNwb24gPSBuKCkpDQoNCiMgSGl0dW5nIG5pbGFpIENvbnRyb2wgTGltaXQNCkNMIDwtIG1lYW4oZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQpVQ0wgPC0gQ0wgKyAzICogc2QoZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQpMQ0wgPC0gQ0wgLSAzICogc2QoZW5nYWdlbWVudF9kYXRhJEp1bWxhaF9SZXNwb24pDQoNCiMgVGFuZGFpIG91dGxpZXINCmVuZ2FnZW1lbnRfZGF0YSA8LSBlbmdhZ2VtZW50X2RhdGEgJT4lDQogIG11dGF0ZShPdXRsaWVyID0gaWZlbHNlKEp1bWxhaF9SZXNwb24gPiBVQ0wgfCBKdW1sYWhfUmVzcG9uIDwgTENMLCAiWWEiLCAiVGlkYWsiKSkNCg0KIyBCdWF0IENvbnRyb2wgQ2hhcnQNCnBsb3RfbHkoZW5nYWdlbWVudF9kYXRhLA0KICAgICAgICB4ID0gflRhbmdnYWwsDQogICAgICAgIHkgPSB+SnVtbGFoX1Jlc3BvbiwNCiAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICAgICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywNCiAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScpLA0KICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA4LCBjb2xvciA9IGlmZWxzZShlbmdhZ2VtZW50X2RhdGEkT3V0bGllciA9PSAiWWEiLCAicmVkIiwgImJsdWUiKSksDQogICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywNCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiVGFuZ2dhbDoiLCBUYW5nZ2FsLCAiPGJyPkp1bWxhaCBSZXNwb246IiwgSnVtbGFoX1Jlc3BvbikpICU+JQ0KICBhZGRfbGluZXMoeSA9IHJlcChDTCwgbnJvdyhlbmdhZ2VtZW50X2RhdGEpKSwgbmFtZSA9ICJDTCIsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkb3QnKSkgJT4lDQogIGFkZF9saW5lcyh5ID0gcmVwKFVDTCwgbnJvdyhlbmdhZ2VtZW50X2RhdGEpKSwgbmFtZSA9ICJVQ0wiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2RvdCcpKSAlPiUNCiAgYWRkX2xpbmVzKHkgPSByZXAoTENMLCBucm93KGVuZ2FnZW1lbnRfZGF0YSkpLCBuYW1lID0gIkxDTCIsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcsIGRhc2ggPSAnZG90JykpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiQ29udHJvbCBDaGFydCDigJMgRmx1a3R1YXNpIEtldGVybGliYXRhbiBNZWRpYSBTb3NpYWwiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRhbmdnYWwiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJKdW1sYWggUmVzcG9uIiksDQogICAgICAgICBsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uID0gJ2gnLCB4ID0gMC4zLCB5ID0gLTAuMikpDQoNCmBgYA0KDQojIEZpc2hib25lDQoNCmBgYHtyLCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgZWNobz1UUlVFfQ0KDQojIFBhc3Rpa2FuIHNlbXVhIHBhY2thZ2UgdGVyaW5zdGFsDQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkRpYWdyYW1tZVIiLCBxdWlldGx5ID0gVFJVRSkpIGluc3RhbGwucGFja2FnZXMoIkRpYWdyYW1tZVIiKQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJEaWFncmFtbWVSc3ZnIiwgcXVpZXRseSA9IFRSVUUpKSBpbnN0YWxsLnBhY2thZ2VzKCJEaWFncmFtbWVSc3ZnIikNCmlmICghcmVxdWlyZU5hbWVzcGFjZSgicnN2ZyIsIHF1aWV0bHkgPSBUUlVFKSkgaW5zdGFsbC5wYWNrYWdlcygicnN2ZyIpDQoNCmxpYnJhcnkoRGlhZ3JhbW1lUikNCmxpYnJhcnkoRGlhZ3JhbW1lUnN2ZykNCmxpYnJhcnkocnN2ZykNCg0KIyBCdWF0IGRpYWdyYW0gZmlzaGJvbmUNCmdyYXBoIDwtIGdyVml6KCINCmRpZ3JhcGggZmlzaGJvbmUgew0KICBncmFwaCBbbGF5b3V0ID0gZG90LCByYW5rZGlyID0gTFJdDQoNCiAgbm9kZSBbZm9udG5hbWU9SGVsdmV0aWNhLCBmb250c2l6ZT0yNSwgc3R5bGU9ZmlsbGVkXQ0KDQogIFByb2JsZW0gW2xhYmVsPSdLYW1wYW55ZSBHYWdhbFxcbk1lbmluZ2thdGthbiBQZW5qdWFsYW4nLCBzaGFwZT1lbGxpcHNlLCBmaWxsY29sb3I9bGlnaHRjb3JhbCwgd2lkdGg9NS4wLCBoZWlnaHQ9MS4yXQ0KDQogIG5vZGUgW3NoYXBlPWRpYW1vbmQsIHdpZHRoPTIuNSwgaGVpZ2h0PTEuMCwgZmlsbGNvbG9yPScjRkZENzAwJ10NCiAgQTEgW2xhYmVsPSdNZWRpYSddDQogIEEyIFtsYWJlbD0nS29udGVuJ10NCiAgQTMgW2xhYmVsPSdUYXJnZXRpbmcnXQ0KICBBNCBbbGFiZWw9J0ZyZWt1ZW5zaSddDQogIEE1IFtsYWJlbD0nQW5nZ2FyYW4nXQ0KICBBNiBbbGFiZWw9J1dha3R1J10NCg0KICBub2RlIFtzaGFwZT1lbGxpcHNlLCB3aWR0aD0yLjUsIGhlaWdodD0wLjYsIGZpbGxjb2xvcj0nIzkwRUU5MCddDQogIEExYSBbbGFiZWw9J01lZGlhIGt1cmFuZyBzZXN1YWknXQ0KICBBMWIgW2xhYmVsPSdUZXJsYWx1IGJhbnlhayBwbGF0Zm9ybSddDQogIEEyYSBbbGFiZWw9J0tvbnRlbiB0aWRhayBtZW5hcmlrJ10NCiAgQTJiIFtsYWJlbD0nVGVybGFsdSBiYW55YWsgdGVrcyddDQogIEEzYSBbbGFiZWw9J1RpZGFrIHNlc3VhaSBzZWdtZW50YXNpJ10NCiAgQTNiIFtsYWJlbD0nSWtsYW4gdGlkYWsgcmVsZXZhbiddDQogIEE0YSBbbGFiZWw9J0ZyZWt1ZW5zaSB0ZXJsYWx1IHRpbmdnaSddDQogIEE0YiBbbGFiZWw9J0ZyZWt1ZW5zaSB0ZXJsYWx1IHJlbmRhaCddDQogIEE1YSBbbGFiZWw9J0FuZ2dhcmFuIHRlcmxhbHUga2VjaWwnXQ0KICBBNWIgW2xhYmVsPSdEaXN0cmlidXNpIHRpZGFrIG9wdGltYWwnXQ0KICBBNmEgW2xhYmVsPSdXYWt0dSBrYW1wYW55ZSBrdXJhbmcgdGVwYXQnXQ0KICBBNmIgW2xhYmVsPSdUZXJsYW1iYXQgbWVyZXNwb24gdHJlbiddDQoNCiAgQTEgLT4gUHJvYmxlbQ0KICBBMiAtPiBQcm9ibGVtDQogIEEzIC0+IFByb2JsZW0NCiAgQTQgLT4gUHJvYmxlbQ0KICBBNSAtPiBQcm9ibGVtDQogIEE2IC0+IFByb2JsZW0NCg0KICBBMWEgLT4gQTENCiAgQTFiIC0+IEExDQogIEEyYSAtPiBBMg0KICBBMmIgLT4gQTINCiAgQTNhIC0+IEEzDQogIEEzYiAtPiBBMw0KICBBNGEgLT4gQTQNCiAgQTRiIC0+IEE0DQogIEE1YSAtPiBBNQ0KICBBNWIgLT4gQTUNCiAgQTZhIC0+IEE2DQogIEE2YiAtPiBBNg0KfQ0KIikNCg0KIyBTaW1wYW4gaGFzaWwgc2ViYWdhaSBnYW1iYXINCmRpci5jcmVhdGUoImltYWdlcy9iYWI4IiwgcmVjdXJzaXZlID0gVFJVRSwgc2hvd1dhcm5pbmdzID0gRkFMU0UpDQpzdmdfY29kZSA8LSBEaWFncmFtbWVSc3ZnOjpleHBvcnRfc3ZnKGdyYXBoKQ0KDQpyc3ZnX3BuZyhjaGFyVG9SYXcoc3ZnX2NvZGUpLCBmaWxlID0gImltYWdlcy9iYWI4L2Zpc2hib25lX2NhbXBhaWduX2ZhaWwucG5nIiwgd2lkdGggPSAxMjAwLCBoZWlnaHQgPSA4MDApDQpyc3ZnX3BkZihjaGFyVG9SYXcoc3ZnX2NvZGUpLCBmaWxlID0gImltYWdlcy9iYWI4L2Zpc2hib25lX2NhbXBhaWduX2ZhaWwucGRmIikNCg0KIyBUYW1waWxrYW4gZ2FtYmFyIGRhbGFtIGRva3VtZW4NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJpbWFnZXMvYmFiOC9maXNoYm9uZV9jYW1wYWlnbl9mYWlsLnBuZyIpDQoNCmBgYA0KDQojIEZsb3djaGFydA0KDQpgYGB7ciwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGVjaG89VFJVRX0NCiMgUGFzdGlrYW4gcGFrZXQgRGlhZ3JhbW1lUiBzdWRhaCB0ZXJwYXNhbmcNCiMgaW5zdGFsbC5wYWNrYWdlcygiRGlhZ3JhbW1lUiIpDQoNCmxpYnJhcnkoRGlhZ3JhbW1lUikNCg0KZ3JWaXooIg0KZGlncmFwaCBrYW1wYW55ZSB7DQogIA0KICBncmFwaCBbcmFua2RpciA9IFRCLCBsYXlvdXQgPSBkb3RdDQoNCiAgbm9kZSBbc2hhcGUgPSBib3gsIHN0eWxlPWZpbGxlZCwgZmlsbGNvbG9yPWxpZ2h0Ymx1ZV0NCiAgQSBbbGFiZWwgPSAnUmlzZXQgUGFzYXIgJiBBdWRpZW5zJ10NCiAgQiBbbGFiZWwgPSAnU3VzdW4gU3RyYXRlZ2kgSWtsYW4nXQ0KICBDIFtsYWJlbCA9ICdMdW5jdXJrYW4gSWtsYW4nXQ0KICBEIFtsYWJlbCA9ICdNb25pdG9yIFJlc3BvbnMgJiBFbmdhZ2VtZW50J10NCiAgRSBbbGFiZWwgPSAnVGluZGFrIExhbmp1dCBrZSBDYWxvbiBQZWxhbmdnYW4nXQ0KICBGIFtsYWJlbCA9ICdLdW1wdWxrYW4gRGF0YSAmIEZlZWRiYWNrJ10NCiAgRyBbbGFiZWwgPSAnRXZhbHVhc2kgSGFzaWwgS2FtcGFueWUnXQ0KICANCiAgbm9kZSBbc2hhcGUgPSBkaWFtb25kLCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1sZW1vbmNoaWZmb25dDQogIEggW2xhYmVsID0gJ0FwYWthaCBUYXJnZXQgVGVyY2FwYWk/J10NCiAgDQogIG5vZGUgW3NoYXBlID0gZWxsaXBzZSwgc3R5bGU9ZmlsbGVkLCBmaWxsY29sb3I9cGlua10NCiAgSSBbbGFiZWwgPSAnTm8nXQ0KICANCiAgbm9kZSBbc2hhcGUgPSBib3gsIHN0eWxlPWZpbGxlZCwgZmlsbGNvbG9yPWxpZ2h0Z3JheV0NCiAgSiBbbGFiZWwgPSAnUGVyYmFpa2kgU3RyYXRlZ2knXQ0KDQogIG5vZGUgW3NoYXBlID0gYm94LCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1saWdodGdyZWVuXQ0KICBLIFtsYWJlbCA9ICdLYW1wYW55ZSBTdWtzZXMnXQ0KDQogIG5vZGUgW3NoYXBlID0gY2lyY2xlLCBzdHlsZT1maWxsZWQsIGZpbGxjb2xvcj1jeWFuXQ0KICBTdGFydCBbbGFiZWwgPSAnU3RhcnQnXQ0KDQogIFN0YXJ0IC0+IEEgLT4gQiAtPiBDIC0+IEQgLT4gRSAtPiBGIC0+IEcgLT4gSA0KICBIIC0+IEsgW2xhYmVsPSdZZXMnXQ0KICBIIC0+IEkNCiAgSSAtPiBKIC0+IEINCn0NCiIpDQoNCmBgYA0KDQpgYGANCg0K