Visualisasi Data

Assignment Week-4


Foto Kelompok 3

1 Pendahuluan

Visualisasi data merupakan metode penting dalam analisis data karena memungkinkan pemahaman pola, sebaran, dan hubungan antar variabel secara cepat dan intuitif. Praktikum ini bertujuan untuk membuat berbagai jenis visualisasi menggunakan bahasa pemrograman R, khususnya dengan paket ggplot2 dan ggridges.

Dataset yang digunakan adalah data simulasi nilai UAS mahasiswa dari beberapa fakultas, lengkap dengan informasi tambahan seperti waktu belajar, kehadiran, IPK, jenis kelamin, dan semester. Dataset ini memungkinkan pembuatan berbagai jenis visualisasi, termasuk Bar Chart, Histogram, Boxplot, Scatter Plot, Density Plot, Line Plot, Ridgeline Plot, dan Pie Chart, sehingga dapat dianalisis secara visual antar fakultas maupun variabel terkait.

Melalui visualisasi ini, diharapkan dapat diperoleh insight mengenai distribusi nilai mahasiswa, perbandingan nilai antar fakultas, serta hubungan antara waktu belajar dan hasil UAS, yang dapat mendukung pemahaman pola akademik mahasiswa secara lebih jelas.

2 Persiapan Data

data_mahasiswa <- data.frame(
  ID_Mahasiswa = c("M001", "M002", "M003", "M004", "M005", 
                   "M006", "M007", "M008", "M009", "M010", 
                   "M011", "M012"),
  Fakultas = c("Teknik", "Teknik", "Kedokteran", "Hukum", "Kedokteran", 
               "Hukum", "Teknik", "Hukum", "Kedokteran", "Hukum",
               "Teknik", "Kedokteran"),
  Nilai_UAS = c(85, 78, 92, 70, 88, 64, 94, 73, 81, 77, 90, 86),
  Waktu_belajar = c(10, 8, 15, 6, 12, 4, 16, 7, 10, 9, 13, 11),
  Kehadiran = c(95, 88, 98, 82, 97, 75, 99, 85, 91, 89, 96, 93),
  IPK = c(3.7, 3.4, 3.9, 2.9, 3.8, 2.6, 4.0, 3.3, 3.5, 3.2, 3.8, 3.6),
  Gender = c("L", "P", "L", "P", "L", "P", "L", "L", "L", "P", "P", "L"),
  Semester = c(5, 4, 3, 3, 5, 6, 6, 5, 4, 4, 3, 6)
)


print (data_mahasiswa)
##    ID_Mahasiswa   Fakultas Nilai_UAS Waktu_belajar Kehadiran IPK Gender
## 1          M001     Teknik        85            10        95 3.7      L
## 2          M002     Teknik        78             8        88 3.4      P
## 3          M003 Kedokteran        92            15        98 3.9      L
## 4          M004      Hukum        70             6        82 2.9      P
## 5          M005 Kedokteran        88            12        97 3.8      L
## 6          M006      Hukum        64             4        75 2.6      P
## 7          M007     Teknik        94            16        99 4.0      L
## 8          M008      Hukum        73             7        85 3.3      L
## 9          M009 Kedokteran        81            10        91 3.5      L
## 10         M010      Hukum        77             9        89 3.2      P
## 11         M011     Teknik        90            13        96 3.8      P
## 12         M012 Kedokteran        86            11        93 3.6      L
##    Semester
## 1         5
## 2         4
## 3         3
## 4         3
## 5         5
## 6         6
## 7         6
## 8         5
## 9         4
## 10        4
## 11        3
## 12        6

3 Visualisasi data

3.0.1 Bar Chart

Definisi:

Bar chart digunakan untuk menampilkan dan membandingkan data kategori (kategorikal) dalam bentuk batang tegak atau mendatar. Setiap batang mewakili satu kategori (misalnya Fakultas, Jenis Kelamin, atau Mata Kuliah), dan panjang batang menggambarkan jumlah, rata-rata, atau nilai tertentu dari kategori tersebut.

Aturan Penggunaan:

  • Gunakan jika data bersifat kategorik atau diskrit.

  • Sumbu X (horizontal) → kategori.

  • Sumbu Y (vertikal) → nilai (jumlah, frekuensi, rata-rata, dll).

  • Hindari terlalu banyak kategori karena grafik bisa jadi sulit dibaca.

kelebihan:

  • Sangat mudah dipahami oleh semua orang.

  • Cocok untuk membandingkan nilai antar kategori.

  • Dapat digunakan dengan berbagai variasi (stacked bar, grouped bar, horizontal bar).

kekurangan:

  • Tidak cocok untuk data kontinu (angka yang bersambung).

  • Sulit dibaca jika jumlah kategori terlalu banyak atau label panjang.

library(ggplot2)

ggplot(data_mahasiswa, aes(x = Fakultas, y = IPK, fill = Fakultas)) +
  stat_summary(fun = mean, geom = "bar") +
  labs(title = "Rata-rata IPK per Fakultas", y = "IPK Rata-rata") +
  theme_minimal()

# Tujuan: Membandingkan kategori fakultas berdasarkan IPK rata-rata

3.0.2 Histogram: Distribusi Nilai UAS

Definisi:

Histogram digunakan untuk menunjukkan distribusi frekuensi dari data numerik (misalnya nilai ujian, IPK, tinggi badan, dll). Berbeda dari bar chart, histogram tidak menampilkan kategori melainkan interval nilai (bin). Tiap batang mewakili jumlah data yang berada dalam rentang nilai tertentu.

Aturan Penggunaan:

  • Gunakan untuk data numerik kontinu.

  • Sumbu X → interval nilai.

  • Sumbu Y → frekuensi data dalam interval itu.

  • Jumlah bin (interval) dapat diatur untuk hasil yang lebih detail atau ringkas.

kelebihan:

  • Menunjukkan bentuk distribusi data (normal, miring, dll).

  • Dapat membantu menemukan outlier atau sebaran nilai yang tidak merata.

Kekurangan:

  • Hasil bisa berubah tergantung pengaturan jumlah bin.

  • Tidak cocok untuk data kategorik.

  • Tidak menunjukkan nilai individual.

ggplot(data_mahasiswa, aes(x = Nilai_UAS)) +
  geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
  labs(title = "Distribusi Nilai UAS", x = "Nilai UAS", y = "Frekuensi") +
  theme_minimal()

# Tujuan: Melihat distribusi data numerik (nilai UAS)

3.0.3 Boxplot: Distribusi Kehadiran per Fakultas

Definisi:

Boxplot (box-and-whisker plot) menampilkan sebaran data numerik melalui lima ukuran statistik utama: nilai minimum, kuartil pertama (Q1), median, kuartil ketiga (Q3), dan maksimum, serta menandai outlier (data ekstrem).

Aturan Penggunaan:

  • Gunakan untuk data numerik.

  • Cocok untuk membandingkan sebaran data antar kelompok (misalnya IPK per fakultas).

  • Median menunjukkan nilai tengah, panjang kotak menunjukkan tingkat variasi data.

Kelebihan:

  • Memberikan ringkasan sebaran data secara cepat.

  • Dapat mendeteksi outlier dengan mudah.

  • Ideal untuk membandingkan beberapa kelompok data sekaligus.

Kekurangan:

  • Tidak menunjukkan detail distribusi (seperti bentuk kurva).

  • Sulit dipahami oleh orang awam.

ggplot(data_mahasiswa, aes(x = Fakultas, y = Kehadiran, fill = Fakultas)) +
  geom_boxplot() +
  labs(title = "Distribusi Kehadiran per Fakultas", y = "Kehadiran (%)") +
  theme_minimal()

# Tujuan: Mengetahui penyebaran data dan mendeteksi outlier

3.0.4 Pie Chart: Proporsi Mahasiswa per Fakultas

Definisi:

Pie chart menggambarkan proporsi atau persentase dari setiap kategori terhadap total keseluruhan dalam bentuk irisan lingkaran. Setiap potongan (slice) menunjukkan seberapa besar kontribusi suatu kategori dibanding total.

Aturan Penggunaan:

  • Gunakan untuk data kategorik dengan total = 100%.

  • Gunakan maksimal 5–6 kategori agar grafik tetap jelas.

  • Gunakan label persentase agar mudah dibaca.

Kelebihan:

  • Menarik secara visual dan mudah dipahami.

  • Cocok untuk menunjukkan perbandingan bagian terhadap keseluruhan.

Kekurangan:

  • Tidak akurat untuk banyak kategori.

  • Sulit membandingkan ukuran antar irisan secara tepat.

  • Tidak menunjukkan nilai absolut.

pie_data <- as.data.frame(table(data_mahasiswa$Fakultas))
colnames(pie_data) <- c("Fakultas", "Jumlah")

ggplot(pie_data, aes(x = "", y = Jumlah, fill = Fakultas)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Proporsi Mahasiswa per Fakultas") +
  theme_void()

# Tujuan: Menunjukkan proporsi kategori mahasiswa per fakultas

3.0.5 Scatter Plot: Waktu Belajar vs Nilai UAS

Definisi:

Scatter plot menampilkan hubungan antara dua variabel numerik dalam bentuk titik-titik pada bidang koordinat. Setiap titik mewakili satu data (misalnya satu mahasiswa), dengan posisi X dan Y mewakili dua nilai variabel.

Aturan Penggunaan:

  • Gunakan untuk menunjukkan korelasi atau hubungan antara dua variabel numerik (misal: Waktu Belajar vs Nilai UAS).

  • Bisa ditambah warna/shape untuk membedakan kelompok (misalnya fakultas).

Kelebihan:

  • Menunjukkan hubungan atau pola (positif, negatif, acak).

  • Bisa mendeteksi outlier.

  • Cocok untuk analisis korelasi.

Kekurangan:

  • Tidak cocok untuk data kategorik.

  • Jika data terlalu banyak, titik bisa saling menumpuk.

ggplot(data_mahasiswa, aes(x = Waktu_belajar, y = Nilai_UAS, color = Fakultas)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, linetype = "dashed") +
  labs(title = "Hubungan Waktu Belajar vs Nilai UAS",
       x = "Waktu Belajar (jam)",
       y = "Nilai UAS") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# Tujuan: Melihat hubungan antara dua variabel numerik

3.0.6 Line Plot: Nilai UAS per Mahasiswa

Definisi:

Line plot digunakan untuk menunjukkan perubahan data secara berurutan, biasanya berdasarkan waktu atau urutan tertentu (misalnya tren nilai per semester). Setiap titik data dihubungkan dengan garis, sehingga kita bisa melihat pola tren naik atau turun.

Aturan Penggunaan:

  • Gunakan untuk data berurutan atau time series.

  • Sumbu X → waktu atau urutan.

  • Sumbu Y → nilai yang diukur.

  • Gunakan warna berbeda jika membandingkan beberapa seri.

Kelebihan:

  • Sangat bagus untuk menampilkan tren dan perubahan dari waktu ke waktu.

  • Mudah dibaca dan dimengerti.

  • Dapat menampilkan beberapa seri data sekaligus.

Kekurangan:

  • Tidak cocok untuk data yang tidak berurutan.

  • Bisa membingungkan jika terlalu banyak garis.

ggplot(data_mahasiswa, aes(x = ID_Mahasiswa, y = Nilai_UAS, group = 1)) +
  geom_line(color = "blue") +
  geom_point(size = 3, color = "red") +
  labs(title = "Nilai UAS per Mahasiswa", x = "ID Mahasiswa", y = "Nilai UAS") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Tujuan: Menampilkan tren/urutan data nilai per mahasiswa

3.0.7 Density Plot: Estimasi distribusi IPK

Definisi:

Density plot adalah grafik yang menunjukkan bentuk distribusi data numerik secara halus (smooth). Mirip histogram, tapi menggantikan batang dengan kurva halus yang memperkirakan kepadatan data. Kurva yang tinggi menunjukkan banyak data di area tersebut.

Aturan Penggunaan:

  • Gunakan untuk data numerik kontinu.

  • Cocok untuk membandingkan beberapa kelompok (misalnya distribusi IPK per fakultas).

  • Biasanya dibuat dengan fungsi geom_density() di R.

Kelebihan:

  • Menunjukkan bentuk distribusi dengan lebih lembut.

  • Cocok untuk perbandingan antar kelompok.

  • Terlihat lebih estetis daripada histogram.

Kekurangan:

  • Kurang akurat untuk dataset kecil.

  • Tidak menunjukkan jumlah data secara langsung.

ggplot(data_mahasiswa, aes(x = IPK, fill = Fakultas)) +
  geom_density(alpha = 0.5) +
  labs(title = "Density Plot IPK per Fakultas", x = "IPK", y = "Density") +
  theme_minimal()

# Tujuan: Mengestimasi distribusi probabilitas variabel numerik

3.0.8 Ridgeline Plot: Distribusi Nilai UAS per Fakultas

Definisi:

Ridgeline plot (atau joyplot) adalah kumpulan dari beberapa density plot yang ditumpuk secara vertikal, digunakan untuk membandingkan distribusi data antar kategori. Setiap “gelombang” (ridge) mewakili satu kelompok, dan bentuknya menunjukkan pola sebaran nilai dalam kelompok tersebut.

Aturan Penggunaan:

  • Gunakan untuk membandingkan distribusi data numerik antar kategori (misalnya Nilai UAS per Fakultas).

  • Biasanya dibuat dengan paket ggridges di R.

Kelebihan:

  • Visualnya menarik dan informatif.

  • Mudah melihat perbedaan pola distribusi antar kategori.

  • Cocok untuk dataset dengan banyak kelompok.

Kekurangan:

  • Bisa sulit dibaca kalau kategori terlalu banyak.

  • Tidak menunjukkan nilai numerik yang spesifik.

library(ggridges)

ggplot(data_mahasiswa, aes(x = Nilai_UAS, y = Fakultas, fill = Fakultas)) +
  geom_density_ridges(alpha = 0.7) +
  labs(title = "Ridgeline Plot Nilai UAS per Fakultas", x = "Nilai UAS", y = "Fakultas") +
  theme_ridges() +
  theme(legend.position = "none")
## Picking joint bandwidth of 2.97

# Tujuan: Membandingkan distribusi beberapa kelompok sekaligus

4 Kesimpulan

Berdasarkan visualisasi:

  • Nilai UAS mahasiswa berbeda antar fakultas, beberapa fakultas memiliki nilai rata-rata lebih tinggi.

  • Sebaran nilai umumnya normal, tapi ada beberapa outlier.

  • Mahasiswa dengan waktu belajar lebih tinggi cenderung memperoleh nilai UAS lebih baik.

  • Ridgeline, Boxplot, dan Pie Chart membantu membandingkan distribusi dan proporsi antar fakultas.

  • Visualisasi ini mempermudah pemahaman pola akademik mahasiswa dan hubungan antar variabel dengan cepat.

LS0tDQp0aXRsZTogIlZpc3VhbGlzYXNpIERhdGEiDQpzdWJ0aXRsZTogIkFzc2lnbm1lbnQgV2Vlay00Ig0KYXV0aG9yOg0KLSAiS2Vsb21wb2sgMyIgDQotICJOYWlmYWggRWRyaWEgQXJ0YSAoNTIyNTAwNTYpIg0KLSAiRnJpenp5IExpdGhtZW5zeWFoICg1MjI1MDA2MikiDQotICJMdWx1IE5hamxhIFNhbHNhYmlsYSAoNTIyNTAwNjkpIg0KLSAiTmFpbGEgU3lhaHJhbmkgUHV0cmkgKDUyMjUwMDcwKSINCi0gIk5pLiBNZCBBdXJvcmEgU2VrYXJuaW5ncnVtICg1MjI1MDA3MikiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KPGNlbnRlcj4NCjxpbWcgc3JjPSJDOi9Vc2Vycy9hY2VyL0RvY3VtZW50cy9XaGF0c0FwcCBJbWFnZSAyMDI1LTEwLTE2IGF0IDE4LjQyLjA2X2Y1NGNiNzliLmpwZyIgd2lkdGg9IjMwMCI+PGJyPg0KPGI+Rm90byBLZWxvbXBvayAzPC9iPg0KPC9jZW50ZXI+DQoNCi0tLQ0KDQojIFBlbmRhaHVsdWFuDQpWaXN1YWxpc2FzaSBkYXRhIG1lcnVwYWthbiBtZXRvZGUgcGVudGluZyBkYWxhbSBhbmFsaXNpcyBkYXRhIGthcmVuYSBtZW11bmdraW5rYW4gcGVtYWhhbWFuIHBvbGEsIHNlYmFyYW4sIGRhbiBodWJ1bmdhbiBhbnRhciB2YXJpYWJlbCBzZWNhcmEgY2VwYXQgZGFuIGludHVpdGlmLiBQcmFrdGlrdW0gaW5pIGJlcnR1anVhbiB1bnR1ayBtZW1idWF0IGJlcmJhZ2FpIGplbmlzIHZpc3VhbGlzYXNpIG1lbmdndW5ha2FuIGJhaGFzYSBwZW1yb2dyYW1hbiBSLCBraHVzdXNueWEgZGVuZ2FuIHBha2V0IGBnZ3Bsb3QyYCBkYW4gYGdncmlkZ2VzYC4NCg0KRGF0YXNldCB5YW5nIGRpZ3VuYWthbiBhZGFsYWggZGF0YSBzaW11bGFzaSAqKm5pbGFpIFVBUyBtYWhhc2lzd2EgZGFyaSBiZWJlcmFwYSBmYWt1bHRhcyoqLCBsZW5na2FwIGRlbmdhbiBpbmZvcm1hc2kgdGFtYmFoYW4gc2VwZXJ0aSAqKndha3R1IGJlbGFqYXIsIGtlaGFkaXJhbiwgSVBLLCBqZW5pcyBrZWxhbWluLCBkYW4gc2VtZXN0ZXIqKi4gRGF0YXNldCBpbmkgbWVtdW5na2lua2FuIHBlbWJ1YXRhbiBiZXJiYWdhaSBqZW5pcyB2aXN1YWxpc2FzaSwgdGVybWFzdWsgKipCYXIgQ2hhcnQsIEhpc3RvZ3JhbSwgQm94cGxvdCwgU2NhdHRlciBQbG90LCBEZW5zaXR5IFBsb3QsIExpbmUgUGxvdCwgUmlkZ2VsaW5lIFBsb3QsIGRhbiBQaWUgQ2hhcnQqKiwgc2VoaW5nZ2EgZGFwYXQgZGlhbmFsaXNpcyBzZWNhcmEgdmlzdWFsIGFudGFyIGZha3VsdGFzIG1hdXB1biB2YXJpYWJlbCB0ZXJrYWl0Lg0KDQpNZWxhbHVpIHZpc3VhbGlzYXNpIGluaSwgZGloYXJhcGthbiBkYXBhdCBkaXBlcm9sZWggKippbnNpZ2h0IG1lbmdlbmFpIGRpc3RyaWJ1c2kgbmlsYWkgbWFoYXNpc3dhKiosIHBlcmJhbmRpbmdhbiBuaWxhaSBhbnRhciBmYWt1bHRhcywgc2VydGEgaHVidW5nYW4gYW50YXJhICoqd2FrdHUgYmVsYWphciBkYW4gaGFzaWwgVUFTKiosIHlhbmcgZGFwYXQgbWVuZHVrdW5nIHBlbWFoYW1hbiBwb2xhIGFrYWRlbWlrIG1haGFzaXN3YSBzZWNhcmEgbGViaWggamVsYXMuDQoNCiMgUGVyc2lhcGFuIERhdGENCmBgYHtyfQ0KZGF0YV9tYWhhc2lzd2EgPC0gZGF0YS5mcmFtZSgNCiAgSURfTWFoYXNpc3dhID0gYygiTTAwMSIsICJNMDAyIiwgIk0wMDMiLCAiTTAwNCIsICJNMDA1IiwgDQogICAgICAgICAgICAgICAgICAgIk0wMDYiLCAiTTAwNyIsICJNMDA4IiwgIk0wMDkiLCAiTTAxMCIsIA0KICAgICAgICAgICAgICAgICAgICJNMDExIiwgIk0wMTIiKSwNCiAgRmFrdWx0YXMgPSBjKCJUZWtuaWsiLCAiVGVrbmlrIiwgIktlZG9rdGVyYW4iLCAiSHVrdW0iLCAiS2Vkb2t0ZXJhbiIsIA0KICAgICAgICAgICAgICAgIkh1a3VtIiwgIlRla25payIsICJIdWt1bSIsICJLZWRva3RlcmFuIiwgIkh1a3VtIiwNCiAgICAgICAgICAgICAgICJUZWtuaWsiLCAiS2Vkb2t0ZXJhbiIpLA0KICBOaWxhaV9VQVMgPSBjKDg1LCA3OCwgOTIsIDcwLCA4OCwgNjQsIDk0LCA3MywgODEsIDc3LCA5MCwgODYpLA0KICBXYWt0dV9iZWxhamFyID0gYygxMCwgOCwgMTUsIDYsIDEyLCA0LCAxNiwgNywgMTAsIDksIDEzLCAxMSksDQogIEtlaGFkaXJhbiA9IGMoOTUsIDg4LCA5OCwgODIsIDk3LCA3NSwgOTksIDg1LCA5MSwgODksIDk2LCA5MyksDQogIElQSyA9IGMoMy43LCAzLjQsIDMuOSwgMi45LCAzLjgsIDIuNiwgNC4wLCAzLjMsIDMuNSwgMy4yLCAzLjgsIDMuNiksDQogIEdlbmRlciA9IGMoIkwiLCAiUCIsICJMIiwgIlAiLCAiTCIsICJQIiwgIkwiLCAiTCIsICJMIiwgIlAiLCAiUCIsICJMIiksDQogIFNlbWVzdGVyID0gYyg1LCA0LCAzLCAzLCA1LCA2LCA2LCA1LCA0LCA0LCAzLCA2KQ0KKQ0KDQoNCnByaW50IChkYXRhX21haGFzaXN3YSkNCmBgYA0KDQojIFZpc3VhbGlzYXNpIGRhdGENCg0KIyMjIEJhciBDaGFydA0KDQoqKipEZWZpbmlzaToqKioNCg0KQmFyIGNoYXJ0IGRpZ3VuYWthbiB1bnR1ayBtZW5hbXBpbGthbiBkYW4gbWVtYmFuZGluZ2thbiBkYXRhIGthdGVnb3JpIChrYXRlZ29yaWthbCkgZGFsYW0gYmVudHVrIGJhdGFuZyB0ZWdhayBhdGF1IG1lbmRhdGFyLg0KU2V0aWFwIGJhdGFuZyBtZXdha2lsaSBzYXR1IGthdGVnb3JpIChtaXNhbG55YSBGYWt1bHRhcywgSmVuaXMgS2VsYW1pbiwgYXRhdSBNYXRhIEt1bGlhaCksIGRhbiBwYW5qYW5nIGJhdGFuZyBtZW5nZ2FtYmFya2FuIGp1bWxhaCwgcmF0YS1yYXRhLCBhdGF1IG5pbGFpIHRlcnRlbnR1IGRhcmkga2F0ZWdvcmkgdGVyc2VidXQuDQoNCioqKkF0dXJhbiBQZW5nZ3VuYWFuOioqKg0KDQotIEd1bmFrYW4gamlrYSBkYXRhIGJlcnNpZmF0IGthdGVnb3JpayBhdGF1IGRpc2tyaXQuDQoNCi0gU3VtYnUgWCAoaG9yaXpvbnRhbCkg4oaSIGthdGVnb3JpLg0KDQotIFN1bWJ1IFkgKHZlcnRpa2FsKSDihpIgbmlsYWkgKGp1bWxhaCwgZnJla3VlbnNpLCByYXRhLXJhdGEsIGRsbCkuDQoNCi0gSGluZGFyaSB0ZXJsYWx1IGJhbnlhayBrYXRlZ29yaSBrYXJlbmEgZ3JhZmlrIGJpc2EgamFkaSBzdWxpdCBkaWJhY2EuDQoNCioqKmtlbGViaWhhbjoqKioNCg0KLSBTYW5nYXQgbXVkYWggZGlwYWhhbWkgb2xlaCBzZW11YSBvcmFuZy4NCg0KLSBDb2NvayB1bnR1ayBtZW1iYW5kaW5na2FuIG5pbGFpIGFudGFyIGthdGVnb3JpLg0KDQotIERhcGF0IGRpZ3VuYWthbiBkZW5nYW4gYmVyYmFnYWkgdmFyaWFzaSAoc3RhY2tlZCBiYXIsIGdyb3VwZWQgYmFyLCBob3Jpem9udGFsIGJhcikuDQoNCioqKmtla3VyYW5nYW46KioqDQoNCi0gVGlkYWsgY29jb2sgdW50dWsgZGF0YSBrb250aW51IChhbmdrYSB5YW5nIGJlcnNhbWJ1bmcpLg0KDQotIFN1bGl0IGRpYmFjYSBqaWthIGp1bWxhaCBrYXRlZ29yaSB0ZXJsYWx1IGJhbnlhayBhdGF1IGxhYmVsIHBhbmphbmcuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhX21haGFzaXN3YSwgYWVzKHggPSBGYWt1bHRhcywgeSA9IElQSywgZmlsbCA9IEZha3VsdGFzKSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJiYXIiKSArDQogIGxhYnModGl0bGUgPSAiUmF0YS1yYXRhIElQSyBwZXIgRmFrdWx0YXMiLCB5ID0gIklQSyBSYXRhLXJhdGEiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIFR1anVhbjogTWVtYmFuZGluZ2thbiBrYXRlZ29yaSBmYWt1bHRhcyBiZXJkYXNhcmthbiBJUEsgcmF0YS1yYXRhDQoNCmBgYA0KDQoNCiMjIyBIaXN0b2dyYW06IERpc3RyaWJ1c2kgTmlsYWkgVUFTDQoNCioqKkRlZmluaXNpOioqKg0KDQpIaXN0b2dyYW0gZGlndW5ha2FuIHVudHVrIG1lbnVuanVra2FuIGRpc3RyaWJ1c2kgZnJla3VlbnNpIGRhcmkgZGF0YSBudW1lcmlrIChtaXNhbG55YSBuaWxhaSB1amlhbiwgSVBLLCB0aW5nZ2kgYmFkYW4sIGRsbCkuDQpCZXJiZWRhIGRhcmkgYmFyIGNoYXJ0LCBoaXN0b2dyYW0gdGlkYWsgbWVuYW1waWxrYW4ga2F0ZWdvcmkgbWVsYWlua2FuIGludGVydmFsIG5pbGFpIChiaW4pLiBUaWFwIGJhdGFuZyBtZXdha2lsaSBqdW1sYWggZGF0YSB5YW5nIGJlcmFkYSBkYWxhbSByZW50YW5nIG5pbGFpIHRlcnRlbnR1Lg0KDQoqKipBdHVyYW4gUGVuZ2d1bmFhbjoqKioNCg0KLSBHdW5ha2FuIHVudHVrIGRhdGEgbnVtZXJpayBrb250aW51Lg0KDQotIFN1bWJ1IFgg4oaSIGludGVydmFsIG5pbGFpLg0KDQotIFN1bWJ1IFkg4oaSIGZyZWt1ZW5zaSBkYXRhIGRhbGFtIGludGVydmFsIGl0dS4NCg0KLSBKdW1sYWggYmluIChpbnRlcnZhbCkgZGFwYXQgZGlhdHVyIHVudHVrIGhhc2lsIHlhbmcgbGViaWggZGV0YWlsIGF0YXUgcmluZ2thcy4NCg0KKioqa2VsZWJpaGFuOioqKg0KDQotIE1lbnVuanVra2FuIGJlbnR1ayBkaXN0cmlidXNpIGRhdGEgKG5vcm1hbCwgbWlyaW5nLCBkbGwpLg0KDQotIERhcGF0IG1lbWJhbnR1IG1lbmVtdWthbiBvdXRsaWVyIGF0YXUgc2ViYXJhbiBuaWxhaSB5YW5nIHRpZGFrIG1lcmF0YS4NCg0KKioqS2VrdXJhbmdhbjoqKioNCg0KLSBIYXNpbCBiaXNhIGJlcnViYWggdGVyZ2FudHVuZyBwZW5nYXR1cmFuIGp1bWxhaCBiaW4uDQoNCi0gVGlkYWsgY29jb2sgdW50dWsgZGF0YSBrYXRlZ29yaWsuDQoNCi0gVGlkYWsgbWVudW5qdWtrYW4gbmlsYWkgaW5kaXZpZHVhbC4NCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YV9tYWhhc2lzd2EsIGFlcyh4ID0gTmlsYWlfVUFTKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1c2kgTmlsYWkgVUFTIiwgeCA9ICJOaWxhaSBVQVMiLCB5ID0gIkZyZWt1ZW5zaSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgVHVqdWFuOiBNZWxpaGF0IGRpc3RyaWJ1c2kgZGF0YSBudW1lcmlrIChuaWxhaSBVQVMpDQpgYGANCg0KDQojIyMgQm94cGxvdDogRGlzdHJpYnVzaSBLZWhhZGlyYW4gcGVyIEZha3VsdGFzDQoNCioqKkRlZmluaXNpOioqKg0KDQpCb3hwbG90IChib3gtYW5kLXdoaXNrZXIgcGxvdCkgbWVuYW1waWxrYW4gc2ViYXJhbiBkYXRhIG51bWVyaWsgbWVsYWx1aSBsaW1hIHVrdXJhbiBzdGF0aXN0aWsgdXRhbWE6DQpuaWxhaSBtaW5pbXVtLCBrdWFydGlsIHBlcnRhbWEgKFExKSwgbWVkaWFuLCBrdWFydGlsIGtldGlnYSAoUTMpLCBkYW4gbWFrc2ltdW0sIHNlcnRhIG1lbmFuZGFpIG91dGxpZXIgKGRhdGEgZWtzdHJlbSkuDQoNCioqKkF0dXJhbiBQZW5nZ3VuYWFuOioqKg0KDQotIEd1bmFrYW4gdW50dWsgZGF0YSBudW1lcmlrLg0KDQotIENvY29rIHVudHVrIG1lbWJhbmRpbmdrYW4gc2ViYXJhbiBkYXRhIGFudGFyIGtlbG9tcG9rIChtaXNhbG55YSBJUEsgcGVyIGZha3VsdGFzKS4NCg0KLSBNZWRpYW4gbWVudW5qdWtrYW4gbmlsYWkgdGVuZ2FoLCBwYW5qYW5nIGtvdGFrIG1lbnVuanVra2FuIHRpbmdrYXQgdmFyaWFzaSBkYXRhLg0KDQoqKipLZWxlYmloYW46KioqDQoNCi0gTWVtYmVyaWthbiByaW5na2FzYW4gc2ViYXJhbiBkYXRhIHNlY2FyYSBjZXBhdC4NCg0KLSBEYXBhdCBtZW5kZXRla3NpIG91dGxpZXIgZGVuZ2FuIG11ZGFoLg0KDQotIElkZWFsIHVudHVrIG1lbWJhbmRpbmdrYW4gYmViZXJhcGEga2Vsb21wb2sgZGF0YSBzZWthbGlndXMuDQoNCioqKktla3VyYW5nYW46KioqDQoNCi0gVGlkYWsgbWVudW5qdWtrYW4gZGV0YWlsIGRpc3RyaWJ1c2kgKHNlcGVydGkgYmVudHVrIGt1cnZhKS4NCg0KLSBTdWxpdCBkaXBhaGFtaSBvbGVoIG9yYW5nIGF3YW0uDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YV9tYWhhc2lzd2EsIGFlcyh4ID0gRmFrdWx0YXMsIHkgPSBLZWhhZGlyYW4sIGZpbGwgPSBGYWt1bHRhcykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1c2kgS2VoYWRpcmFuIHBlciBGYWt1bHRhcyIsIHkgPSAiS2VoYWRpcmFuICglKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgVHVqdWFuOiBNZW5nZXRhaHVpIHBlbnllYmFyYW4gZGF0YSBkYW4gbWVuZGV0ZWtzaSBvdXRsaWVyDQpgYGANCg0KDQoNCiMjIyBQaWUgQ2hhcnQ6IFByb3BvcnNpIE1haGFzaXN3YSBwZXIgRmFrdWx0YXMNCg0KKioqRGVmaW5pc2k6KioqDQoNClBpZSBjaGFydCBtZW5nZ2FtYmFya2FuIHByb3BvcnNpIGF0YXUgcGVyc2VudGFzZSBkYXJpIHNldGlhcCBrYXRlZ29yaSB0ZXJoYWRhcCB0b3RhbCBrZXNlbHVydWhhbiBkYWxhbSBiZW50dWsgaXJpc2FuIGxpbmdrYXJhbi4NClNldGlhcCBwb3RvbmdhbiAoc2xpY2UpIG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIGtvbnRyaWJ1c2kgc3VhdHUga2F0ZWdvcmkgZGliYW5kaW5nIHRvdGFsLg0KDQoqKipBdHVyYW4gUGVuZ2d1bmFhbjoqKioNCg0KLSBHdW5ha2FuIHVudHVrIGRhdGEga2F0ZWdvcmlrIGRlbmdhbiB0b3RhbCA9IDEwMCUuDQoNCi0gR3VuYWthbiBtYWtzaW1hbCA14oCTNiBrYXRlZ29yaSBhZ2FyIGdyYWZpayB0ZXRhcCBqZWxhcy4NCg0KLSBHdW5ha2FuIGxhYmVsIHBlcnNlbnRhc2UgYWdhciBtdWRhaCBkaWJhY2EuDQoNCioqKktlbGViaWhhbjoqKioNCg0KLSBNZW5hcmlrIHNlY2FyYSB2aXN1YWwgZGFuIG11ZGFoIGRpcGFoYW1pLg0KDQotIENvY29rIHVudHVrIG1lbnVuanVra2FuIHBlcmJhbmRpbmdhbiBiYWdpYW4gdGVyaGFkYXAga2VzZWx1cnVoYW4uDQoNCioqKktla3VyYW5nYW46KioqDQoNCi0gVGlkYWsgYWt1cmF0IHVudHVrIGJhbnlhayBrYXRlZ29yaS4NCg0KLSBTdWxpdCBtZW1iYW5kaW5na2FuIHVrdXJhbiBhbnRhciBpcmlzYW4gc2VjYXJhIHRlcGF0Lg0KDQotIFRpZGFrIG1lbnVuanVra2FuIG5pbGFpIGFic29sdXQuDQoNCmBgYHtyfQ0KcGllX2RhdGEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhX21haGFzaXN3YSRGYWt1bHRhcykpDQpjb2xuYW1lcyhwaWVfZGF0YSkgPC0gYygiRmFrdWx0YXMiLCAiSnVtbGFoIikNCg0KZ2dwbG90KHBpZV9kYXRhLCBhZXMoeCA9ICIiLCB5ID0gSnVtbGFoLCBmaWxsID0gRmFrdWx0YXMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JzaSBNYWhhc2lzd2EgcGVyIEZha3VsdGFzIikgKw0KICB0aGVtZV92b2lkKCkNCg0KIyBUdWp1YW46IE1lbnVuanVra2FuIHByb3BvcnNpIGthdGVnb3JpIG1haGFzaXN3YSBwZXIgZmFrdWx0YXMNCmBgYA0KDQoNCiMjIyBTY2F0dGVyIFBsb3Q6IFdha3R1IEJlbGFqYXIgdnMgTmlsYWkgVUFTDQoNCioqKkRlZmluaXNpOioqKg0KDQpTY2F0dGVyIHBsb3QgbWVuYW1waWxrYW4gaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbCBudW1lcmlrIGRhbGFtIGJlbnR1ayB0aXRpay10aXRpayBwYWRhIGJpZGFuZyBrb29yZGluYXQuDQpTZXRpYXAgdGl0aWsgbWV3YWtpbGkgc2F0dSBkYXRhIChtaXNhbG55YSBzYXR1IG1haGFzaXN3YSksIGRlbmdhbiBwb3Npc2kgWCBkYW4gWSBtZXdha2lsaSBkdWEgbmlsYWkgdmFyaWFiZWwuDQoNCioqKkF0dXJhbiBQZW5nZ3VuYWFuOioqKg0KDQotIEd1bmFrYW4gdW50dWsgbWVudW5qdWtrYW4ga29yZWxhc2kgYXRhdSBodWJ1bmdhbiBhbnRhcmEgZHVhIHZhcmlhYmVsIG51bWVyaWsgKG1pc2FsOiBXYWt0dSBCZWxhamFyIHZzIE5pbGFpIFVBUykuDQoNCi0gQmlzYSBkaXRhbWJhaCB3YXJuYS9zaGFwZSB1bnR1ayBtZW1iZWRha2FuIGtlbG9tcG9rIChtaXNhbG55YSBmYWt1bHRhcykuDQoNCioqKktlbGViaWhhbjoqKioNCg0KLSBNZW51bmp1a2thbiBodWJ1bmdhbiBhdGF1IHBvbGEgKHBvc2l0aWYsIG5lZ2F0aWYsIGFjYWspLg0KDQotIEJpc2EgbWVuZGV0ZWtzaSBvdXRsaWVyLg0KDQotIENvY29rIHVudHVrIGFuYWxpc2lzIGtvcmVsYXNpLg0KDQoqKipLZWt1cmFuZ2FuOioqKg0KDQotIFRpZGFrIGNvY29rIHVudHVrIGRhdGEga2F0ZWdvcmlrLg0KDQotIEppa2EgZGF0YSB0ZXJsYWx1IGJhbnlhaywgdGl0aWsgYmlzYSBzYWxpbmcgbWVudW1wdWsuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGFfbWFoYXNpc3dhLCBhZXMoeCA9IFdha3R1X2JlbGFqYXIsIHkgPSBOaWxhaV9VQVMsIGNvbG9yID0gRmFrdWx0YXMpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBsYWJzKHRpdGxlID0gIkh1YnVuZ2FuIFdha3R1IEJlbGFqYXIgdnMgTmlsYWkgVUFTIiwNCiAgICAgICB4ID0gIldha3R1IEJlbGFqYXIgKGphbSkiLA0KICAgICAgIHkgPSAiTmlsYWkgVUFTIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBUdWp1YW46IE1lbGloYXQgaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbCBudW1lcmlrDQpgYGANCg0KDQojIyMgTGluZSBQbG90OiBOaWxhaSBVQVMgcGVyIE1haGFzaXN3YQ0KDQoqKipEZWZpbmlzaToqKioNCg0KTGluZSBwbG90IGRpZ3VuYWthbiB1bnR1ayBtZW51bmp1a2thbiBwZXJ1YmFoYW4gZGF0YSBzZWNhcmEgYmVydXJ1dGFuLCBiaWFzYW55YSBiZXJkYXNhcmthbiB3YWt0dSBhdGF1IHVydXRhbiB0ZXJ0ZW50dSAobWlzYWxueWEgdHJlbiBuaWxhaSBwZXIgc2VtZXN0ZXIpLg0KU2V0aWFwIHRpdGlrIGRhdGEgZGlodWJ1bmdrYW4gZGVuZ2FuIGdhcmlzLCBzZWhpbmdnYSBraXRhIGJpc2EgbWVsaWhhdCBwb2xhIHRyZW4gbmFpayBhdGF1IHR1cnVuLg0KDQoqKipBdHVyYW4gUGVuZ2d1bmFhbjoqKioNCg0KLSBHdW5ha2FuIHVudHVrIGRhdGEgYmVydXJ1dGFuIGF0YXUgdGltZSBzZXJpZXMuDQoNCi0gU3VtYnUgWCDihpIgd2FrdHUgYXRhdSB1cnV0YW4uDQoNCi0gU3VtYnUgWSDihpIgbmlsYWkgeWFuZyBkaXVrdXIuDQoNCi0gR3VuYWthbiB3YXJuYSBiZXJiZWRhIGppa2EgbWVtYmFuZGluZ2thbiBiZWJlcmFwYSBzZXJpLg0KDQoqKipLZWxlYmloYW46KioqDQoNCi0gU2FuZ2F0IGJhZ3VzIHVudHVrIG1lbmFtcGlsa2FuIHRyZW4gZGFuIHBlcnViYWhhbiBkYXJpIHdha3R1IGtlIHdha3R1Lg0KDQotIE11ZGFoIGRpYmFjYSBkYW4gZGltZW5nZXJ0aS4NCg0KLSBEYXBhdCBtZW5hbXBpbGthbiBiZWJlcmFwYSBzZXJpIGRhdGEgc2VrYWxpZ3VzLg0KDQoqKipLZWt1cmFuZ2FuOioqKg0KDQotIFRpZGFrIGNvY29rIHVudHVrIGRhdGEgeWFuZyB0aWRhayBiZXJ1cnV0YW4uDQoNCi0gQmlzYSBtZW1iaW5ndW5na2FuIGppa2EgdGVybGFsdSBiYW55YWsgZ2FyaXMuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGFfbWFoYXNpc3dhLCBhZXMoeCA9IElEX01haGFzaXN3YSwgeSA9IE5pbGFpX1VBUywgZ3JvdXAgPSAxKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmx1ZSIpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMywgY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIk5pbGFpIFVBUyBwZXIgTWFoYXNpc3dhIiwgeCA9ICJJRCBNYWhhc2lzd2EiLCB5ID0gIk5pbGFpIFVBUyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KIyBUdWp1YW46IE1lbmFtcGlsa2FuIHRyZW4vdXJ1dGFuIGRhdGEgbmlsYWkgcGVyIG1haGFzaXN3YQ0KYGBgDQoNCg0KDQojIyMgRGVuc2l0eSBQbG90OiBFc3RpbWFzaSBkaXN0cmlidXNpIElQSw0KDQoqKipEZWZpbmlzaToqKioNCg0KRGVuc2l0eSBwbG90IGFkYWxhaCBncmFmaWsgeWFuZyBtZW51bmp1a2thbiBiZW50dWsgZGlzdHJpYnVzaSBkYXRhIG51bWVyaWsgc2VjYXJhIGhhbHVzIChzbW9vdGgpLg0KTWlyaXAgaGlzdG9ncmFtLCB0YXBpIG1lbmdnYW50aWthbiBiYXRhbmcgZGVuZ2FuIGt1cnZhIGhhbHVzIHlhbmcgbWVtcGVya2lyYWthbiBrZXBhZGF0YW4gZGF0YS4NCkt1cnZhIHlhbmcgdGluZ2dpIG1lbnVuanVra2FuIGJhbnlhayBkYXRhIGRpIGFyZWEgdGVyc2VidXQuDQoNCioqKkF0dXJhbiBQZW5nZ3VuYWFuOioqKg0KDQotIEd1bmFrYW4gdW50dWsgZGF0YSBudW1lcmlrIGtvbnRpbnUuDQoNCi0gQ29jb2sgdW50dWsgbWVtYmFuZGluZ2thbiBiZWJlcmFwYSBrZWxvbXBvayAobWlzYWxueWEgZGlzdHJpYnVzaSBJUEsgcGVyIGZha3VsdGFzKS4NCg0KLSBCaWFzYW55YSBkaWJ1YXQgZGVuZ2FuIGZ1bmdzaSBnZW9tX2RlbnNpdHkoKSBkaSBSLg0KDQoqKipLZWxlYmloYW46KioqDQoNCi0gTWVudW5qdWtrYW4gYmVudHVrIGRpc3RyaWJ1c2kgZGVuZ2FuIGxlYmloIGxlbWJ1dC4NCg0KLSBDb2NvayB1bnR1ayBwZXJiYW5kaW5nYW4gYW50YXIga2Vsb21wb2suDQoNCi0gVGVybGloYXQgbGViaWggZXN0ZXRpcyBkYXJpcGFkYSBoaXN0b2dyYW0uDQoNCioqKktla3VyYW5nYW46KioqDQoNCi0gS3VyYW5nIGFrdXJhdCB1bnR1ayBkYXRhc2V0IGtlY2lsLg0KDQotIFRpZGFrIG1lbnVuanVra2FuIGp1bWxhaCBkYXRhIHNlY2FyYSBsYW5nc3VuZy4NCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhX21haGFzaXN3YSwgYWVzKHggPSBJUEssIGZpbGwgPSBGYWt1bHRhcykpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBQbG90IElQSyBwZXIgRmFrdWx0YXMiLCB4ID0gIklQSyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgVHVqdWFuOiBNZW5nZXN0aW1hc2kgZGlzdHJpYnVzaSBwcm9iYWJpbGl0YXMgdmFyaWFiZWwgbnVtZXJpaw0KYGBgDQoNCg0KIyMjICBSaWRnZWxpbmUgUGxvdDogRGlzdHJpYnVzaSBOaWxhaSBVQVMgcGVyIEZha3VsdGFzDQoNCioqKkRlZmluaXNpOioqKg0KDQpSaWRnZWxpbmUgcGxvdCAoYXRhdSBqb3lwbG90KSBhZGFsYWgga3VtcHVsYW4gZGFyaSBiZWJlcmFwYSBkZW5zaXR5IHBsb3QgeWFuZyBkaXR1bXB1ayBzZWNhcmEgdmVydGlrYWwsIGRpZ3VuYWthbiB1bnR1ayBtZW1iYW5kaW5na2FuIGRpc3RyaWJ1c2kgZGF0YSBhbnRhciBrYXRlZ29yaS4NClNldGlhcCDigJxnZWxvbWJhbmfigJ0gKHJpZGdlKSBtZXdha2lsaSBzYXR1IGtlbG9tcG9rLCBkYW4gYmVudHVrbnlhIG1lbnVuanVra2FuIHBvbGEgc2ViYXJhbiBuaWxhaSBkYWxhbSBrZWxvbXBvayB0ZXJzZWJ1dC4NCg0KKioqQXR1cmFuIFBlbmdndW5hYW46KioqDQoNCi0gR3VuYWthbiB1bnR1ayBtZW1iYW5kaW5na2FuIGRpc3RyaWJ1c2kgZGF0YSBudW1lcmlrIGFudGFyIGthdGVnb3JpIChtaXNhbG55YSBOaWxhaSBVQVMgcGVyIEZha3VsdGFzKS4NCg0KLSBCaWFzYW55YSBkaWJ1YXQgZGVuZ2FuIHBha2V0IGdncmlkZ2VzIGRpIFIuDQoNCioqKktlbGViaWhhbjoqKioNCg0KLSBWaXN1YWxueWEgbWVuYXJpayBkYW4gaW5mb3JtYXRpZi4NCg0KLSBNdWRhaCBtZWxpaGF0IHBlcmJlZGFhbiBwb2xhIGRpc3RyaWJ1c2kgYW50YXIga2F0ZWdvcmkuDQoNCi0gQ29jb2sgdW50dWsgZGF0YXNldCBkZW5nYW4gYmFueWFrIGtlbG9tcG9rLg0KDQoqKipLZWt1cmFuZ2FuOioqKg0KDQotIEJpc2Egc3VsaXQgZGliYWNhIGthbGF1IGthdGVnb3JpIHRlcmxhbHUgYmFueWFrLg0KDQotIFRpZGFrIG1lbnVuanVra2FuIG5pbGFpIG51bWVyaWvCoHlhbmfCoHNwZXNpZmlrLg0KYGBge3J9DQpsaWJyYXJ5KGdncmlkZ2VzKQ0KDQpnZ3Bsb3QoZGF0YV9tYWhhc2lzd2EsIGFlcyh4ID0gTmlsYWlfVUFTLCB5ID0gRmFrdWx0YXMsIGZpbGwgPSBGYWt1bHRhcykpICsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSA9IDAuNykgKw0KICBsYWJzKHRpdGxlID0gIlJpZGdlbGluZSBQbG90IE5pbGFpIFVBUyBwZXIgRmFrdWx0YXMiLCB4ID0gIk5pbGFpIFVBUyIsIHkgPSAiRmFrdWx0YXMiKSArDQogIHRoZW1lX3JpZGdlcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQojIFR1anVhbjogTWVtYmFuZGluZ2thbiBkaXN0cmlidXNpIGJlYmVyYXBhIGtlbG9tcG9rwqBzZWthbGlndXMNCmBgYA0KDQoNCiMgS2VzaW1wdWxhbg0KQmVyZGFzYXJrYW4gdmlzdWFsaXNhc2k6DQoNCi0gTmlsYWkgVUFTIG1haGFzaXN3YSBiZXJiZWRhIGFudGFyIGZha3VsdGFzLCBiZWJlcmFwYSBmYWt1bHRhcyBtZW1pbGlraSBuaWxhaSByYXRhLXJhdGEgbGViaWggdGluZ2dpLg0KDQotIFNlYmFyYW4gbmlsYWkgdW11bW55YSBub3JtYWwsIHRhcGkgYWRhIGJlYmVyYXBhIG91dGxpZXIuDQoNCi0gTWFoYXNpc3dhIGRlbmdhbiB3YWt0dSBiZWxhamFyIGxlYmloIHRpbmdnaSBjZW5kZXJ1bmcgbWVtcGVyb2xlaCBuaWxhaSBVQVMgbGViaWggYmFpay4NCg0KLSBSaWRnZWxpbmUsIEJveHBsb3QsIGRhbiBQaWUgQ2hhcnQgbWVtYmFudHUgbWVtYmFuZGluZ2thbiBkaXN0cmlidXNpIGRhbiBwcm9wb3JzaSBhbnRhciBmYWt1bHRhcy4NCg0KLSBWaXN1YWxpc2FzaSBpbmkgbWVtcGVybXVkYWggcGVtYWhhbWFuIHBvbGEgYWthZGVtaWsgbWFoYXNpc3dhIGRhbiBodWJ1bmdhbiBhbnRhciB2YXJpYWJlbCBkZW5nYW4gY2VwYXQu