Praktikum Pemusatan Data

Statistika Dasar

UKURAN PEMUSATAN UNTUK DATA KELOMPOK

Pemusatan data adalah salah satu konsep penting dalam statistik yang mengacu pada upaya untuk menentukan titik atau nilai tertentu yang dapat mewakili seluruh data yang diamati dalam suatu kumpulan data. Dengan kata lain, pemusatan data berfokus pada nilai yang dianggap sebagai “pusat” atau “wakil” dari data tersebut. Nilai pusat ini bertujuan untuk memberikan gambaran umum yang dapat menyederhanakan kumpulan data sehingga lebih mudah dipahami dan dianalisis.

Konsep pemusatan data sangat berguna karena memungkinkan kita untuk meringkas informasi yang kompleks menjadi satu nilai yang mewakili seluruh dataset. Hal ini penting dalam banyak situasi, seperti pengambilan keputusan, analisis tren, atau perbandingan antar kelompok data. Pemusatan data membantu mengungkap pola umum dalam data, memungkinkan kita untuk mengenali apakah data memiliki kecenderungan tertentu atau apakah distribusi data tersebut menyimpang dari norma.

Beberapa ukuran pemusatan data yang umum digunakan meliputi mean (rata-rata), median, dan modus. Mean menghitung rata-rata dari semua nilai dalam dataset dengan membagi jumlah total nilai dengan banyaknya data. Median adalah nilai tengah dalam dataset ketika data disusun secara berurutan, sehingga lebih tahan terhadap pengaruh nilai ekstrem (outlier). Modus, di sisi lain, adalah nilai yang paling sering muncul dalam dataset.

Secara keseluruhan, pemusatan data merupakan alat statistik yang sangat penting karena memberikan dasar untuk memahami dan menginterpretasikan data dengan lebih efisien. Tanpa ukuran pemusatan, analisis data sering kali menjadi lebih sulit dan memakan waktu karena sifat data yang kompleks dan bervariasi.

Tujuan Pemusatan Data

  1. Meringkas Data: Mempermudah penyajian dan interpretasi kumpulan data yang besar dengan memberikan satu nilai yang mewakili.

  2. Membandingkan Data: Membantu membandingkan dua atau lebih kumpulan data melalui nilai pusatnya. Menentukan Karakteristik Data: Memberikan gambaran umum tentang bagaimana data terdistribusi di sekitar nilai pusat.

  3. Membantu Prediksi: Dalam beberapa kasus, pemusatan data bisa menjadi dasar untuk membuat prediksi atau keputusan berdasarkan data masa lalu.

Jenis Jenis Ukuran Pemusatan Data

Tiga ukuran utama pemusatan data adalah mean, median, dan modus. Setiap ukuran memiliki karakteristik dan kegunaan khusus, tergantung pada jenis data dan tujuan analisis.

1. MEAN

Mean atau rata-rata adalah salah satu ukuran pemusatan data yang paling umum digunakan dalam statistik. Mean menggambarkan nilai rata-rata yang diperoleh dengan menjumlahkan semua nilai dalam suatu kelompok data, kemudian membaginya dengan jumlah data tersebut. Mean sering digunakan untuk mewakili data secara keseluruhan dan memberikan gambaran umum tentang kecenderungan nilai dalam kumpulan data. Untuk menghitung mean dari kelompok data, digunakan rumus berikut:

a. Rumus Mean

\[ \begin{equation} \begin{split} \text{Mean} \, (\bar{x}) &= \frac{\sum_{i=1}^n x_i}{n} \end{split} \end{equation} \]

• ∑ 𝑋 adalah jumlah dari semua nilai data.

• 𝑛 adalah jumlah data.

1.2 Langkah-langkah untuk menghitung mean:

• Jumlahkan semua nilai dalam data.

• Bagi hasil jumlah dengan banyaknya data.

Misalkan kita memiliki data sebagai berikut: 11, 12, 13, 14, 15.

• Jumlahkan semua nilai:
11 + 12 + 13 + 14 + 15 = 65


• Bagi dengan jumlah data (𝑛 = 5):

\[ \text{Mean} = \frac{11 + 12 + 13 + 14 + 15}{5} = \frac{65}{5} = 13 \]

Jadi, mean dari data tersebut adalah 13.

1.3 Kelemahan

Salah satu kelemahan utama dari mean (rata-rata) adalah sensitivitasnya terhadap nilai ekstrem atau outlier dalam dataset. Outlier adalah nilai yang secara signifikan lebih tinggi atau lebih rendah dibandingkan dengan nilai-nilai lainnya dalam data. Kehadiran outlier dapat memengaruhi perhitungan mean secara substansial, sehingga nilai mean menjadi tidak lagi representatif terhadap distribusi data yang sebenarnya.

1.4 Pengoprasian dan Visualisasi Mean Menggunakan Boxplot dan Histogram

1.4.1 Data
a. Import data csv
Nama Nilai
Budi 90
Siti 85
Andi 88
Randi 90
Satya 86
Sokeh 83
Bayu 92
Fahim 88
Darman 83
Seno 90
Jamal 81
Romo 84

Table data

Nama Nilai
Budi 90
Siti 85
Andi 88
Randi 90
Satya 86
Sokeh 83
Bayu 92
Fahim 88
Darman 83
Seno 90
Jamal 81
Romo 84
b. Pengoprasian dan Visualisasi Mean Menggunakan Boxplot
## 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
c. Pengoprasian dan Visualisasi Mean Menggunakan Histogram

2. MEDIAN

Median adalah salah satu ukuran pemusatan data yang menunjukkan nilai tengah dari suatu kumpulan data setelah data tersebut diurutkan dari nilai terkecil hingga nilai terbesar. Median memberikan informasi tentang titik tengah dari distribusi data, membagi data menjadi dua bagian yang sama besar, di mana separuh data memiliki nilai yang lebih kecil dari median, dan separuh lainnya memiliki nilai yang lebih besar.

2.1 Langkah Langkah Menghitung Median

  1. Urutkan data dari yang terkecil hingga terbesar.

  2. Jika jumlah data ganjil, ambil nilai yang berada di tengah.

  3. Jika jumlah data genap, ambil rata-rata dua nilai tengah.

rumus median adalah:

\[ \begin{equation} \begin{split} \text{Median} &= L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \times h \end{split} \end{equation} \]

Keterangan Variabel

\[ \begin{aligned} L & : \text{Tepi bawah kelas median} \\ n & : \text{Jumlah total frekuensi} \ (\Sigma f) \\ \frac{n}{2} & : \text{Setengah jumlah total frekuensi (posisi median)} \\ F & : \text{Frekuensi kumulatif sebelum kelas median} \\ f_m & : \text{Frekuensi pada kelas median} \\ h & : \text{Panjang interval kelas} \end{aligned} \]

Contoh:

  • Misalnya, kita memiliki data berikut:

70, 80, 90, 85, 95

  • Langkah pertama, urutkan data: 70, 80, 85, 90, 95.

Karena jumlah data ganjil (5 data), nilai tengah adalah 85. Jadi, median adalah 85.

Jika jumlah datanya genap, misalnya data nilai ujian:

70, 80, 90, 100

  • Langkah pertama, urutkan data: 70, 80, 90, 100. Karena jumlah data genap (4 data), dua nilai tengah adalah 80 dan 90. Maka median adalah rata-rata dari keduanya:

\[ \text{Median} = \frac{80 + 90}{2} = 85 \]

Jadi, median adalah 85.

Kelebihan

Median memiliki beberapa kelebihan yang membuatnya sangat berguna dalam analisis data, terutama ketika kita bekerja dengan data yang tidak terdistribusi secara simetris atau mengandung outlier (nilai ekstrem).

2.2 Pengoprasian dan Visualisasi Median Menggunakan Boxplot dan Histogram

Table data

Nama Nilai
Budi 90
Siti 85
Andi 88
Randi 90
Satya 86
Sokeh 83
Bayu 92
Fahim 88
Darman 83
Seno 90
Jamal 81
Romo 84
Pengoprasian dan Visualisasi Median Menggunakan Boxplot
Pengoprasian dan Visualisasi Median Menggunakan Histogram

3. MODUS

Modus adalah salah satu ukuran pemusatan data yang digunakan untuk menunjukkan nilai atau angka yang paling sering muncul dalam sebuah kumpulan data. Dalam banyak kasus, modus dapat memberikan informasi yang sangat berguna tentang kecenderungan umum atau kebiasaan yang ada dalam data tersebut. Modus seringkali digunakan dalam berbagai bidang, seperti statistik, pemasaran, dan sosiologi, untuk menggambarkan elemen yang dominan atau sering muncul dalam suatu kelompok.

a. Rumus Modus

\[ \begin{equation} \begin{split} \text{Modus} &= L + \left( \frac{f_1 - f_0}{2f_1 - f_0 - f_2} \right) \times h \end{split} \end{equation} \]

$$ \[\begin{equation} \begin{aligned} L & : \text{Tepi bawah kelas modal (kelas dengan frekuensi tertinggi)} \\ f_1 & : \text{Frekuensi kelas modal} \\ f_0 & : \text{Frekuensi kelas sebelum kelas modal} \\ f_2 & : \text{Frekuensi kelas setelah kelas modal} \\ h & : \text{Panjang interval kelas} \end{aligned} \end{equation}\]

$$ ###### b. Contoh

Misalnya, kita memiliki data nilai ujian berikut:

  • 80, 85, 80, 90, 95

Di sini, ada dua nilai yang sering muncul, yaitu 80 dan 90, sehingga data ini bimodal.

Jika data adalah:

  • 70, 80, 90, 100, 110

Karena tidak ada nilai yang berulang, maka data ini tidak memiliki modus.

c. Kelebihan Modus

Modus memiliki berbagai kelebihan yang menjadikannya ukuran pemusatan data yang sangat berguna dalam berbagai jenis analisis, terutama yang berhubungan dengan frekuensi kemunculan nilai tertentu dalam dataset. Salah satu kegunaannya yang paling utama adalah untuk mengetahui nilai yang paling sering terjadi, yang dapat memberikan wawasan penting tentang pola atau kecenderungan dalam data.

3.1 Pengoprasian dan Visualisasi Modus Menggunakan Boxplot dan Histogram

Table data

Nama Nilai
Budi 90
Siti 85
Andi 88
Randi 90
Satya 86
Sokeh 83
Bayu 92
Fahim 88
Darman 83
Seno 90
Jamal 81
Romo 84
3.1.1 Pengoprasian dan Visualisasi Modus Menggunakan Boxplot
3.1.2 Pengoprasian dan Visualisasi Modus Menggunakan Histogram

Kesimpulan MEAN, MEDIAN, MODUS

Kesimpulan Umum:

  • Mean sangat berguna untuk data yang terdistribusi normal dan tidak memiliki outlier, karena memberikan gambaran keseluruhan dari seluruh data. Namun, kehadiran nilai ekstrim bisa membuatnya tidak representatif.

  • Median lebih baik digunakan ketika data memiliki distribusi yang miring atau terdapat nilai ekstrim, karena tidak dipengaruhi oleh outlier.

  • Modus sangat berguna untuk mengetahui nilai yang paling sering muncul dalam data, terutama pada data kategorikal atau nominal. Namun, jika data tidak memiliki nilai yang sering muncul, modus bisa jadi tidak ada atau kurang informatif.

Pemilihan antara mean, median, dan modus tergantung pada jenis data yang dimiliki dan tujuan analisis. Ketiganya saling melengkapi dan memberikan pandangan yang berbeda tentang kumpulan data yang dianalisis.

PEMUSATAN DATA DALAM BERBAGAI BIDANG

Ukuran pemusatan data, seperti mean, median, dan modus, sering digunakan dalam berbagai bidang untuk menganalisis data dan mengambil keputusan. Berikut adalah bagaimana ukuran pemusatan data diterapkan dalam Bisnis, Kesehatan, dan Pendidikan.

1. Bisnis

Dalam dunia bisnis, ukuran pemusatan data digunakan untuk menganalisis berbagai aspek operasi dan kinerja perusahaan. Berikut adalah contoh penerapan pemusatan data dalam bisnis:

1.1 Mengukur Rata-Rata Penjualan Perusahaan

sering menggunakan rata-rata (mean) untuk menghitung rata-rata penjualan dalam periode tertentu, seperti per bulan atau per tahun. Hal ini membantu perusahaan memahami tren penjualan dan merencanakan strategi masa depan.

- Contoh:Jika sebuah perusahaan ingin mengetahui rata-rata penjualan bulanan, mereka dapat menjumlahkan penjualan bulanan                    selama setahun dan membaginya dengan 12. Ini memberikan gambaran umum tentang kinerja perusahaan dalam                              periode tersebut. 

Ekseskusi Kasus

Sebuah perusahaan e-commerce ingin mengetahui rata-rata penjualan bulanan selama setengah tahun. Misalnya, penjualan bulanannya adalah:

BULAN JUMAL UNIT
Januari 10.000
Februari 12.000
Maret 11.000
April 15.000
Mei 13.000
Juni 10.000
  • Menghitung Rata-Rata: \[ \text{Rata-rata Penjualan} = \frac{10.000 + 12.000 + 11.000 + 15.000 + 13.000 + 10.000}{6} = 11.833 \, \text{unit} \]

Kesimpulan

Rata-rata ini memberi perusahaan gambaran tentang volume penjualan bulanan yang stabil dan dapat digunakan untuk merencanakan strategi bisnis berikutnya.

1.2 Analisis Harga Saham Di pasar saham

investor sering menggunakan nilai tengah (median) untuk memahami pergerakan harga saham yang lebih stabil, karena median tidak terpengaruh oleh fluktuasi ekstrem yang dapat menyebabkan nilai rata-rata menjadi bias.

 - Contoh: Jika sebuah saham mengalami lonjakan harga yang sangat tinggi atau rendah dalam periode tertentu, median dapat                      memberikan    gambaran yang lebih akurat tentang harga tengah saham tersebut.

Eksekusi Kasus

Hari Harga.Saham
Senin Rp50.000,00
Selasa Rp48.000,00
Rabu Rp51.000,00
Kamis Rp53.000,00
Jumat Rp50.500,00
Sabtu Rp70.000,00
Minggu Rp55.000,00

Urutkan harga saham: 48.000, 50.000, 50.500, 51.000, 53.000, 55.000, 70.000.

## [1] "Median Harga Saham (Dengan Outlier): 51000"
## [1] "Median Harga Saham (Tanpa Outlier): 50750"

Kesimpulan

Nilai tengah (median) adalah 51.000, yang menunjukkan harga saham yang paling representatif, mengurangi pengaruh fluktuasi ekstrem.

1.3 Identifikasi Tren dalam Preferensi Konsumen Bisnis dengan Modus

sering menggunakan modus untuk mengetahui produk atau layanan yang paling sering dipilih oleh konsumen. Ini membantu dalam pengembangan produk atau kampanye pemasaran yang lebih sesuai dengan preferensi pelanggan.

- Contoh:Jika sebuah toko ingin mengetahui produk mana yang paling sering dibeli, mereka dapat menghitung modus berdasarkan                  data penjualan.

Ekseskusi Kasus

Toko ritel ingin mengetahui produk mana yang paling sering dibeli oleh pelanggan. Berikut adalah jumlah pembelian produk A, B, dan C dalam satu minggu:

PRODUK TOTAL PEMBELIAN
A 40
B 60
C 60
D 30
E 20
## [1] "Modus Total Pembelian: 60"

Kesimpulan

Modus: Modus dari data ini adalah produk B dan C, karena keduanya memiliki jumlah pembelian terbanyak (60), yang membantu toko fokus pada pemasaran kedua produk tersebut.

2. Kesehatan

Di bidang kesehatan, ukuran pemusatan data sangat penting untuk menganalisis pola penyakit, efisiensi perawatan kesehatan, dan distribusi variabel kesehatan lainnya. Berikut adalah contoh penerapan ukuran pemusatan data dalam kesehatan:

2.1 Pengukuran Rata-Rata Usia Pasien

Dalam analisis demografis rumah sakit atau klinik, rata-rata usia pasien digunakan untuk memahami profil usia populasi yang dilayani, yang penting untuk perencanaan layanan kesehatan.

- Contoh: Rumah sakit dapat menghitung rata-rata usia pasien untuk merencanakan fasilitas atau perawatan yang lebih sesuai dengan kelompok usia tertentu.

Ekseskusi Kasus

Sebuah rumah sakit ingin mengetahui rata-rata usia pasien yang datang selama seminggu. Data usia pasien adalah:

  • 25 tahun

  • 30 tahun

  • 35 tahun

  • 40 tahun

  • 45 tahun

\[ \text{Rata-rata Usia} = \frac{25 + 30 + 35 + 40 + 45}{5} = 35 \, \text{tahun} \]

Penjelasan

Dengan rata-rata usia 35 tahun, rumah sakit dapat merencanakan layanan yang lebih tepat, seperti fasilitas medis atau pengobatan yang sesuai dengan kelompok usia ini.

2.2 Statistik Penyakit Median

Sering digunakan dalam epidemiologi untuk menggambarkan distribusi data penyakit, seperti waktu bertahan hidup pasien atau usia diagnosis penyakit tertentu. Median lebih disukai karena tidak terpengaruh oleh data ekstrem.

- Contoh: Dalam penelitian kanker, median umur pasien saat didiagnosis dapat digunakan untuk menginformasikan kebijakan kesehatan atau penelitian lebih lanjut.

####Eksekusi Kasus

Dalam sebuah penelitian mengenai waktu bertahan hidup pasien kanker, data waktu bertahan hidup (dalam bulan) adalah:

  • 3 bulan

  • 6 bulan

  • 9 bulan

  • 12 bulan

  • 20 bulan

\[ \text{Data: } 3, 6, 9, 12, 20 \\ \text{Median} = 9 \, \text{bulan} \]

#### Menghitung Median:

Urutkan data: 3, 6, 9, 12, 20. Nilai tengah (median) adalah 9 bulan, yang memberikan gambaran yang lebih stabil dan tidak terpengaruh oleh data ekstrem (misalnya, pasien yang bertahan hidup sangat lama).

2.3 Frekuensi Penyakit atau Gejala Modus

digunakan untuk mengetahui gejala atau penyakit yang paling sering terjadi dalam populasi tertentu. Ini sangat penting dalam epidemiologi untuk menentukan pola penyebaran penyakit.

- Contoh: Jika banyak pasien yang datang dengan gejala demam dan batuk, modus akan menunjukkan bahwa ini adalah gejala yang paling sering dilaporkan dalam periode tertentu.

Eksekusi Kasus

Di rumah sakit, dokter ingin mengetahui gejala yang paling umum dari pasien flu. Data gejala yang tercatat adalah:

Demam = 30 pasien Batuk = 50 pasien Sakit kepala = 40 pasien

\[ \text{Demam: 30 pasien, Batuk: 50 pasien, Sakit kepala: 40 pasien} \\ \text{Modus: Batuk (paling sering dilaporkan)} \]

## [1] "Modus (Dengan Outlier): Batuk"
## [1] "Modus (Tanpa Outlier): Sakit Kepala"

#### Menghitung Modus:

Modus dalam data ini adalah Batuk, karena batuk dilaporkan oleh 50 pasien, lebih banyak dibandingkan gejala lainnya.

Kesimpulan

Dengan mengetahui gejala yang paling sering dilaporkan (batuk), rumah sakit dapat lebih fokus dalam memberikan penanganan yang tepat, seperti persediaan obat atau vaksinasi yang lebih banyak.

3. Pendidikan

Dalam bidang pendidikan, ukuran pemusatan data digunakan untuk mengevaluasi kinerja siswa, menganalisis hasil ujian, dan merancang kebijakan pendidikan. Berikut adalah contoh penerapan ukuran pemusatan data dalam pendidikan:

3.1 Rata-Rata Nilai Ujian Rata-rata nilai ujian

sering digunakan untuk mengevaluasi kinerja siswa dalam suatu ujian atau tugas besar. Ini memberikan gambaran umum tentang sejauh mana siswa memahami materi yang diuji.

- Contoh: Jika sekolah ingin mengetahui rata-rata nilai ujian matematika untuk seluruh kelas, mereka dapat menjumlahkan nilai ujian dan membaginya dengan jumlah siswa.

Eksekusi Kasus

Dalam ujian matematika kelas 12, berikut adalah nilai yang diperoleh oleh siswa:

  • 80

  • 85

  • 90

  • 70

  • 95

\[ \text{Rata-rata Nilai} = \frac{80 + 85 + 90 + 70 + 95}{5} = 84 \, \text{poin} \]

## [1] "Mean Nilai (Dengan Outlier): 84"
## [1] "Mean Nilai (Tanpa Outlier): 87.5"

Penjelasan

Dengan rata-rata nilai 84 poin, guru dapat mengetahui kinerja rata-rata siswa dan menentukan apakah materi perlu penyesuaian atau ada area yang perlu diperbaiki.

3.2 Penilaian Kinerja Siswa Median

Digunakan untuk mengetahui nilai tengah dalam hasil ujian atau tes, yang tidak terpengaruh oleh nilai ekstrem. Ini memberikan pemahaman yang lebih adil tentang kinerja mayoritas siswa.

- Contoh: Jika ada beberapa siswa yang mendapatkan nilai sangat tinggi atau rendah, median dapat memberikan gambaran lebih akurat tentang kinerja siswa secara keseluruhan.

Eksekusi Kasus

Seorang guru ingin mengetahui nilai tengah dari ujian akhir yang diikuti oleh 10 siswa. Nilai yang diperoleh adalah:

  • 50, 55, 60, 70, 80, 80, 85, 90, 90, 95

Menghitung Median:

Urutkan data: 50, 55, 60, 70, 80, 80, 85, 90, 90, 95. Karena ada 10 data, median adalah rata-rata dari data ke-5 dan ke-6, yaitu:

\[ \text{Data: } 50, 55, 60, 70, 80, 80, 85, 90, 90, 95 \\ \text{Median} = \frac{80 + 80}{2} = 80 \]

## [1] "Median Nilai Ujian (Dengan Outlier): 80"
## [1] "Median Nilai Ujian (Tanpa Outlier): 80"

Kesimpulan

Median nilai adalah 80. Ini menunjukkan bahwa sebagian besar siswa mendapatkan nilai sekitar 80, memberi gambaran yang lebih representatif tentang distribusi nilai di kelas.

3.3 Frekuensi Tingkat Keterampilan Modus

Digunakan untuk mengetahui tingkat keterampilan atau pengetahuan yang paling sering dimiliki oleh siswa dalam suatu kelompok. Ini dapat membantu pendidik dalam merancang kurikulum yang lebih efektif.

- Contoh: Jika sebagian besar siswa memiliki pemahaman yang baik dalam topik tertentu, maka modus akan menunjukkan tingkat penguasaan yang paling umum di kelas tersebut.

Eksekusi Kasus

Seorang guru ingin mengetahui nilai tengah dari ujian akhir siswa. Nilai yang diperoleh adalah:

  • A = 10 Siswa

  • B = 20 Siswa

  • C = 5 Siswa

\[ \text{Nilai A: 10 siswa, Nilai B: 20 siswa, Nilai C: 5 siswa} \\ \text{Modus: Nilai B (paling sering muncul)} \]

## [1] "Modus: B"
## [1] "Modus (Tanpa Outlier): A"

Menghitung Modus:

Modus adalah Nilai B, karena 20 siswa mendapatkan nilai ini, yang merupakan jumlah terbanyak.

Kesimpulan

Dengan mengetahui bahwa nilai B adalah yang paling sering muncul, guru dapat mengevaluasi lebih lanjut kemampuan menulis siswa dan menyesuaikan cara pengajaran untuk meningkatkan keterampilan siswa.

LS0tDQp0aXRsZTogIlByYWt0aWt1bSBQZW11c2F0YW4gRGF0YSINCnN1YnRpdGxlOiAiU3RhdGlzdGlrYSBEYXNhciINCmF1dGhvcjogIkRhZGFuIFJhbWRhbiBIaWRheWF0ICg1MjI0MDAyOCkiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIHNyYz0ic3RhdGlzdGlrYS5qcGciIHdpZHRoPSI5MDAiIHN0eWxlPSJkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyIgYWx0PSIiPg0KDQoNCiMgVUtVUkFOIFBFTVVTQVRBTiBVTlRVSyBEQVRBIEtFTE9NUE9LDQoNClBlbXVzYXRhbiBkYXRhIGFkYWxhaCBzYWxhaCBzYXR1IGtvbnNlcCBwZW50aW5nIGRhbGFtIHN0YXRpc3RpayB5YW5nIG1lbmdhY3UgcGFkYSB1cGF5YSB1bnR1ayBtZW5lbnR1a2FuIHRpdGlrIGF0YXUgbmlsYWkgdGVydGVudHUgeWFuZyBkYXBhdCBtZXdha2lsaSBzZWx1cnVoIGRhdGEgeWFuZyBkaWFtYXRpIGRhbGFtIHN1YXR1IGt1bXB1bGFuIGRhdGEuIERlbmdhbiBrYXRhIGxhaW4sIHBlbXVzYXRhbiBkYXRhIGJlcmZva3VzIHBhZGEgbmlsYWkgeWFuZyBkaWFuZ2dhcCBzZWJhZ2FpICJwdXNhdCIgYXRhdSAid2FraWwiIGRhcmkgZGF0YSB0ZXJzZWJ1dC4gTmlsYWkgcHVzYXQgaW5pIGJlcnR1anVhbiB1bnR1ayBtZW1iZXJpa2FuIGdhbWJhcmFuIHVtdW0geWFuZyBkYXBhdCBtZW55ZWRlcmhhbmFrYW4ga3VtcHVsYW4gZGF0YSBzZWhpbmdnYSBsZWJpaCBtdWRhaCBkaXBhaGFtaSBkYW4gZGlhbmFsaXNpcy4NCg0KS29uc2VwIHBlbXVzYXRhbiBkYXRhIHNhbmdhdCBiZXJndW5hIGthcmVuYSBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZXJpbmdrYXMgaW5mb3JtYXNpIHlhbmcga29tcGxla3MgbWVuamFkaSBzYXR1IG5pbGFpIHlhbmcgbWV3YWtpbGkgc2VsdXJ1aCBkYXRhc2V0LiBIYWwgaW5pIHBlbnRpbmcgZGFsYW0gYmFueWFrIHNpdHVhc2ksIHNlcGVydGkgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuLCBhbmFsaXNpcyB0cmVuLCBhdGF1IHBlcmJhbmRpbmdhbiBhbnRhciBrZWxvbXBvayBkYXRhLiBQZW11c2F0YW4gZGF0YSBtZW1iYW50dSBtZW5ndW5na2FwIHBvbGEgdW11bSBkYWxhbSBkYXRhLCBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZW5nZW5hbGkgYXBha2FoIGRhdGEgbWVtaWxpa2kga2VjZW5kZXJ1bmdhbiB0ZXJ0ZW50dSBhdGF1IGFwYWthaCBkaXN0cmlidXNpIGRhdGEgdGVyc2VidXQgbWVueWltcGFuZyBkYXJpIG5vcm1hLg0KDQpCZWJlcmFwYSB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgeWFuZyB1bXVtIGRpZ3VuYWthbiBtZWxpcHV0aSBtZWFuIChyYXRhLXJhdGEpLCBtZWRpYW4sIGRhbiBtb2R1cy4gTWVhbiBtZW5naGl0dW5nIHJhdGEtcmF0YSBkYXJpIHNlbXVhIG5pbGFpIGRhbGFtIGRhdGFzZXQgZGVuZ2FuIG1lbWJhZ2kganVtbGFoIHRvdGFsIG5pbGFpIGRlbmdhbiBiYW55YWtueWEgZGF0YS4gTWVkaWFuIGFkYWxhaCBuaWxhaSB0ZW5nYWggZGFsYW0gZGF0YXNldCBrZXRpa2EgZGF0YSBkaXN1c3VuIHNlY2FyYSBiZXJ1cnV0YW4sIHNlaGluZ2dhIGxlYmloIHRhaGFuIHRlcmhhZGFwIHBlbmdhcnVoIG5pbGFpIGVrc3RyZW0gKG91dGxpZXIpLiBNb2R1cywgZGkgc2lzaSBsYWluLCBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhc2V0Lg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIHBlbXVzYXRhbiBkYXRhIG1lcnVwYWthbiBhbGF0IHN0YXRpc3RpayB5YW5nIHNhbmdhdCBwZW50aW5nIGthcmVuYSBtZW1iZXJpa2FuIGRhc2FyIHVudHVrIG1lbWFoYW1pIGRhbiBtZW5naW50ZXJwcmV0YXNpa2FuIGRhdGEgZGVuZ2FuIGxlYmloIGVmaXNpZW4uIFRhbnBhIHVrdXJhbiBwZW11c2F0YW4sIGFuYWxpc2lzIGRhdGEgc2VyaW5nIGthbGkgbWVuamFkaSBsZWJpaCBzdWxpdCBkYW4gbWVtYWthbiB3YWt0dSBrYXJlbmEgc2lmYXQgZGF0YSB5YW5nIGtvbXBsZWtzIGRhbiBiZXJ2YXJpYXNpLg0KDQojIyBUdWp1YW4gUGVtdXNhdGFuIERhdGENCg0KMS4gTWVyaW5na2FzIERhdGE6IE1lbXBlcm11ZGFoIHBlbnlhamlhbiBkYW4gaW50ZXJwcmV0YXNpIGt1bXB1bGFuIGRhdGEgeWFuZyBiZXNhciBkZW5nYW4gbWVtYmVyaWthbiBzYXR1IG5pbGFpIHlhbmcgbWV3YWtpbGkuDQoNCjIuIE1lbWJhbmRpbmdrYW4gRGF0YTogTWVtYmFudHUgbWVtYmFuZGluZ2thbiBkdWEgYXRhdSBsZWJpaCBrdW1wdWxhbiBkYXRhIG1lbGFsdWkgbmlsYWkgcHVzYXRueWEuDQpNZW5lbnR1a2FuIEthcmFrdGVyaXN0aWsgRGF0YTogTWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIHRlbnRhbmcgYmFnYWltYW5hIGRhdGEgdGVyZGlzdHJpYnVzaSBkaSBzZWtpdGFyIG5pbGFpIHB1c2F0Lg0KDQozLiBNZW1iYW50dSBQcmVkaWtzaTogRGFsYW0gYmViZXJhcGEga2FzdXMsIHBlbXVzYXRhbiBkYXRhIGJpc2EgbWVuamFkaSBkYXNhciB1bnR1ayBtZW1idWF0IHByZWRpa3NpIGF0YXUga2VwdXR1c2FuIGJlcmRhc2Fya2FuIGRhdGEgbWFzYSBsYWx1Lg0KDQojIyBKZW5pcyBKZW5pcyBVa3VyYW4gUGVtdXNhdGFuIERhdGEgDQoNClRpZ2EgdWt1cmFuIHV0YW1hIHBlbXVzYXRhbiBkYXRhIGFkYWxhaCBtZWFuLCBtZWRpYW4sIGRhbiBtb2R1cy4gU2V0aWFwIHVrdXJhbiBtZW1pbGlraSBrYXJha3RlcmlzdGlrIGRhbiBrZWd1bmFhbiBraHVzdXMsIHRlcmdhbnR1bmcgcGFkYSBqZW5pcyBkYXRhIGRhbiB0dWp1YW4gYW5hbGlzaXMuDQoNCg0KIyMjIDEuIE1FQU4gDQoNCk1lYW4gYXRhdSByYXRhLXJhdGEgYWRhbGFoIHNhbGFoIHNhdHUgdWt1cmFuIHBlbXVzYXRhbiBkYXRhIHlhbmcgcGFsaW5nIHVtdW0gZGlndW5ha2FuIGRhbGFtIHN0YXRpc3Rpay4gTWVhbiBtZW5nZ2FtYmFya2FuIG5pbGFpIHJhdGEtcmF0YSB5YW5nIGRpcGVyb2xlaCBkZW5nYW4gbWVuanVtbGFoa2FuIHNlbXVhIG5pbGFpIGRhbGFtIHN1YXR1IGtlbG9tcG9rIGRhdGEsIGtlbXVkaWFuIG1lbWJhZ2lueWEgZGVuZ2FuIGp1bWxhaCBkYXRhIHRlcnNlYnV0LiBNZWFuIHNlcmluZyBkaWd1bmFrYW4gdW50dWsgbWV3YWtpbGkgZGF0YSBzZWNhcmEga2VzZWx1cnVoYW4gZGFuIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdW11bSB0ZW50YW5nIGtlY2VuZGVydW5nYW4gbmlsYWkgZGFsYW0ga3VtcHVsYW4gZGF0YS4gVW50dWsgbWVuZ2hpdHVuZyBtZWFuIGRhcmkga2Vsb21wb2sgZGF0YSwgZGlndW5ha2FuIHJ1bXVzIGJlcmlrdXQ6DQoNCiMjIyMjIyBhLiBSdW11cyBNZWFuDQoNCiQkIA0KXGJlZ2lue2VxdWF0aW9ufQ0KXGJlZ2lue3NwbGl0fQ0KXHRleHR7TWVhbn0gXCwgKFxiYXJ7eH0pICY9IFxmcmFje1xzdW1fe2k9MX1ebiB4X2l9e259DQpcZW5ke3NwbGl0fQ0KXGVuZHtlcXVhdGlvbn0NCiQkDQogICANCiAgICDigKIg4oiRIPCdkYsgYWRhbGFoIGp1bWxhaCBkYXJpIHNlbXVhIG5pbGFpIGRhdGEuDQoNCiAgICDigKIg8J2RmyBhZGFsYWgganVtbGFoIGRhdGEuDQoNCg0KIyMjIyAxLjIgTGFuZ2thaC1sYW5na2FoIHVudHVrIG1lbmdoaXR1bmcgbWVhbjoNCg0KICAgIOKAoiBKdW1sYWhrYW4gc2VtdWEgbmlsYWkgZGFsYW0gZGF0YS4NCg0KICAgIOKAoiBCYWdpIGhhc2lsIGp1bWxhaCBkZW5nYW4gYmFueWFrbnlhIGRhdGEuDQoNCg0KICBNaXNhbGthbiBraXRhIG1lbWlsaWtpIGRhdGEgc2ViYWdhaSBiZXJpa3V0OiAxMSwgMTIsIDEzLCAxNCwgMTUuDQoNCiAgICDigKIgSnVtbGFoa2FuIHNlbXVhIG5pbGFpOg0KICAgIDExICsgMTIgKyAxMyArIDE0ICsgMTUgPSA2NQ0KDQoNCiAgICDigKIgQmFnaSBkZW5nYW4ganVtbGFoIGRhdGEgKPCdkZsgPSA1KToNCg0KJCQNClx0ZXh0e01lYW59ID0gXGZyYWN7MTEgKyAxMiArIDEzICsgMTQgKyAxNX17NX0gPSBcZnJhY3s2NX17NX0gPSAxMw0KJCQNCg0KDQogIEphZGksIG1lYW4gZGFyaSBkYXRhIHRlcnNlYnV0IGFkYWxhaCAxMy4NCiAgDQojIyMjIDEuMyBLZWxlbWFoYW4gDQoNClNhbGFoIHNhdHUga2VsZW1haGFuIHV0YW1hIGRhcmkgbWVhbiAocmF0YS1yYXRhKSBhZGFsYWggc2Vuc2l0aXZpdGFzbnlhIHRlcmhhZGFwIG5pbGFpIGVrc3RyZW0gYXRhdSBvdXRsaWVyIGRhbGFtIGRhdGFzZXQuIE91dGxpZXIgYWRhbGFoIG5pbGFpIHlhbmcgc2VjYXJhIHNpZ25pZmlrYW4gbGViaWggdGluZ2dpIGF0YXUgbGViaWggcmVuZGFoIGRpYmFuZGluZ2thbiBkZW5nYW4gbmlsYWktbmlsYWkgbGFpbm55YSBkYWxhbSBkYXRhLiBLZWhhZGlyYW4gb3V0bGllciBkYXBhdCBtZW1lbmdhcnVoaSBwZXJoaXR1bmdhbiBtZWFuIHNlY2FyYSBzdWJzdGFuc2lhbCwgc2VoaW5nZ2EgbmlsYWkgbWVhbiBtZW5qYWRpIHRpZGFrIGxhZ2kgcmVwcmVzZW50YXRpZiB0ZXJoYWRhcCBkaXN0cmlidXNpIGRhdGEgeWFuZyBzZWJlbmFybnlhLg0KDQoNCiMjIyMgMS40IFBlbmdvcHJhc2lhbiBkYW4gVmlzdWFsaXNhc2kgTWVhbiBNZW5nZ3VuYWthbiBCb3hwbG90IGRhbiBIaXN0b2dyYW0NCg0KIyMjIyMgMS40LjEgRGF0YQ0KDQojIyMjIyMgYS4gSW1wb3J0IGRhdGEgY3N2DQoNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBNZW11YXQgZGF0YXNldCBkYXJpIENTVg0KZGF0YSA8LSByZWFkLmNzdigiRGF0YSBTYW1wbGUgOS5jc3YiLCBzZXAgPSAiOyIpDQoNCiMgTWVuYW1waWxrYW4gZGF0YSBhd2FsIGRlbmdhbiBrYWJsZQ0KbGlicmFyeShrbml0cikgIA0Ka2FibGUoZGF0YSkgICMgTWVuZ2d1bmFrYW4gJ2RhdGEnIHNlYmFnYWkgbmFtYSB2YXJpYWJlbA0KYGBgDQoNClRhYmxlIGRhdGEgDQoNCnwgTmFtYSAgICAgIHwgIE5pbGFpIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLXwNCnwgQnVkaSAgICAgIHwgIDkwICAgIHwNCnwgU2l0aSAgICAgIHwgIDg1ICAgIHwNCnwgQW5kaSAgICAgIHwgIDg4ICAgIHwNCnwgUmFuZGkgICAgIHwgIDkwICAgIHwNCnwgU2F0eWEgICAgIHwgIDg2ICAgIHwNCnwgU29rZWggICAgIHwgIDgzICAgIHwNCnwgQmF5dSAgICAgIHwgIDkyICAgIHwNCnwgRmFoaW0gICAgIHwgIDg4ICAgIHwNCnwgRGFybWFuICAgIHwgIDgzICAgIHwNCnwgU2VubyAgICAgIHwgIDkwICAgIHwNCnwgSmFtYWwgICAgIHwgIDgxICAgIHwNCnwgUm9tbyAgICAgIHwgIDg0ICAgIHwNCg0KIyMjIyMgYi4gUGVuZ29wcmFzaWFuIGRhbiBWaXN1YWxpc2FzaSBNZWFuIE1lbmdndW5ha2FuIEJveHBsb3QgDQoNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBuaWxhaSBtYWhhc2lzd2EgeWFuZyBkaWJlcmlrYW4NCm5hbWEgPC0gYygiQnVkaSIsICJTaXRpIiwgIkFuZGkiLCAiUmFuZGkiLCAiU2F0eWEiLCAiU29rZWgiLCAiQmF5dSIsICJGYWhpbSIsICJEYXJtYW4iLCAiU2VubyIsICJKYW1hbCIsICJSb21vIikNCm5pbGFpIDwtIGMoOTAsIDg1LCA4OCwgOTAsIDg2LCA4MywgOTIsIDg4LCA4MywgOTAsIDgxLCA4NCkNCg0KIyBVbnR1ayBrZXBlcmx1YW4gYm94cGxvdCwga2l0YSBidWF0IGR1YSBza2VuYXJpbzogZGVuZ2FuIG91dGxpZXJzIGRhbiB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyhuaWxhaSwgNTUpICAjIE1lbmFtYmFoa2FuIG91dGxpZXINCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gbmlsYWkgICMgVGFucGEgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIHJhdGEtcmF0YSB1bnR1ayBrZWR1YSBkYXRhc2V0DQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwNCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseSBkZW5nYW4gb3V0bGllcnMgZGl0YW1waWxrYW4NCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssICAjIE1lbmdndW5ha2FuIGtlbG9tcG9rIHVudHVrIHdhcm5hDQogIGNvbG9ycyA9IGMoInNreWJsdWUiLCAibGlnaHRibHVlIiksICAjIFdhcm5hIHNvZnQgdmFyaWFuIGJpcnUNCiAgdHlwZSA9ICJib3giLA0KICBib3hwb2ludHMgPSAib3V0bGllcnMiICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTmlsYWkiLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMjIyMgYy4gUGVuZ29wcmFzaWFuIGRhbiBWaXN1YWxpc2FzaSBNZWFuIE1lbmdndW5ha2FuIEhpc3RvZ3JhbQ0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBEdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzIHlhbmcgYmFydSBkaXNlc3VhaWthbiwgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyg1LCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxOCwgMTgsIDE5LCAyMCwgMjIsIDIzLCAxNykgDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAxOCwgMTksIDIwLCAyMiwgMjMsIDI0KSANCg0KIyBEYXRhIHlhbmcgZGliZXJpa2FuDQpkYXRhX25pbGFpIDwtIGMoOTAsIDg1LCA4OCwgOTAsIDg2LCA4MywgOTIsIDg4LCA4MywgOTAsIDgxLCA4NCkNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBQYXN0aWthbiB0aWRhayBhZGEgbmlsYWkgbmVnYXRpZiBkaSB4IGRhbiB5DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCkNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCkNCg0KIyBNZW5naGl0dW5nIHJhdGEtcmF0YSAoTWVhbikNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIG1lYW4oZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptZWFuX3RhbnBhX291dGxpZXJzIDwtIG1lYW4oZGF0YV90YW5wYV9vdXRsaWVycykNCm1lYW5fbmlsYWkgPC0gbWVhbihkYXRhX25pbGFpKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgcmF0YS1yYXRhIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX2Rlbmdhbl9vdXRsaWVycywgbWVhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIlJhdGEtcmF0YSAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgcmF0YS1yYXRhIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdGFucGFfb3V0bGllcnMsIG1lYW5fdGFucGFfb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIHJhdGEtcmF0YSB1bnR1ayBkYXRhIG5pbGFpIHlhbmcgZGliZXJpa2FuDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX25pbGFpLCBtZWFuX25pbGFpKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksICAjIEd1bmFrYW4gbmlsYWkgbWF4IGRhcmkgZGVuc2l0eV90YW5wYV9vdXRsaWVycyB1bnR1ayB5DQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIlJhdGEtcmF0YSAoRGF0YSBOaWxhaSkiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxNjUsIDAsIDAuOCknLCBkYXNoID0gJ2RvdCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW4gKERlbmdhbiBPdXRsaWVycyk6Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW4gKFRhbnBhIE91dGxpZXJzKToiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayByYXRhLXJhdGEgZGF0YSBuaWxhaQ0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fbmlsYWksDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOCwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuIChEYXRhIE5pbGFpKToiLCByb3VuZChtZWFuX25pbGFpLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTY1LCAwLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCiMjIyAyLiBNRURJQU4NCg0KTWVkaWFuIGFkYWxhaCBzYWxhaCBzYXR1IHVrdXJhbiBwZW11c2F0YW4gZGF0YSB5YW5nIG1lbnVuanVra2FuIG5pbGFpIHRlbmdhaCBkYXJpIHN1YXR1IGt1bXB1bGFuIGRhdGEgc2V0ZWxhaCBkYXRhIHRlcnNlYnV0IGRpdXJ1dGthbiBkYXJpIG5pbGFpIHRlcmtlY2lsIGhpbmdnYSBuaWxhaSB0ZXJiZXNhci4gTWVkaWFuIG1lbWJlcmlrYW4gaW5mb3JtYXNpIHRlbnRhbmcgdGl0aWsgdGVuZ2FoIGRhcmkgZGlzdHJpYnVzaSBkYXRhLCBtZW1iYWdpIGRhdGEgbWVuamFkaSBkdWEgYmFnaWFuIHlhbmcgc2FtYSBiZXNhciwgZGkgbWFuYSBzZXBhcnVoIGRhdGEgbWVtaWxpa2kgbmlsYWkgeWFuZyBsZWJpaCBrZWNpbCBkYXJpIG1lZGlhbiwgZGFuIHNlcGFydWggbGFpbm55YSBtZW1pbGlraSBuaWxhaSB5YW5nIGxlYmloIGJlc2FyLg0KDQojIyMjIDIuMSBMYW5na2FoIExhbmdrYWggTWVuZ2hpdHVuZyBNZWRpYW4NCg0KMS4gVXJ1dGthbiBkYXRhIGRhcmkgeWFuZyB0ZXJrZWNpbCBoaW5nZ2EgdGVyYmVzYXIuDQoNCjIuIEppa2EganVtbGFoIGRhdGEgZ2FuamlsLCBhbWJpbCBuaWxhaSB5YW5nIGJlcmFkYSBkaSB0ZW5nYWguDQoNCjMuIEppa2EganVtbGFoIGRhdGEgZ2VuYXAsIGFtYmlsIHJhdGEtcmF0YSBkdWEgbmlsYWkgdGVuZ2FoLg0KDQoNCiMjIyMjIyBydW11cyBtZWRpYW4gYWRhbGFoOg0KDQokJA0KXGJlZ2lue2VxdWF0aW9ufQ0KXGJlZ2lue3NwbGl0fQ0KXHRleHR7TWVkaWFufSAmPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFx0aW1lcyBoDQpcZW5ke3NwbGl0fQ0KXGVuZHtlcXVhdGlvbn0NCiQkDQoNCiMjIyMgS2V0ZXJhbmdhbiBWYXJpYWJlbA0KDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCkwgJiA6IFx0ZXh0e1RlcGkgYmF3YWgga2VsYXMgbWVkaWFufSBcXA0KbiAmIDogXHRleHR7SnVtbGFoIHRvdGFsIGZyZWt1ZW5zaX0gXCAoXFNpZ21hIGYpIFxcDQpcZnJhY3tufXsyfSAmIDogXHRleHR7U2V0ZW5nYWgganVtbGFoIHRvdGFsIGZyZWt1ZW5zaSAocG9zaXNpIG1lZGlhbil9IFxcDQpGICYgOiBcdGV4dHtGcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFufSBcXA0KZl9tICYgOiBcdGV4dHtGcmVrdWVuc2kgcGFkYSBrZWxhcyBtZWRpYW59IFxcDQpoICYgOiBcdGV4dHtQYW5qYW5nIGludGVydmFsIGtlbGFzfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KDQoqQ29udG9oOioNCg0KIC0gTWlzYWxueWEsIGtpdGEgbWVtaWxpa2kgZGF0YSBiZXJpa3V0Og0KDQo3MCwgODAsIDkwLCA4NSwgOTUNCg0KIC0gTGFuZ2thaCBwZXJ0YW1hLCB1cnV0a2FuIGRhdGE6IDcwLCA4MCwgODUsIDkwLCA5NS4NCiANCkthcmVuYSBqdW1sYWggZGF0YSBnYW5qaWwgKDUgZGF0YSksIG5pbGFpIHRlbmdhaCBhZGFsYWggODUuIEphZGksIG1lZGlhbiBhZGFsYWggODUuDQoNCkppa2EganVtbGFoIGRhdGFueWEgZ2VuYXAsIG1pc2FsbnlhIGRhdGEgbmlsYWkgdWppYW46DQoNCjcwLCA4MCwgOTAsIDEwMA0KDQogLSBMYW5na2FoIHBlcnRhbWEsIHVydXRrYW4gZGF0YTogNzAsIDgwLCA5MCwgMTAwLiBLYXJlbmEganVtbGFoIGRhdGEgZ2VuYXAgKDQgZGF0YSksIGR1YSBuaWxhaSB0ZW5nYWggYWRhbGFoIDgwIGRhbiA5MC4gTWFrYSBtZWRpYW4gYWRhbGFoIHJhdGEtcmF0YSBkYXJpIGtlZHVhbnlhOg0KIA0KJCQNClx0ZXh0e01lZGlhbn0gPSBcZnJhY3s4MCArIDkwfXsyfSA9IDg1DQokJA0KDQpKYWRpLCBtZWRpYW4gYWRhbGFoIDg1Lg0KDQojIyMjICpLZWxlYmloYW4qDQoNCk1lZGlhbiBtZW1pbGlraSBiZWJlcmFwYSBrZWxlYmloYW4geWFuZyBtZW1idWF0bnlhIHNhbmdhdCBiZXJndW5hIGRhbGFtIGFuYWxpc2lzIGRhdGEsIHRlcnV0YW1hIGtldGlrYSBraXRhIGJla2VyamEgZGVuZ2FuIGRhdGEgeWFuZyB0aWRhayB0ZXJkaXN0cmlidXNpIHNlY2FyYSBzaW1ldHJpcyBhdGF1IG1lbmdhbmR1bmcgb3V0bGllciAobmlsYWkgZWtzdHJlbSkuDQoNCiMjIyMgMi4yIFBlbmdvcHJhc2lhbiBkYW4gVmlzdWFsaXNhc2kgTWVkaWFuIE1lbmdndW5ha2FuIEJveHBsb3QgZGFuIEhpc3RvZ3JhbQ0KDQoNClRhYmxlIGRhdGEgDQoNCnwgTmFtYSAgICAgIHwgIE5pbGFpIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLXwNCnwgQnVkaSAgICAgIHwgIDkwICAgIHwNCnwgU2l0aSAgICAgIHwgIDg1ICAgIHwNCnwgQW5kaSAgICAgIHwgIDg4ICAgIHwNCnwgUmFuZGkgICAgIHwgIDkwICAgIHwNCnwgU2F0eWEgICAgIHwgIDg2ICAgIHwNCnwgU29rZWggICAgIHwgIDgzICAgIHwNCnwgQmF5dSAgICAgIHwgIDkyICAgIHwNCnwgRmFoaW0gICAgIHwgIDg4ICAgIHwNCnwgRGFybWFuICAgIHwgIDgzICAgIHwNCnwgU2VubyAgICAgIHwgIDkwICAgIHwNCnwgSmFtYWwgICAgIHwgIDgxICAgIHwNCnwgUm9tbyAgICAgIHwgIDg0ICAgIHwNCg0KIyMjIyMgUGVuZ29wcmFzaWFuIGRhbiBWaXN1YWxpc2FzaSBNZWRpYW4gTWVuZ2d1bmFrYW4gQm94cGxvdA0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IG5pbGFpIG1haGFzaXN3YSB5YW5nIGRpYmVyaWthbg0KbmFtYSA8LSBjKCJCdWRpIiwgIlNpdGkiLCAiQW5kaSIsICJSYW5kaSIsICJTYXR5YSIsICJTb2tlaCIsICJCYXl1IiwgIkZhaGltIiwgIkRhcm1hbiIsICJTZW5vIiwgIkphbWFsIiwgIlJvbW8iKQ0KbmlsYWkgPC0gYyg5MCwgODUsIDg4LCA5MCwgODYsIDgzLCA5MiwgODgsIDgzLCA5MCwgODEsIDg0KQ0KDQojIFVudHVrIGtlcGVybHVhbiBib3hwbG90LCBraXRhIGJ1YXQgZHVhIHNrZW5hcmlvOiBkZW5nYW4gb3V0bGllcnMgZGFuIHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKG5pbGFpLCA1NSkgICMgTWVuYW1iYWhrYW4gb3V0bGllcg0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBuaWxhaSAgIyBUYW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgbWVkaWFuIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCB1bnR1ayBtZWRpYW4gbWVuZ2d1bmFrYW4gUGxvdGx5IGRlbmdhbiBvdXRsaWVycyBkaXRhbXBpbGthbg0KcGxvdF9tZWRpYW4gPC0gcGxvdF9seSgNCiAgZGF0YSwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIGNvbG9ycyA9IGMoImxpZ2h0Ymx1ZSIsICJza3libHVlIiksICMgTWVuZ2F0dXIgd2FybmEgbWFudWFsIHVudHVrIGR1YSBrZWxvbXBvaw0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3hwbG90IE5pbGFpIEJlcmRhc2Fya2FuIE1lZGlhbiIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl90YW5wYV9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdCBtZWRpYW4NCnBsb3RfbWVkaWFuDQoNCmBgYA0KDQojIyMjIyBQZW5nb3ByYXNpYW4gZGFuIFZpc3VhbGlzYXNpIE1lZGlhbiBNZW5nZ3VuYWthbiBIaXN0b2dyYW0NCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogRHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycyB5YW5nIGJhcnUgZGlzZXN1YWlrYW4sIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoNSwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDE4LCAxOSwgMjAsIDIyLCAyMywgMTcpIA0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxOCwgMTgsIDE5LCAyMCwgMjIsIDIzLCAyNCkgDQoNCiMgRGF0YSB5YW5nIGRpYmVyaWthbg0KZGF0YV9uaWxhaSA8LSBjKDkwLCA4NSwgODgsIDkwLCA4NiwgODMsIDkyLCA4OCwgODMsIDkwLCA4MSwgODQpDQoNCiMgTWVtYnVhdCBkZW5zaXR5IHBsb3QgdW50dWsgbWFzaW5nLW1hc2luZyBkYXRhc2V0DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVuZ2hpdHVuZyBtZWRpYW4NCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KbWVkaWFuX25pbGFpIDwtIG1lZGlhbihkYXRhX25pbGFpKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fdGFucGFfb3V0bGllcnMsIG1lZGlhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGEgbmlsYWkgeWFuZyBkaWJlcmlrYW4NCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9uaWxhaSwgbWVkaWFuX25pbGFpKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksICAjIEd1bmFrYW4gbmlsYWkgbWF4IGRhcmkgZGVuc2l0eV90YW5wYV9vdXRsaWVycyB1bnR1ayB5DQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGF0YSBOaWxhaSkiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxNjUsIDAsIDAuOCknLCBkYXNoID0gJ2RvdCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKERlbmdhbiBPdXRsaWVycyk6Iiwgcm91bmQobWVkaWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLCAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKToiLCByb3VuZChtZWRpYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lZGlhbiBkYXRhIG5pbGFpDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX25pbGFpLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjgsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuIChEYXRhIE5pbGFpKToiLCByb3VuZChtZWRpYW5fbmlsYWksIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxNjUsIDAsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KIyMjIDMuIE1PRFVTDQoNCk1vZHVzIGFkYWxhaCBzYWxhaCBzYXR1IHVrdXJhbiBwZW11c2F0YW4gZGF0YSB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW51bmp1a2thbiBuaWxhaSBhdGF1IGFuZ2thIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gc2VidWFoIGt1bXB1bGFuIGRhdGEuIERhbGFtIGJhbnlhayBrYXN1cywgbW9kdXMgZGFwYXQgbWVtYmVyaWthbiBpbmZvcm1hc2kgeWFuZyBzYW5nYXQgYmVyZ3VuYSB0ZW50YW5nIGtlY2VuZGVydW5nYW4gdW11bSBhdGF1IGtlYmlhc2FhbiB5YW5nIGFkYSBkYWxhbSBkYXRhIHRlcnNlYnV0LiBNb2R1cyBzZXJpbmdrYWxpIGRpZ3VuYWthbiBkYWxhbSBiZXJiYWdhaSBiaWRhbmcsIHNlcGVydGkgc3RhdGlzdGlrLCBwZW1hc2FyYW4sIGRhbiBzb3Npb2xvZ2ksIHVudHVrIG1lbmdnYW1iYXJrYW4gZWxlbWVuIHlhbmcgZG9taW5hbiBhdGF1IHNlcmluZyBtdW5jdWwgZGFsYW0gc3VhdHUga2Vsb21wb2suDQoNCiMjIyMjIyBhLiBSdW11cyBNb2R1cw0KDQokJA0KXGJlZ2lue2VxdWF0aW9ufQ0KXGJlZ2lue3NwbGl0fQ0KXHRleHR7TW9kdXN9ICY9IEwgKyBcbGVmdCggXGZyYWN7Zl8xIC0gZl8wfXsyZl8xIC0gZl8wIC0gZl8yfSBccmlnaHQpIFx0aW1lcyBoDQpcZW5ke3NwbGl0fQ0KXGVuZHtlcXVhdGlvbn0NCiQkDQoNCiQkDQpcYmVnaW57ZXF1YXRpb259DQpcYmVnaW57YWxpZ25lZH0NCkwgJiA6IFx0ZXh0e1RlcGkgYmF3YWgga2VsYXMgbW9kYWwgKGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpKX0gXFwNCmZfMSAmIDogXHRleHR7RnJla3VlbnNpIGtlbGFzIG1vZGFsfSBcXA0KZl8wICYgOiBcdGV4dHtGcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2RhbH0gXFwNCmZfMiAmIDogXHRleHR7RnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kYWx9IFxcDQpoICYgOiBcdGV4dHtQYW5qYW5nIGludGVydmFsIGtlbGFzfQ0KXGVuZHthbGlnbmVkfQ0KXGVuZHtlcXVhdGlvbn0NCg0KJCQNCiMjIyMjIyBiLiBDb250b2ggDQoNCk1pc2FsbnlhLCBraXRhIG1lbWlsaWtpIGRhdGEgbmlsYWkgdWppYW4gYmVyaWt1dDoNCg0KIC0gODAsIDg1LCA4MCwgOTAsIDk1DQoNCkRpIHNpbmksIGFkYSBkdWEgbmlsYWkgeWFuZyBzZXJpbmcgbXVuY3VsLCB5YWl0dSA4MCBkYW4gOTAsIHNlaGluZ2dhIGRhdGEgaW5pIGJpbW9kYWwuDQoNCkppa2EgZGF0YSBhZGFsYWg6DQoNCiAtIDcwLCA4MCwgOTAsIDEwMCwgMTEwDQogDQogS2FyZW5hIHRpZGFrIGFkYSBuaWxhaSB5YW5nIGJlcnVsYW5nLCBtYWthIGRhdGEgaW5pIHRpZGFrIG1lbWlsaWtpIG1vZHVzLg0KIA0KIyMjIyMjIGMuIEtlbGViaWhhbiBNb2R1cyANCg0KTW9kdXMgbWVtaWxpa2kgYmVyYmFnYWkga2VsZWJpaGFuIHlhbmcgbWVuamFkaWthbm55YSB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgeWFuZyBzYW5nYXQgYmVyZ3VuYSBkYWxhbSBiZXJiYWdhaSBqZW5pcyBhbmFsaXNpcywgdGVydXRhbWEgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4gZnJla3VlbnNpIGtlbXVuY3VsYW4gbmlsYWkgdGVydGVudHUgZGFsYW0gZGF0YXNldC4gU2FsYWggc2F0dSBrZWd1bmFhbm55YSB5YW5nIHBhbGluZyB1dGFtYSBhZGFsYWggdW50dWsgbWVuZ2V0YWh1aSBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgdGVyamFkaSwgeWFuZyBkYXBhdCBtZW1iZXJpa2FuIHdhd2FzYW4gcGVudGluZyB0ZW50YW5nIHBvbGEgYXRhdSBrZWNlbmRlcnVuZ2FuIGRhbGFtIGRhdGEuDQoNCg0KIyMjIyAzLjEgUGVuZ29wcmFzaWFuIGRhbiBWaXN1YWxpc2FzaSBNb2R1cyBNZW5nZ3VuYWthbiBCb3hwbG90IGRhbiBIaXN0b2dyYW0NCg0KDQpUYWJsZSBkYXRhIA0KDQp8IE5hbWEgICAgICB8ICBOaWxhaSB8DQp8LS0tLS0tLS0tLS18LS0tLS0tLS18DQp8IEJ1ZGkgICAgICB8ICA5MCAgICB8DQp8IFNpdGkgICAgICB8ICA4NSAgICB8DQp8IEFuZGkgICAgICB8ICA4OCAgICB8DQp8IFJhbmRpICAgICB8ICA5MCAgICB8DQp8IFNhdHlhICAgICB8ICA4NiAgICB8DQp8IFNva2VoICAgICB8ICA4MyAgICB8DQp8IEJheXUgICAgICB8ICA5MiAgICB8DQp8IEZhaGltICAgICB8ICA4OCAgICB8DQp8IERhcm1hbiAgICB8ICA4MyAgICB8DQp8IFNlbm8gICAgICB8ICA5MCAgICB8DQp8IEphbWFsICAgICB8ICA4MSAgICB8DQp8IFJvbW8gICAgICB8ICA4NCAgICB8DQoNCiMjIyMjIDMuMS4xIFBlbmdvcHJhc2lhbiBkYW4gVmlzdWFsaXNhc2kgTW9kdXMgTWVuZ2d1bmFrYW4gQm94cGxvdA0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgbW9kdXMgKG1vZGUpDQptb2R1cyA8LSBmdW5jdGlvbih4KSB7DQogIHVuaXFfeCA8LSB1bmlxdWUoeCkNCiAgdGFiIDwtIHRhYnVsYXRlKG1hdGNoKHgsIHVuaXFfeCkpDQogIHVuaXFfeFt0YWIgPT0gbWF4KHRhYildDQp9DQoNCiMgRGF0YTogbmlsYWkgbWFoYXNpc3dhIHlhbmcgZGliZXJpa2FuDQpuYW1hIDwtIGMoIkJ1ZGkiLCAiU2l0aSIsICJBbmRpIiwgIlJhbmRpIiwgIlNhdHlhIiwgIlNva2VoIiwgIkJheXUiLCAiRmFoaW0iLCAiRGFybWFuIiwgIlNlbm8iLCAiSmFtYWwiLCAiUm9tbyIpDQpuaWxhaSA8LSBjKDkwLCA4NSwgODgsIDkwLCA4NiwgODMsIDkyLCA4OCwgODMsIDkwLCA4MSwgODQpDQoNCiMgVW50dWsga2VwZXJsdWFuIGJveHBsb3QsIGtpdGEgYnVhdCBkdWEgc2tlbmFyaW86IGRlbmdhbiBvdXRsaWVycyBkYW4gdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMobmlsYWksIDU1KSAgIyBNZW5hbWJhaGthbiBvdXRsaWVyDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIG5pbGFpICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgTWVuZ2hpdHVuZyBtb2R1cyAobW9kZSkgdW50dWsga2VkdWEgZGF0YXNldA0KbW9kdXNfZGVuZ2FuX291dGxpZXJzIDwtIG1vZHVzKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gbW9kdXMoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lIHVudHVrIHZpc3VhbGlzYXNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgdW50dWsgbW9kdXMgKG1vZGUpIG1lbmdndW5ha2FuIFBsb3RseSBkZW5nYW4gb3V0bGllcnMgZGl0YW1waWxrYW4NCnBsb3RfbW9kdXMgPC0gcGxvdF9seSgNCiAgZGF0YSwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIGNvbG9ycyA9IGMoImxpZ2h0Ymx1ZSIsICJza3libHVlIiksICAjIE1lbmFtYmFoa2FuIGR1YSB3YXJuYSBsZW1idXQgYmlydQ0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3hwbG90IE5pbGFpIEJlcmRhc2Fya2FuIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c19kZW5nYW5fb3V0bGllcnNbMV0sICAjIE1vZHVzIHVudHVrIGRlbmdhbiBvdXRsaWVycw0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHBhc3RlKG1vZHVzX2Rlbmdhbl9vdXRsaWVycywgY29sbGFwc2UgPSAiLCAiKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1vZHVzX3RhbnBhX291dGxpZXJzWzFdLCAgIyBNb2R1cyB1bnR1ayB0YW5wYSBvdXRsaWVycw0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHBhc3RlKG1vZHVzX3RhbnBhX291dGxpZXJzLCBjb2xsYXBzZSA9ICIsICIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMg0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QgbW9kdXMNCnBsb3RfbW9kdXMNCg0KYGBgDQoNCiMjIyMjIDMuMS4yIFBlbmdvcHJhc2lhbiBkYW4gVmlzdWFsaXNhc2kgTW9kdXMgTWVuZ2d1bmFrYW4gSGlzdG9ncmFtDQoNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeSB5YW5nIGRpcGVybHVrYW4NCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IER1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMgeWFuZyBiYXJ1IGRpc2VzdWFpa2FuLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDUsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAxOCwgMTksIDIwLCAyMiwgMjMsIDE3KSANCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTgsIDE4LCAxOSwgMjAsIDIyLCAyMywgMjQpIA0KDQojIERhdGEgeWFuZyBkaWJlcmlrYW4NCmRhdGFfbmlsYWkgPC0gYyg5MCwgODUsIDg4LCA5MCwgODYsIDgzLCA5MiwgODgsIDgzLCA5MCwgODEsIDg0KQ0KDQojIEZ1bmdzaSB1bnR1ayBtZW5naGl0dW5nIG1vZHVzDQpnZXRfbW9kZSA8LSBmdW5jdGlvbih2KSB7DQogIHVuaXFfdiA8LSB1bmlxdWUodikNCiAgdW5pcV92W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh2LCB1bmlxX3YpKSldDQp9DQoNCiMgTWVuZ2hpdHVuZyBtb2R1cw0KbW9kZV9kZW5nYW5fb3V0bGllcnMgPC0gZ2V0X21vZGUoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptb2RlX3RhbnBhX291dGxpZXJzIDwtIGdldF9tb2RlKGRhdGFfdGFucGFfb3V0bGllcnMpDQptb2RlX25pbGFpIDwtIGdldF9tb2RlKGRhdGFfbmlsYWkpDQoNCiMgTWVtYnVhdCBkZW5zaXR5IHBsb3QgdW50dWsgbWFzaW5nLW1hc2luZyBkYXRhc2V0DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cyB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV9kZW5nYW5fb3V0bGllcnMsIG1vZGVfZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV90YW5wYV9vdXRsaWVycywgbW9kZV90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cyB1bnR1ayBkYXRhIG5pbGFpIHlhbmcgZGliZXJpa2FuDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2RlX25pbGFpLCBtb2RlX25pbGFpKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksICAjIEd1bmFrYW4gbmlsYWkgbWF4IGRhcmkgZGVuc2l0eV90YW5wYV9vdXRsaWVycyB1bnR1ayB5DQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChEYXRhIE5pbGFpKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDE2NSwgMCwgMC44KScsIGRhc2ggPSAnZG90JykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kZV9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXMgKERlbmdhbiBPdXRsaWVycyk6Iiwgcm91bmQobW9kZV9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtb2RlX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXMgKFRhbnBhIE91dGxpZXJzKToiLCByb3VuZChtb2RlX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhIG5pbGFpDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kZV9uaWxhaSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC44LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzIChEYXRhIE5pbGFpKToiLCByb3VuZChtb2RlX25pbGFpLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTY1LCAwLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCiMjIEtlc2ltcHVsYW4gTUVBTiwgTUVESUFOLCBNT0RVUyANCg0KS2VzaW1wdWxhbiBVbXVtOg0KDQotIE1lYW4gc2FuZ2F0IGJlcmd1bmEgdW50dWsgZGF0YSB5YW5nIHRlcmRpc3RyaWJ1c2kgbm9ybWFsIGRhbiB0aWRhayBtZW1pbGlraSBvdXRsaWVyLCBrYXJlbmEgbWVtYmVyaWthbiBnYW1iYXJhbiBrZXNlbHVydWhhbiBkYXJpIHNlbHVydWggZGF0YS4gTmFtdW4sIGtlaGFkaXJhbiBuaWxhaSBla3N0cmltIGJpc2EgbWVtYnVhdG55YSB0aWRhayByZXByZXNlbnRhdGlmLg0KDQotIE1lZGlhbiBsZWJpaCBiYWlrIGRpZ3VuYWthbiBrZXRpa2EgZGF0YSBtZW1pbGlraSBkaXN0cmlidXNpIHlhbmcgbWlyaW5nIGF0YXUgdGVyZGFwYXQgbmlsYWkgZWtzdHJpbSwga2FyZW5hIHRpZGFrIGRpcGVuZ2FydWhpIG9sZWggb3V0bGllci4NCg0KLSBNb2R1cyBzYW5nYXQgYmVyZ3VuYSB1bnR1ayBtZW5nZXRhaHVpIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gZGF0YSwgdGVydXRhbWEgcGFkYSBkYXRhIGthdGVnb3Jpa2FsIGF0YXUgbm9taW5hbC4gTmFtdW4sIGppa2EgZGF0YSB0aWRhayBtZW1pbGlraSBuaWxhaSB5YW5nIHNlcmluZyBtdW5jdWwsIG1vZHVzIGJpc2EgamFkaSB0aWRhayBhZGEgYXRhdSBrdXJhbmcgaW5mb3JtYXRpZi4NCg0KUGVtaWxpaGFuIGFudGFyYSBtZWFuLCBtZWRpYW4sIGRhbiBtb2R1cyB0ZXJnYW50dW5nIHBhZGEgamVuaXMgZGF0YSB5YW5nIGRpbWlsaWtpIGRhbiB0dWp1YW4gYW5hbGlzaXMuIEtldGlnYW55YSBzYWxpbmcgbWVsZW5na2FwaSBkYW4gbWVtYmVyaWthbiBwYW5kYW5nYW4geWFuZyBiZXJiZWRhIHRlbnRhbmcga3VtcHVsYW4gZGF0YSB5YW5nIGRpYW5hbGlzaXMuDQoNCiMgUEVNVVNBVEFOIERBVEEgREFMQU0gQkVSQkFHQUkgQklEQU5HIA0KDQpVa3VyYW4gcGVtdXNhdGFuIGRhdGEsIHNlcGVydGkgbWVhbiwgbWVkaWFuLCBkYW4gbW9kdXMsIHNlcmluZyBkaWd1bmFrYW4gZGFsYW0gYmVyYmFnYWkgYmlkYW5nIHVudHVrIG1lbmdhbmFsaXNpcyBkYXRhIGRhbiBtZW5nYW1iaWwga2VwdXR1c2FuLiBCZXJpa3V0IGFkYWxhaCBiYWdhaW1hbmEgdWt1cmFuIHBlbXVzYXRhbiBkYXRhIGRpdGVyYXBrYW4gZGFsYW0gQmlzbmlzLCBLZXNlaGF0YW4sIGRhbiBQZW5kaWRpa2FuLg0KDQojIyAxLiBCaXNuaXMNCg0KRGFsYW0gZHVuaWEgYmlzbmlzLCB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgZGlndW5ha2FuIHVudHVrIG1lbmdhbmFsaXNpcyBiZXJiYWdhaSBhc3BlayBvcGVyYXNpIGRhbiBraW5lcmphIHBlcnVzYWhhYW4uIEJlcmlrdXQgYWRhbGFoIGNvbnRvaCBwZW5lcmFwYW4gcGVtdXNhdGFuIGRhdGEgZGFsYW0gYmlzbmlzOg0KDQojIyMgMS4xIE1lbmd1a3VyIFJhdGEtUmF0YSBQZW5qdWFsYW4gUGVydXNhaGFhbiANCg0Kc2VyaW5nIG1lbmdndW5ha2FuIHJhdGEtcmF0YSAobWVhbikgdW50dWsgbWVuZ2hpdHVuZyByYXRhLXJhdGEgcGVuanVhbGFuIGRhbGFtIHBlcmlvZGUgICAgICB0ZXJ0ZW50dSwgc2VwZXJ0aSBwZXIgYnVsYW4gYXRhdSBwZXIgdGFodW4uIEhhbCBpbmkgbWVtYmFudHUgcGVydXNhaGFhbiBtZW1haGFtaSB0cmVuIHBlbmp1YWxhbiBkYW4gbWVyZW5jYW5ha2FuIHN0cmF0ZWdpIG1hc2EgICAgICBkZXBhbi4NCg0KICAgIC0gQ29udG9oOkppa2Egc2VidWFoIHBlcnVzYWhhYW4gaW5naW4gbWVuZ2V0YWh1aSByYXRhLXJhdGEgcGVuanVhbGFuIGJ1bGFuYW4sIG1lcmVrYSBkYXBhdCBtZW5qdW1sYWhrYW4gcGVuanVhbGFuIGJ1bGFuYW4gICAgICAgICAgICAgICAgICAgIHNlbGFtYSBzZXRhaHVuIGRhbiBtZW1iYWdpbnlhIGRlbmdhbiAxMi4gSW5pIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdW11bSB0ZW50YW5nIGtpbmVyamEgcGVydXNhaGFhbiBkYWxhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZGUgdGVyc2VidXQuIA0KICAgIA0KIyMjIyBFa3Nlc2t1c2kgS2FzdXMNCg0KU2VidWFoIHBlcnVzYWhhYW4gZS1jb21tZXJjZSBpbmdpbiBtZW5nZXRhaHVpIHJhdGEtcmF0YSBwZW5qdWFsYW4gYnVsYW5hbiBzZWxhbWEgc2V0ZW5nYWggdGFodW4uIE1pc2FsbnlhLCBwZW5qdWFsYW4gYnVsYW5hbm55YSBhZGFsYWg6DQoNCg0KDQp8IEJVTEFOICAgICB8ICBKVU1BTCBVTklUICAgIHwgDQp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwNCnwgSmFudWFyaSAgIHwgICAgMTAuMDAwICAgICAgfCANCnwgRmVicnVhcmkgIHwgICAgMTIuMDAwICAgICAgfCANCnwgTWFyZXQgICAgIHwgICAgMTEuMDAwICAgICAgfCANCnwgQXByaWwgICAgIHwgICAgMTUuMDAwICAgICAgfCANCnwgTWVpICAgICAgIHwgICAgMTMuMDAwICAgICAgfCANCnwgSnVuaSAgICAgIHwgICAgMTAuMDAwICAgICAgfCANCg0KLSBNZW5naGl0dW5nIFJhdGEtUmF0YToNCiQkDQpcdGV4dHtSYXRhLXJhdGEgUGVuanVhbGFufSA9IFxmcmFjezEwLjAwMCArIDEyLjAwMCArIDExLjAwMCArIDE1LjAwMCArIDEzLjAwMCArIDEwLjAwMH17Nn0gPSAxMS44MzMgXCwgXHRleHR7dW5pdH0NCiQkDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIEp1bWxhaCBVbml0DQpidWxhbiA8LSBjKCJKYW51YXJpIiwgIkZlYnJ1YXJpIiwgIk1hcmV0IiwgIkFwcmlsIiwgIk1laSIsICJKdW5pIikNCmp1bWxhaF91bml0IDwtIGMoMTAwMDAsIDEyMDAwLCAxMTAwMCwgMTUwMDAsIDEzMDAwLCAxMDAwMCkNCg0KIyBEYXRhIFRhbnBhIE91dGxpZXIgKGFuZ2dhcCAxNTAwMCBhZGFsYWggb3V0bGllcikNCmp1bWxhaF91bml0X25vX291dGxpZXIgPC0ganVtbGFoX3VuaXRbanVtbGFoX3VuaXQgIT0gMTUwMDBdDQoNCiMgSGl0dW5nIE1lYW4NCm1lYW5fdW5pdCA8LSBtZWFuKGp1bWxhaF91bml0KQ0KbWVhbl9ub19vdXRsaWVyIDwtIG1lYW4oanVtbGFoX3VuaXRfbm9fb3V0bGllcikNCg0KIyBWaXN1YWxpc2FzaSBtZW5nZ3VuYWthbiBQbG90bHkNCg0KIyBEZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXINCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoanVtbGFoX3VuaXQpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoanVtbGFoX3VuaXRfbm9fb3V0bGllcikNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdW5pdCwgbWVhbl91bml0KSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWFuIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fbm9fb3V0bGllciwgbWVhbl9ub19vdXRsaWVyKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiSnVtbGFoIFVuaXQiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lYW4gZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX3VuaXQsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbiAoRGVuZ2FuIE91dGxpZXJzKToiLCByb3VuZChtZWFuX3VuaXQsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVhbiBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl9ub19vdXRsaWVyLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbiAoVGFucGEgT3V0bGllcnMpOiIsIHJvdW5kKG1lYW5fbm9fb3V0bGllciwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTQ1LA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KIyBWaXN1YWxpc2FzaSBCb3hwbG90IChEZW5nYW4gT3V0bGllcikNCmJveHBsb3QoanVtbGFoX3VuaXQsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBKdW1sYWggVW5pdCAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJKdW1sYWggVW5pdCIsDQogICAgICAgIGNvbCA9ICJza3libHVlIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUodiA9IG1lYW5fdW5pdCwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lYW4NCnRleHQobWVhbl91bml0LCAxLjIsIHBhc3RlKCJNZWFuID0iLCByb3VuZChtZWFuX3VuaXQsIDIpKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QoanVtbGFoX3VuaXRfbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IEp1bWxhaCBVbml0IChUYW5wYSBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiSnVtbGFoIFVuaXQiLA0KICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtZWFuX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQp0ZXh0KG1lYW5fbm9fb3V0bGllciwgMS4yLCBwYXN0ZSgiTWVhbiA9Iiwgcm91bmQobWVhbl9ub19vdXRsaWVyLCAyKSksIGNvbCA9ICJyZWQiKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoRGVuZ2FuIE91dGxpZXIpDQpoaXN0KGp1bWxhaF91bml0LA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBKdW1sYWggVW5pdCAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJKdW1sYWggVW5pdCIsDQogICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICBib3JkZXIgPSAid2hpdGUiKQ0KYWJsaW5lKHYgPSBtZWFuX3VuaXQsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lYW4gPSIsIHJvdW5kKG1lYW5fdW5pdCwgMikpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoVGFucGEgT3V0bGllcikNCmhpc3QoanVtbGFoX3VuaXRfbm9fb3V0bGllciwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gSnVtbGFoIFVuaXQgKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJKdW1sYWggVW5pdCIsDQogICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWVhbl9ub19vdXRsaWVyLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVhbg0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IHBhc3RlKCJNZWFuID0iLCByb3VuZChtZWFuX25vX291dGxpZXIsIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KDQpgYGANCg0KDQojIyMjIEtlc2ltcHVsYW4gDQoNClJhdGEtcmF0YSBpbmkgbWVtYmVyaSBwZXJ1c2FoYWFuIGdhbWJhcmFuIHRlbnRhbmcgdm9sdW1lIHBlbmp1YWxhbiBidWxhbmFuIHlhbmcgc3RhYmlsIGRhbiBkYXBhdCBkaWd1bmFrYW4gdW50dWsgbWVyZW5jYW5ha2FuIHN0cmF0ZWdpIGJpc25pcyBiZXJpa3V0bnlhLg0KDQogICAgDQogIA0KIyMjIDEuMiBBbmFsaXNpcyBIYXJnYSBTYWhhbSBEaSBwYXNhciBzYWhhbQ0KDQppbnZlc3RvciBzZXJpbmcgbWVuZ2d1bmFrYW4gbmlsYWkgdGVuZ2FoIChtZWRpYW4pIHVudHVrIG1lbWFoYW1pIHBlcmdlcmFrYW4gaGFyZ2Egc2FoYW0geWFuZyAgICBsZWJpaCBzdGFiaWwsIGthcmVuYSBtZWRpYW4gdGlkYWsgdGVycGVuZ2FydWggb2xlaCBmbHVrdHVhc2kgZWtzdHJlbSB5YW5nIGRhcGF0IG1lbnllYmFia2FuIG5pbGFpIHJhdGEtcmF0YSBtZW5qYWRpIGJpYXMuDQoNCiAgICAgLSBDb250b2g6IEppa2Egc2VidWFoIHNhaGFtIG1lbmdhbGFtaSBsb25qYWthbiBoYXJnYSB5YW5nIHNhbmdhdCB0aW5nZ2kgYXRhdSByZW5kYWggZGFsYW0gcGVyaW9kZSB0ZXJ0ZW50dSwgbWVkaWFuIGRhcGF0ICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcmlrYW4gICAgZ2FtYmFyYW4geWFuZyBsZWJpaCBha3VyYXQgdGVudGFuZyBoYXJnYSB0ZW5nYWggc2FoYW0gdGVyc2VidXQuDQoNCiMjIyMgRWtzZWt1c2kgS2FzdXMNCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBkYXRhc2V0IGRhcmkgQ1NWDQpkYXRhIDwtIHJlYWQuY3N2KCJIYXJnYVNhaGFtLi5jc3YiLCBzZXAgPSAiOyIpDQoNCiMgTWVuYW1waWxrYW4gZGF0YSBhd2FsIGRlbmdhbiBrYWJsZQ0KbGlicmFyeShrbml0cikgIA0Ka2FibGUoZGF0YSkgICMgTWVuZ2d1bmFrYW4gJ2RhdGEnIHNlYmFnYWkgbmFtYSB2YXJpYWJlbA0KYGBgDQpVcnV0a2FuIGhhcmdhIHNhaGFtOiA0OC4wMDAsIDUwLjAwMCwgNTAuNTAwLCA1MS4wMDAsIDUzLjAwMCwgNTUuMDAwLCA3MC4wMDAuIA0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgRGF0YSBoYXJnYSBzYWhhbSB5YW5nIHN1ZGFoIGRpdXJ1dGthbg0KaGFyZ2EgPC0gYyg0ODAwMCwgNTAwMDAsIDUwNTAwLCA1MTAwMCwgNTMwMDAsIDU1MDAwLCA3MDAwMCkNCg0KIyBJZGVudGlmaWthc2kgb3V0bGllciAoYW5nZ2FwIGhhcmdhIHBhZGEgU2FidHUsIDcwLjAwMCwgYWRhbGFoIG91dGxpZXIpDQpoYXJnYV9ub19vdXRsaWVyIDwtIGhhcmdhW2hhcmdhICE9IDcwMDAwXSAgIyBIYXB1cyBvdXRsaWVyDQoNCiMgSGl0dW5nIE1lZGlhbiAoZGVuZ2FuIG91dGxpZXIpDQptZWRpYW5faGFyZ2EgPC0gbWVkaWFuKGhhcmdhKQ0KcHJpbnQocGFzdGUoIk1lZGlhbiBIYXJnYSBTYWhhbSAoRGVuZ2FuIE91dGxpZXIpOiIsIG1lZGlhbl9oYXJnYSkpDQoNCiMgSGl0dW5nIE1lZGlhbiAodGFucGEgb3V0bGllcikNCm1lZGlhbl9oYXJnYV9ub19vdXRsaWVyIDwtIG1lZGlhbihoYXJnYV9ub19vdXRsaWVyKQ0KcHJpbnQocGFzdGUoIk1lZGlhbiBIYXJnYSBTYWhhbSAoVGFucGEgT3V0bGllcik6IiwgbWVkaWFuX2hhcmdhX25vX291dGxpZXIpKQ0KDQojIFZpc3VhbGlzYXNpIG1lbmdndW5ha2FuIFBsb3RseQ0KDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXINCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoaGFyZ2EpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoaGFyZ2Ffbm9fb3V0bGllcikNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX2hhcmdhLCBtZWRpYW5faGFyZ2EpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9oYXJnYV9ub19vdXRsaWVyLCBtZWRpYW5faGFyZ2Ffbm9fb3V0bGllciksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJIYXJnYSBTYWhhbSAoUnApIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5faGFyZ2EsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuIChEZW5nYW4gT3V0bGllcnMpOiIsIHJvdW5kKG1lZGlhbl9oYXJnYSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl9oYXJnYV9ub19vdXRsaWVyLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuIChUYW5wYSBPdXRsaWVycyk6Iiwgcm91bmQobWVkaWFuX2hhcmdhX25vX291dGxpZXIsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoRGVuZ2FuIE91dGxpZXIpDQpib3hwbG90KGhhcmdhLA0KICAgICAgICBtYWluID0gIkJveHBsb3QgSGFyZ2EgU2FoYW0gKERlbmdhbiBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiSGFyZ2EgU2FoYW0gKFJwKSIsDQogICAgICAgIGNvbCA9ICJza3libHVlIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUodiA9IG1lZGlhbl9oYXJnYSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lZGlhbg0KdGV4dChtZWRpYW5faGFyZ2EsIDEuMiwgcGFzdGUoIk1lZGlhbiA9IiwgbWVkaWFuX2hhcmdhKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QoaGFyZ2Ffbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IEhhcmdhIFNhaGFtIChUYW5wYSBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiSGFyZ2EgU2FoYW0gKFJwKSIsDQogICAgICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUodiA9IG1lZGlhbl9oYXJnYV9ub19vdXRsaWVyLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVkaWFuDQp0ZXh0KG1lZGlhbl9oYXJnYV9ub19vdXRsaWVyLCAxLjIsIHBhc3RlKCJNZWRpYW4gPSIsIG1lZGlhbl9oYXJnYV9ub19vdXRsaWVyKSwgY29sID0gInJlZCIpDQoNCiMgVmlzdWFsaXNhc2kgSGlzdG9ncmFtIChEZW5nYW4gT3V0bGllcikNCmhpc3QoaGFyZ2EsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIEhhcmdhIFNhaGFtIChEZW5nYW4gT3V0bGllcikiLA0KICAgICB4bGFiID0gIkhhcmdhIFNhaGFtIChScCkiLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWVkaWFuX2hhcmdhLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVkaWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lZGlhbiA9IiwgbWVkaWFuX2hhcmdhKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKFRhbnBhIE91dGxpZXIpDQpoaXN0KGhhcmdhX25vX291dGxpZXIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIEhhcmdhIFNhaGFtIChUYW5wYSBPdXRsaWVyKSIsDQogICAgIHhsYWIgPSAiSGFyZ2EgU2FoYW0gKFJwKSIsDQogICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWVkaWFuX2hhcmdhX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWRpYW4NCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBwYXN0ZSgiTWVkaWFuID0iLCBtZWRpYW5faGFyZ2Ffbm9fb3V0bGllciksIGNvbCA9ICJyZWQiLCBsdHkgPSAyLCBidHkgPSAibiIpDQpgYGANCg0KIyMjIyBLZXNpbXB1bGFuDQoNCk5pbGFpIHRlbmdhaCAobWVkaWFuKSBhZGFsYWggNTEuMDAwLCB5YW5nIG1lbnVuanVra2FuIGhhcmdhIHNhaGFtIHlhbmcgcGFsaW5nIHJlcHJlc2VudGF0aWYsIG1lbmd1cmFuZ2kgcGVuZ2FydWggZmx1a3R1YXNpIGVrc3RyZW0uDQogIA0KIyMjIDEuMyBJZGVudGlmaWthc2kgVHJlbiBkYWxhbSBQcmVmZXJlbnNpIEtvbnN1bWVuIEJpc25pcyBkZW5nYW4gTW9kdXMNCg0Kc2VyaW5nIG1lbmdndW5ha2FuIG1vZHVzIHVudHVrIG1lbmdldGFodWkgcHJvZHVrIGF0YXUgbGF5YW5hbiB5YW5nIHBhbGluZyAgICAgICAgc2VyaW5nIGRpcGlsaWggb2xlaCBrb25zdW1lbi4gSW5pIG1lbWJhbnR1IGRhbGFtIHBlbmdlbWJhbmdhbiBwcm9kdWsgYXRhdSBrYW1wYW55ZSBwZW1hc2FyYW4geWFuZyBsZWJpaCBzZXN1YWkgZGVuZ2FuIHByZWZlcmVuc2kgICAgcGVsYW5nZ2FuLg0KDQogICAgLSBDb250b2g6SmlrYSBzZWJ1YWggdG9rbyBpbmdpbiBtZW5nZXRhaHVpIHByb2R1ayBtYW5hIHlhbmcgcGFsaW5nIHNlcmluZyBkaWJlbGksIG1lcmVrYSBkYXBhdCBtZW5naGl0dW5nIG1vZHVzIGJlcmRhc2Fya2FuICAgICAgICAgICAgICAgICAgZGF0YSBwZW5qdWFsYW4uDQoNCiMjIyMgRWtzZXNrdXNpIEthc3VzDQoNClRva28gcml0ZWwgaW5naW4gbWVuZ2V0YWh1aSBwcm9kdWsgbWFuYSB5YW5nIHBhbGluZyBzZXJpbmcgZGliZWxpIG9sZWggcGVsYW5nZ2FuLiBCZXJpa3V0IGFkYWxhaCBqdW1sYWggcGVtYmVsaWFuIHByb2R1ayBBLCBCLCBkYW4gQyBkYWxhbSBzYXR1IG1pbmdndToNCg0KfCAgUFJPRFVLICAgfCBUT1RBTCBQRU1CRUxJQU4gfCANCnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwNCnwgICAgQSAgICAgIHwgICAgICAgNDAgICAgICAgIHwgDQp8ICAgIEIgICAgICB8ICAgICAgIDYwICAgICAgICB8IA0KfCAgICBDICAgICAgfCAgICAgICA2MCAgICAgICAgfCANCnwgICAgRCAgICAgIHwgICAgICAgMzAgICAgICAgIHwgDQp8ICAgIEUgICAgICB8ICAgICAgIDIwICAgICAgICB8IA0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgRGF0YSBUb3RhbCBQZW1iZWxpYW4NCnByb2R1ayA8LSBjKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiKQ0KdG90YWxfcGVtYmVsaWFuIDwtIGMoNDAsIDYwLCA2MCwgMzAsIDIwKQ0KDQojIEZ1bmdzaSB1bnR1ayBtZW5naGl0dW5nIG1vZHVzDQptb2R1cyA8LSBmdW5jdGlvbih4KSB7DQogIHVuaXFfeCA8LSB1bmlxdWUoeCkgICMgTmlsYWkgdW5paw0KICBmcmVxIDwtIHRhYnVsYXRlKG1hdGNoKHgsIHVuaXFfeCkpICAjIEZyZWt1ZW5zaSBtYXNpbmctbWFzaW5nIG5pbGFpDQogIHVuaXFfeFt3aGljaChmcmVxID09IG1heChmcmVxKSldICAjIE5pbGFpIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpDQp9DQoNCiMgSGl0dW5nIE1vZHVzDQptb2R1c19wZW1iZWxpYW4gPC0gbW9kdXModG90YWxfcGVtYmVsaWFuKQ0KcHJpbnQocGFzdGUoIk1vZHVzIFRvdGFsIFBlbWJlbGlhbjoiLCBtb2R1c19wZW1iZWxpYW4pKQ0KDQojIElkZW50aWZpa2FzaSBPdXRsaWVyIChhbmdnYXAgbmlsYWkgNjAgc2ViYWdhaSBvdXRsaWVyKQ0KdG90YWxfcGVtYmVsaWFuX25vX291dGxpZXIgPC0gdG90YWxfcGVtYmVsaWFuW3RvdGFsX3BlbWJlbGlhbiAhPSA2MF0gICMgSGFwdXMgb3V0bGllcg0KDQojIEJveHBsb3QgZGVuZ2FuIE91dGxpZXINCmJveHBsb3QodG90YWxfcGVtYmVsaWFuLA0KICAgICAgICBtYWluID0gIkJveHBsb3QgVG90YWwgUGVtYmVsaWFuIChEZW5nYW4gT3V0bGllcikiLA0KICAgICAgICB5bGFiID0gIlRvdGFsIFBlbWJlbGlhbiIsDQogICAgICAgIGNvbCA9ICJza3libHVlIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUodiA9IG1vZHVzX3BlbWJlbGlhbiwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1vZHVzDQp0ZXh0KG1vZHVzX3BlbWJlbGlhbiwgMS4yLCBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX3BlbWJlbGlhbiksIGNvbCA9ICJyZWQiKSAgIyBUYW1iYWhrYW4gdGVrcw0KDQojIEJveHBsb3QgdGFucGEgT3V0bGllcg0KYm94cGxvdCh0b3RhbF9wZW1iZWxpYW5fbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IFRvdGFsIFBlbWJlbGlhbiAoVGFucGEgT3V0bGllcikiLA0KICAgICAgICB5bGFiID0gIlRvdGFsIFBlbWJlbGlhbiIsDQogICAgICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQptb2R1c19ub19vdXRsaWVyIDwtIG1vZHVzKHRvdGFsX3BlbWJlbGlhbl9ub19vdXRsaWVyKQ0KYWJsaW5lKHYgPSBtb2R1c19ub19vdXRsaWVyLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbW9kdXMNCnRleHQobW9kdXNfbm9fb3V0bGllciwgMS4yLCBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX25vX291dGxpZXIpLCBjb2wgPSAicmVkIikNCg0KIyBIaXN0b2dyYW0gZGVuZ2FuIE91dGxpZXINCmhpc3QodG90YWxfcGVtYmVsaWFuLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBUb3RhbCBQZW1iZWxpYW4gKERlbmdhbiBPdXRsaWVyKSIsDQogICAgIHhsYWIgPSAiVG90YWwgUGVtYmVsaWFuIiwNCiAgICAgY29sID0gImxpZ2h0Ymx1ZSIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1vZHVzX3BlbWJlbGlhbiwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1vZHVzDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1vZHVzID0iLCBtb2R1c19wZW1iZWxpYW4pLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQojIEhpc3RvZ3JhbSB0YW5wYSBPdXRsaWVyDQpoaXN0KHRvdGFsX3BlbWJlbGlhbl9ub19vdXRsaWVyLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBUb3RhbCBQZW1iZWxpYW4gKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJUb3RhbCBQZW1iZWxpYW4iLA0KICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1vZHVzX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtb2R1cw0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IHBhc3RlKCJNb2R1cyA9IiwgbW9kdXNfbm9fb3V0bGllciksIGNvbCA9ICJyZWQiLCBsdHkgPSAyLCBidHkgPSAibiIpDQoNCiMgVmlzdWFsaXNhc2kgQmFyIFBsb3QgKERlbmdhbiBPdXRsaWVyKQ0KYmFycGxvdCh0b3RhbF9wZW1iZWxpYW4sDQogICAgICAgIG5hbWVzLmFyZyA9IHByb2R1aywNCiAgICAgICAgbWFpbiA9ICJWaXN1YWxpc2FzaSBNb2R1cyBUb3RhbCBQZW1iZWxpYW4gKERlbmdhbiBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiUHJvZHVrIiwNCiAgICAgICAgeWxhYiA9ICJUb3RhbCBQZW1iZWxpYW4iLA0KICAgICAgICBjb2wgPSBpZmVsc2UodG90YWxfcGVtYmVsaWFuID09IG1vZHVzX3BlbWJlbGlhbiwgInJlZCIsICJza3libHVlIiksDQogICAgICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQpsZWdlbmQoInRvcHJpZ2h0IiwNCiAgICAgICBsZWdlbmQgPSBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX3BlbWJlbGlhbiksDQogICAgICAgZmlsbCA9ICJyZWQiLA0KICAgICAgIGJ0eSA9ICJuIikgICMgVGFtYmFoa2FuIGxlZ2VuZGEgdW50dWsgbW9kdXMNCg0KIyBWaXN1YWxpc2FzaSBCYXIgUGxvdCAoVGFucGEgT3V0bGllcikNCmJhcnBsb3QodG90YWxfcGVtYmVsaWFuX25vX291dGxpZXIsDQogICAgICAgIG5hbWVzLmFyZyA9IHByb2R1a1t0b3RhbF9wZW1iZWxpYW4gIT0gNjBdLA0KICAgICAgICBtYWluID0gIlZpc3VhbGlzYXNpIE1vZHVzIFRvdGFsIFBlbWJlbGlhbiAoVGFucGEgT3V0bGllcikiLA0KICAgICAgICB4bGFiID0gIlByb2R1ayIsDQogICAgICAgIHlsYWIgPSAiVG90YWwgUGVtYmVsaWFuIiwNCiAgICAgICAgY29sID0gaWZlbHNlKHRvdGFsX3BlbWJlbGlhbl9ub19vdXRsaWVyID09IG1vZHVzX25vX291dGxpZXIsICJyZWQiLCAibGlnaHRncmVlbiIpLA0KICAgICAgICBib3JkZXIgPSAid2hpdGUiKQ0KbGVnZW5kKCJ0b3ByaWdodCIsDQogICAgICAgbGVnZW5kID0gcGFzdGUoIk1vZHVzID0iLCBtb2R1c19ub19vdXRsaWVyKSwNCiAgICAgICBmaWxsID0gInJlZCIsDQogICAgICAgYnR5ID0gIm4iKQ0KDQpgYGANCg0KIyMjIyBLZXNpbXB1bGFuDQoNCk1vZHVzOiBNb2R1cyBkYXJpIGRhdGEgaW5pIGFkYWxhaCBwcm9kdWsgQiBkYW4gQywga2FyZW5hIGtlZHVhbnlhIG1lbWlsaWtpIGp1bWxhaCBwZW1iZWxpYW4gdGVyYmFueWFrICg2MCksIHlhbmcgbWVtYmFudHUgdG9rbyBmb2t1cyBwYWRhIHBlbWFzYXJhbiBrZWR1YSBwcm9kdWsgdGVyc2VidXQuDQoNCiAgICAgDQoNCiMjIDIuIEtlc2VoYXRhbg0KDQpEaSBiaWRhbmcga2VzZWhhdGFuLCB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgc2FuZ2F0IHBlbnRpbmcgdW50dWsgbWVuZ2FuYWxpc2lzIHBvbGEgcGVueWFraXQsIGVmaXNpZW5zaSBwZXJhd2F0YW4ga2VzZWhhdGFuLCBkYW4gZGlzdHJpYnVzaSB2YXJpYWJlbCBrZXNlaGF0YW4gbGFpbm55YS4gQmVyaWt1dCBhZGFsYWggY29udG9oIHBlbmVyYXBhbiB1a3VyYW4gcGVtdXNhdGFuIGRhdGEgZGFsYW0ga2VzZWhhdGFuOg0KDQojIyMgMi4xIFBlbmd1a3VyYW4gUmF0YS1SYXRhIFVzaWEgUGFzaWVuIA0KDQpEYWxhbSBhbmFsaXNpcyBkZW1vZ3JhZmlzIHJ1bWFoIHNha2l0IGF0YXUga2xpbmlrLCByYXRhLXJhdGEgdXNpYSBwYXNpZW4gZGlndW5ha2FuIHVudHVrIG1lbWFoYW1pIHByb2ZpbCB1c2lhIHBvcHVsYXNpIHlhbmcgZGlsYXlhbmksIHlhbmcgcGVudGluZyB1bnR1ayBwZXJlbmNhbmFhbiBsYXlhbmFuIGtlc2VoYXRhbi4NCg0KICAgIC0gQ29udG9oOiBSdW1haCBzYWtpdCBkYXBhdCBtZW5naGl0dW5nIHJhdGEtcmF0YSB1c2lhIHBhc2llbiB1bnR1ayBtZXJlbmNhbmFrYW4gZmFzaWxpdGFzIGF0YXUgcGVyYXdhdGFuIHlhbmcgbGViaWggc2VzdWFpIGRlbmdhbiBrZWxvbXBvayB1c2lhIHRlcnRlbnR1Lg0KICAgIA0KIyMjIyBFa3Nlc2t1c2kgS2FzdXMNCg0KU2VidWFoIHJ1bWFoIHNha2l0IGluZ2luIG1lbmdldGFodWkgcmF0YS1yYXRhIHVzaWEgcGFzaWVuIHlhbmcgZGF0YW5nIHNlbGFtYSBzZW1pbmdndS4gRGF0YSB1c2lhIHBhc2llbiBhZGFsYWg6DQoNCi0gMjUgdGFodW4NCg0KLSAzMCB0YWh1bg0KDQotIDM1IHRhaHVuDQoNCi0gNDAgdGFodW4NCg0KLSA0NSB0YWh1bg0KDQokJA0KXHRleHR7UmF0YS1yYXRhIFVzaWF9ID0gXGZyYWN7MjUgKyAzMCArIDM1ICsgNDAgKyA0NX17NX0gPSAzNSBcLCBcdGV4dHt0YWh1bn0NCiQkDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIFVzaWEgUGFzaWVuDQp1c2lhIDwtIGMoMjUsIDMwLCAzNSwgNDAsIDQ1KSAgIyBEYXRhIGRlbmdhbiBvdXRsaWVyICg0NSkNCg0KIyBBbmdnYXAgdXNpYSA0NSBhZGFsYWggb3V0bGllciwgbWFrYSBraXRhIGJ1YXQgZGF0YSB0YW5wYSBvdXRsaWVyDQp1c2lhX25vX291dGxpZXIgPC0gdXNpYVt1c2lhICE9IDQ1XQ0KDQojIEhpdHVuZyBNZWFuIHVudHVrIGRhdGEgZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyDQptZWFuX3VzaWEgPC0gbWVhbih1c2lhKQ0KbWVhbl91c2lhX25vX291dGxpZXIgPC0gbWVhbih1c2lhX25vX291dGxpZXIpDQoNCiMgVmlzdWFsaXNhc2kgbWVuZ2d1bmFrYW4gUGxvdGx5DQoNCiMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdXNpYSBkZW5nYW4gb3V0bGllcg0KZGVuc2l0eV91c2lhIDwtIGRlbnNpdHkodXNpYSkNCiMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdXNpYSB0YW5wYSBvdXRsaWVyDQpkZW5zaXR5X3VzaWFfbm9fb3V0bGllciA8LSBkZW5zaXR5KHVzaWFfbm9fb3V0bGllcikNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YSB1c2lhIGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3VzaWEkeCwNCiAgICB5ID0gfmRlbnNpdHlfdXNpYSR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdXNpYSB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3VzaWFfbm9fb3V0bGllciR4LA0KICAgIHkgPSB+ZGVuc2l0eV91c2lhX25vX291dGxpZXIkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVhbiB1bnR1ayBkYXRhIHVzaWEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX3VzaWEsIG1lYW5fdXNpYSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdXNpYSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lYW4gdW50dWsgZGF0YSB1c2lhIHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX3VzaWFfbm9fb3V0bGllciwgbWVhbl91c2lhX25vX291dGxpZXIpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3VzaWFfbm9fb3V0bGllciR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4gKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJWaXN1YWxpc2FzaSBSYXRhLVJhdGEgVXNpYSBQYXNpZW4gKERlbmdhbiBkYW4gVGFucGEgT3V0bGllcnMpIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVXNpYSAoVGFodW4pIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIHVzaWEgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl91c2lhLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdXNpYSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuIChEZW5nYW4gT3V0bGllcnMpOiIsIHJvdW5kKG1lYW5fdXNpYSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIHVzaWEgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX3VzaWFfbm9fb3V0bGllciwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3VzaWFfbm9fb3V0bGllciR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuIChUYW5wYSBPdXRsaWVycyk6Iiwgcm91bmQobWVhbl91c2lhX25vX291dGxpZXIsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoRGVuZ2FuIE91dGxpZXIpDQpib3hwbG90KHVzaWEsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBVc2lhIFBhc2llbiAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJVc2lhIFBhc2llbiIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICAgICBob3Jpem9udGFsID0gVFJVRSkNCmFibGluZSh2ID0gbWVhbl91c2lhLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVhbg0KdGV4dChtZWFuX3VzaWEsIDEuMiwgcGFzdGUoIk1lYW4gPSIsIHJvdW5kKG1lYW5fdXNpYSwgMikpLCBjb2wgPSAicmVkIikgICMgVGFtYmFoa2FuIHRla3MNCg0KIyBWaXN1YWxpc2FzaSBCb3hwbG90IChUYW5wYSBPdXRsaWVyKQ0KYm94cGxvdCh1c2lhX25vX291dGxpZXIsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBVc2lhIFBhc2llbiAoVGFucGEgT3V0bGllcikiLA0KICAgICAgICB4bGFiID0gIlVzaWEgUGFzaWVuIiwNCiAgICAgICAgY29sID0gImxpZ2h0Z3JlZW4iLA0KICAgICAgICBob3Jpem9udGFsID0gVFJVRSkNCmFibGluZSh2ID0gbWVhbl91c2lhX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQp0ZXh0KG1lYW5fdXNpYV9ub19vdXRsaWVyLCAxLjIsIHBhc3RlKCJNZWFuID0iLCByb3VuZChtZWFuX3VzaWFfbm9fb3V0bGllciwgMikpLCBjb2wgPSAicmVkIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKERlbmdhbiBPdXRsaWVyKQ0KaGlzdCh1c2lhLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBVc2lhIFBhc2llbiAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJVc2lhIFBhc2llbiIsDQogICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICBib3JkZXIgPSAid2hpdGUiKQ0KYWJsaW5lKHYgPSBtZWFuX3VzaWEsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lYW4gPSIsIHJvdW5kKG1lYW5fdXNpYSwgMikpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoVGFucGEgT3V0bGllcikNCmhpc3QodXNpYV9ub19vdXRsaWVyLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBVc2lhIFBhc2llbiAoVGFucGEgT3V0bGllcikiLA0KICAgICB4bGFiID0gIlVzaWEgUGFzaWVuIiwNCiAgICAgY29sID0gImxpZ2h0Z3JlZW4iLA0KICAgICBib3JkZXIgPSAid2hpdGUiKQ0KYWJsaW5lKHYgPSBtZWFuX3VzaWFfbm9fb3V0bGllciwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lYW4NCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBwYXN0ZSgiTWVhbiA9Iiwgcm91bmQobWVhbl91c2lhX25vX291dGxpZXIsIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KYGBgDQoNCg0KIyMjIyBQZW5qZWxhc2FuIA0KDQpEZW5nYW4gcmF0YS1yYXRhIHVzaWEgMzUgdGFodW4sIHJ1bWFoIHNha2l0IGRhcGF0IG1lcmVuY2FuYWthbiBsYXlhbmFuIHlhbmcgbGViaWggdGVwYXQsIHNlcGVydGkgZmFzaWxpdGFzIG1lZGlzIGF0YXUgcGVuZ29iYXRhbiB5YW5nIHNlc3VhaSBkZW5nYW4ga2Vsb21wb2sgdXNpYSBpbmkuDQoNCiMjIyAyLjIgU3RhdGlzdGlrIFBlbnlha2l0IE1lZGlhbiANCg0KU2VyaW5nIGRpZ3VuYWthbiBkYWxhbSBlcGlkZW1pb2xvZ2kgdW50dWsgbWVuZ2dhbWJhcmthbiBkaXN0cmlidXNpIGRhdGEgcGVueWFraXQsIHNlcGVydGkgd2FrdHUgYmVydGFoYW4gaGlkdXAgcGFzaWVuIGF0YXUgdXNpYSBkaWFnbm9zaXMgcGVueWFraXQgdGVydGVudHUuIE1lZGlhbiBsZWJpaCBkaXN1a2FpIGthcmVuYSB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIGRhdGEgZWtzdHJlbS4NCg0KICAgIC0gQ29udG9oOiBEYWxhbSBwZW5lbGl0aWFuIGthbmtlciwgbWVkaWFuIHVtdXIgcGFzaWVuIHNhYXQgZGlkaWFnbm9zaXMgZGFwYXQgZGlndW5ha2FuIHVudHVrIG1lbmdpbmZvcm1hc2lrYW4ga2ViaWpha2FuIGtlc2VoYXRhbiBhdGF1IHBlbmVsaXRpYW4gbGViaWggbGFuanV0Lg0KICAgIA0KIyMjI0Vrc2VrdXNpIEthc3VzDQoNCkRhbGFtIHNlYnVhaCBwZW5lbGl0aWFuIG1lbmdlbmFpIHdha3R1IGJlcnRhaGFuIGhpZHVwIHBhc2llbiBrYW5rZXIsIGRhdGEgd2FrdHUgYmVydGFoYW4gaGlkdXAgKGRhbGFtIGJ1bGFuKSBhZGFsYWg6DQoNCi0JMyBidWxhbg0KDQotIDYgYnVsYW4NCg0KLSA5IGJ1bGFuDQoNCi0gMTIgYnVsYW4NCg0KLSAyMCBidWxhbg0KDQokJA0KXHRleHR7RGF0YTogfSAzLCA2LCA5LCAxMiwgMjAgXFwNClx0ZXh0e01lZGlhbn0gPSA5IFwsIFx0ZXh0e2J1bGFufQ0KJCQNCmBgYHtyLCBtYXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeSB5YW5nIGRpcGVybHVrYW4NCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgVXNpYSBQYXNpZW4NCnVzaWEgPC0gYygyNSwgMzAsIDM1LCA0MCwgNDUpICAjIERhdGEgZGVuZ2FuIG91dGxpZXIgKDQ1KQ0KDQojIEFuZ2dhcCB1c2lhIDQ1IGFkYWxhaCBvdXRsaWVyLCBtYWthIGtpdGEgYnVhdCBkYXRhIHRhbnBhIG91dGxpZXINCnVzaWFfbm9fb3V0bGllciA8LSB1c2lhW3VzaWEgIT0gNDVdDQoNCiMgRGF0YSB3YWt0dSAoZGFsYW0gYnVsYW4pDQpwZXJpb2RlX3dha3R1IDwtIGMoMywgNiwgOSwgMTIsIDIwKQ0KDQojIE1lbmdoaXR1bmcgTWVkaWFuIHVudHVrIGRhdGEgdXNpYSBiZXJkYXNhcmthbiBwZXJpb2RlIHdha3R1DQptZWRpYW5fdXNpYSA8LSBzYXBwbHkocGVyaW9kZV93YWt0dSwgZnVuY3Rpb24odCkgbWVkaWFuKHVzaWEpKSAgIyBNZWRpYW4gdW50dWsgdXNpYSBkZW5nYW4gb3V0bGllcnMNCm1lZGlhbl91c2lhX25vX291dGxpZXIgPC0gc2FwcGx5KHBlcmlvZGVfd2FrdHUsIGZ1bmN0aW9uKHQpIG1lZGlhbih1c2lhX25vX291dGxpZXIpKSAgIyBNZWRpYW4gdW50dWsgdXNpYSB0YW5wYSBvdXRsaWVycw0KDQojIFZpc3VhbGlzYXNpIG1lbmdndW5ha2FuIFBsb3RseQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIHRyYWNlIHVudHVrIG1lZGlhbiB1c2lhIGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IHBlcmlvZGVfd2FrdHUsDQogICAgeSA9IG1lZGlhbl91c2lhLA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMiksDQogICAgbWFya2VyID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDgpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gdHJhY2UgdW50dWsgbWVkaWFuIHVzaWEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBwZXJpb2RlX3dha3R1LA0KICAgIHkgPSBtZWRpYW5fdXNpYV9ub19vdXRsaWVyLA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKSwNCiAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gOCkNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlZpc3VhbGlzYXNpIE1lZGlhbiBVc2lhIFBhc2llbiBCZXJkYXNhcmthbiBQZXJpb2RlIFdha3R1IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVyaW9kZSBXYWt0dSAoQnVsYW4pIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lZGlhbiBVc2lhIChUYWh1bikiKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIHVzaWEgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gcGVyaW9kZV93YWt0dSwNCiAgICAgICAgeSA9IG1lZGlhbl91c2lhLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKToiLCByb3VuZChtZWRpYW5fdXNpYSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gdXNpYSB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IHBlcmlvZGVfd2FrdHUsDQogICAgICAgIHkgPSBtZWRpYW5fdXNpYV9ub19vdXRsaWVyLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpOiIsIHJvdW5kKG1lZGlhbl91c2lhX25vX291dGxpZXIsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoRGVuZ2FuIE91dGxpZXIpDQpib3hwbG90KHVzaWEsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBVc2lhIFBhc2llbiAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJVc2lhIFBhc2llbiIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICAgICBob3Jpem9udGFsID0gVFJVRSkNCmFibGluZShoID0gbWVkaWFuX3VzaWEsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWRpYW4NCnRleHQobWVkaWFuX3VzaWEsIDEuMiwgcGFzdGUoIk1lZGlhbiA9Iiwgcm91bmQobWVkaWFuX3VzaWEsIDIpKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QodXNpYV9ub19vdXRsaWVyLA0KICAgICAgICBtYWluID0gIkJveHBsb3QgVXNpYSBQYXNpZW4gKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJVc2lhIFBhc2llbiIsDQogICAgICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUoaCA9IG1lZGlhbl91c2lhX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWRpYW4NCnRleHQobWVkaWFuX3VzaWFfbm9fb3V0bGllciwgMS4yLCBwYXN0ZSgiTWVkaWFuID0iLCByb3VuZChtZWRpYW5fdXNpYV9ub19vdXRsaWVyLCAyKSksIGNvbCA9ICJyZWQiKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoRGVuZ2FuIE91dGxpZXIpDQpoaXN0KHVzaWEsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIFVzaWEgUGFzaWVuIChEZW5nYW4gT3V0bGllcikiLA0KICAgICB4bGFiID0gIlVzaWEgUGFzaWVuIiwNCiAgICAgY29sID0gImxpZ2h0Ymx1ZSIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1lZGlhbl91c2lhLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVkaWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lZGlhbiA9Iiwgcm91bmQobWVkaWFuX3VzaWEsIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKFRhbnBhIE91dGxpZXIpDQpoaXN0KHVzaWFfbm9fb3V0bGllciwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gVXNpYSBQYXNpZW4gKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJVc2lhIFBhc2llbiIsDQogICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWVkaWFuX3VzaWFfbm9fb3V0bGllciwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lZGlhbg0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IHBhc3RlKCJNZWRpYW4gPSIsIHJvdW5kKG1lZGlhbl91c2lhX25vX291dGxpZXIsIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KYGBgDQojIyMjIE1lbmdoaXR1bmcgTWVkaWFuOiANCg0KVXJ1dGthbiBkYXRhOiAzLCA2LCA5LCAxMiwgMjAuIE5pbGFpIHRlbmdhaCAobWVkaWFuKSBhZGFsYWggOSBidWxhbiwgeWFuZyBtZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggc3RhYmlsIGRhbiB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIGRhdGEgZWtzdHJlbSAobWlzYWxueWEsIHBhc2llbiB5YW5nIGJlcnRhaGFuIGhpZHVwIHNhbmdhdCBsYW1hKS4NCg0KIyMjIDIuMyBGcmVrdWVuc2kgUGVueWFraXQgYXRhdSBHZWphbGEgTW9kdXMgDQoNCmRpZ3VuYWthbiB1bnR1ayBtZW5nZXRhaHVpIGdlamFsYSBhdGF1IHBlbnlha2l0IHlhbmcgcGFsaW5nIHNlcmluZyB0ZXJqYWRpIGRhbGFtIHBvcHVsYXNpIHRlcnRlbnR1LiBJbmkgc2FuZ2F0IHBlbnRpbmcgZGFsYW0gZXBpZGVtaW9sb2dpIHVudHVrIG1lbmVudHVrYW4gcG9sYSBwZW55ZWJhcmFuIHBlbnlha2l0Lg0KDQogICAgLSBDb250b2g6IEppa2EgYmFueWFrIHBhc2llbiB5YW5nIGRhdGFuZyBkZW5nYW4gZ2VqYWxhIGRlbWFtIGRhbiBiYXR1aywgbW9kdXMgYWthbiBtZW51bmp1a2thbiBiYWh3YSBpbmkgYWRhbGFoIGdlamFsYSB5YW5nIHBhbGluZyBzZXJpbmcgZGlsYXBvcmthbiBkYWxhbSBwZXJpb2RlIHRlcnRlbnR1Lg0KICAgIA0KIyMjIyBFa3Nla3VzaSBLYXN1cw0KDQpEaSBydW1haCBzYWtpdCwgZG9rdGVyIGluZ2luIG1lbmdldGFodWkgZ2VqYWxhIHlhbmcgcGFsaW5nIHVtdW0gZGFyaSBwYXNpZW4gZmx1LiBEYXRhIGdlamFsYSB5YW5nIHRlcmNhdGF0IGFkYWxhaDoNCg0KRGVtYW0gPSAzMCBwYXNpZW4NCkJhdHVrID0gNTAgcGFzaWVuDQpTYWtpdCBrZXBhbGEgPSA0MCBwYXNpZW4NCg0KJCQNClx0ZXh0e0RlbWFtOiAzMCBwYXNpZW4sIEJhdHVrOiA1MCBwYXNpZW4sIFNha2l0IGtlcGFsYTogNDAgcGFzaWVufSBcXA0KXHRleHR7TW9kdXM6IEJhdHVrIChwYWxpbmcgc2VyaW5nIGRpbGFwb3JrYW4pfQ0KJCQNCg0KDQpgYGB7ciwgbWFzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCiMgRGF0YSBqdW1sYWggcGFzaWVuIHVudHVrIHNldGlhcCBrYXRlZ29yaQ0Ka2F0ZWdvcmkgPC0gYygiRGVtYW0iLCAiQmF0dWsiLCAiU2FraXQgS2VwYWxhIikNCmp1bWxhaF9wYXNpZW4gPC0gYygzMCwgNTAsIDQwKSAgIyBEYXRhIGRlbmdhbiBvdXRsaWVyDQoNCiMgSWRlbnRpZmlrYXNpIG91dGxpZXIgKGFuZ2dhcCAiQmF0dWsiIGFkYWxhaCBvdXRsaWVyIGthcmVuYSBqdW1sYWhueWEgdGVybGFsdSB0aW5nZ2kpDQpqdW1sYWhfcGFzaWVuX25vX291dGxpZXIgPC0ganVtbGFoX3Bhc2llbltqdW1sYWhfcGFzaWVuICE9IG1heChqdW1sYWhfcGFzaWVuKV0gICMgRGF0YSB0YW5wYSBvdXRsaWVyDQprYXRlZ29yaV9ub19vdXRsaWVyIDwtIGthdGVnb3JpW2p1bWxhaF9wYXNpZW4gIT0gbWF4KGp1bWxhaF9wYXNpZW4pXQ0KDQojIE1vZHVzIChrYXRlZ29yaSBkZW5nYW4ganVtbGFoIHBhc2llbiB0ZXJiYW55YWspDQptb2R1cyA8LSBrYXRlZ29yaVt3aGljaC5tYXgoanVtbGFoX3Bhc2llbildDQpwcmludChwYXN0ZSgiTW9kdXMgKERlbmdhbiBPdXRsaWVyKToiLCBtb2R1cykpDQoNCiMgTW9kdXMgdGFucGEgb3V0bGllcg0KbW9kdXNfbm9fb3V0bGllciA8LSBrYXRlZ29yaV9ub19vdXRsaWVyW3doaWNoLm1heChqdW1sYWhfcGFzaWVuX25vX291dGxpZXIpXQ0KcHJpbnQocGFzdGUoIk1vZHVzIChUYW5wYSBPdXRsaWVyKToiLCBtb2R1c19ub19vdXRsaWVyKSkNCg0KIyBWaXN1YWxpc2FzaSBtZW5nZ3VuYWthbiBQbG90bHkNCg0KbGlicmFyeShwbG90bHkpDQoNCiMgTWVtYnVhdCBwbG90IEhpc3RvZ3JhbQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgSGlzdG9ncmFtIGRlbmdhbiBvdXRsaWVyDQogIGFkZF90cmFjZSgNCiAgICB4ID0ga2F0ZWdvcmksDQogICAgeSA9IGp1bWxhaF9wYXNpZW4sDQogICAgdHlwZSA9ICdiYXInLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXIiLA0KICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScpDQogICkgJT4lDQogICMgSGlzdG9ncmFtIHRhbnBhIG91dGxpZXINCiAgYWRkX3RyYWNlKA0KICAgIHggPSBrYXRlZ29yaV9ub19vdXRsaWVyLA0KICAgIHkgPSBqdW1sYWhfcGFzaWVuX25vX291dGxpZXIsDQogICAgdHlwZSA9ICdiYXInLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllciIsDQogICAgbWFya2VyID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlZpc3VhbGlzYXNpIE1vZHVzIEp1bWxhaCBQYXNpZW4gKERlbmdhbiBkYW4gVGFucGEgT3V0bGllcikiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLYXRlZ29yaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJKdW1sYWggUGFzaWVuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXMsDQogICAgICAgIHkgPSBtYXgoanVtbGFoX3Bhc2llbikgKyA1LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbW9kdXMgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX25vX291dGxpZXIsDQogICAgICAgIHkgPSBtYXgoanVtbGFoX3Bhc2llbl9ub19vdXRsaWVyKSArIDUsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXMgKFRhbnBhIE91dGxpZXIpOiIsIG1vZHVzX25vX291dGxpZXIpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QgSGlzdG9ncmFtDQpwbG90DQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoRGVuZ2FuIE91dGxpZXIpDQpib3hwbG90KGp1bWxhaF9wYXNpZW4sDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBKdW1sYWggUGFzaWVuIChEZW5nYW4gT3V0bGllcikiLA0KICAgICAgICB4bGFiID0gIkp1bWxhaCBQYXNpZW4iLA0KICAgICAgICBjb2wgPSAic2t5Ymx1ZSIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtYXgoanVtbGFoX3Bhc2llbiksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtb2R1cw0KdGV4dChtYXgoanVtbGFoX3Bhc2llbiksIDEuMiwgcGFzdGUoIk1vZHVzID0iLCBtb2R1cyksIGNvbCA9ICJyZWQiKSAgIyBUYW1iYWhrYW4gdGVrcw0KDQojIFZpc3VhbGlzYXNpIEJveHBsb3QgKFRhbnBhIE91dGxpZXIpDQpib3hwbG90KGp1bWxhaF9wYXNpZW5fbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IEp1bWxhaCBQYXNpZW4gKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJKdW1sYWggUGFzaWVuIiwNCiAgICAgICAgY29sID0gImxpZ2h0Z3JlZW4iLA0KICAgICAgICBob3Jpem9udGFsID0gVFJVRSkNCmFibGluZSh2ID0gbWF4KGp1bWxhaF9wYXNpZW5fbm9fb3V0bGllciksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtb2R1cw0KdGV4dChtYXgoanVtbGFoX3Bhc2llbl9ub19vdXRsaWVyKSwgMS4yLCBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX25vX291dGxpZXIpLCBjb2wgPSAicmVkIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKERlbmdhbiBPdXRsaWVyKQ0KaGlzdChqdW1sYWhfcGFzaWVuLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBKdW1sYWggUGFzaWVuIChEZW5nYW4gT3V0bGllcikiLA0KICAgICB4bGFiID0gIkp1bWxhaCBQYXNpZW4iLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWF4KGp1bWxhaF9wYXNpZW4pLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbW9kdXMNCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKFRhbnBhIE91dGxpZXIpDQpoaXN0KGp1bWxhaF9wYXNpZW5fbm9fb3V0bGllciwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gSnVtbGFoIFBhc2llbiAoVGFucGEgT3V0bGllcikiLA0KICAgICB4bGFiID0gIkp1bWxhaCBQYXNpZW4iLA0KICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1heChqdW1sYWhfcGFzaWVuX25vX291dGxpZXIpLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbW9kdXMNCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX25vX291dGxpZXIpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQoNCmBgYA0KIyMjIyBNZW5naGl0dW5nIE1vZHVzOiANCg0KTW9kdXMgZGFsYW0gZGF0YSBpbmkgYWRhbGFoIEJhdHVrLCBrYXJlbmEgYmF0dWsgZGlsYXBvcmthbiBvbGVoIDUwIHBhc2llbiwgbGViaWggYmFueWFrIGRpYmFuZGluZ2thbiBnZWphbGEgbGFpbm55YS4NCg0KIyMjIyBLZXNpbXB1bGFuDQoNCkRlbmdhbiBtZW5nZXRhaHVpIGdlamFsYSB5YW5nIHBhbGluZyBzZXJpbmcgZGlsYXBvcmthbiAoYmF0dWspLCBydW1haCBzYWtpdCBkYXBhdCBsZWJpaCBmb2t1cyBkYWxhbSBtZW1iZXJpa2FuIHBlbmFuZ2FuYW4geWFuZyB0ZXBhdCwgc2VwZXJ0aSBwZXJzZWRpYWFuIG9iYXQgYXRhdSB2YWtzaW5hc2kgeWFuZyBsZWJpaCBiYW55YWsuDQoNCg0KDQojIyAzLiBQZW5kaWRpa2FuIA0KDQpEYWxhbSBiaWRhbmcgcGVuZGlkaWthbiwgdWt1cmFuIHBlbXVzYXRhbiBkYXRhIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXZhbHVhc2kga2luZXJqYSBzaXN3YSwgbWVuZ2FuYWxpc2lzIGhhc2lsIHVqaWFuLCBkYW4gbWVyYW5jYW5nIGtlYmlqYWthbiBwZW5kaWRpa2FuLiBCZXJpa3V0IGFkYWxhaCBjb250b2ggcGVuZXJhcGFuIHVrdXJhbiBwZW11c2F0YW4gZGF0YSBkYWxhbSBwZW5kaWRpa2FuOg0KDQojIyMgMy4xIFJhdGEtUmF0YSBOaWxhaSBVamlhbiBSYXRhLXJhdGEgbmlsYWkgdWppYW4gDQoNCnNlcmluZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2V2YWx1YXNpIGtpbmVyamEgc2lzd2EgZGFsYW0gc3VhdHUgdWppYW4gYXRhdSB0dWdhcyBiZXNhci4gSW5pIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdW11bSB0ZW50YW5nIHNlamF1aCBtYW5hIHNpc3dhIG1lbWFoYW1pIG1hdGVyaSB5YW5nIGRpdWppLg0KDQogICAgLSBDb250b2g6IEppa2Egc2Vrb2xhaCBpbmdpbiBtZW5nZXRhaHVpIHJhdGEtcmF0YSBuaWxhaSB1amlhbiBtYXRlbWF0aWthIHVudHVrIHNlbHVydWgga2VsYXMsIG1lcmVrYSBkYXBhdCBtZW5qdW1sYWhrYW4gbmlsYWkgdWppYW4gZGFuIG1lbWJhZ2lueWEgZGVuZ2FuIGp1bWxhaCBzaXN3YS4NCiAgICANCiMjIyMgRWtzZWt1c2kgS2FzdXMgDQoNCkRhbGFtIHVqaWFuIG1hdGVtYXRpa2Ega2VsYXMgMTIsIGJlcmlrdXQgYWRhbGFoIG5pbGFpIHlhbmcgZGlwZXJvbGVoIG9sZWggc2lzd2E6DQoNCi0gODANCg0KLSA4NQ0KDQotIDkwDQoNCi0JNzANCg0KLQk5NQ0KDQokJA0KXHRleHR7UmF0YS1yYXRhIE5pbGFpfSA9IFxmcmFjezgwICsgODUgKyA5MCArIDcwICsgOTV9ezV9ID0gODQgXCwgXHRleHR7cG9pbn0NCiQkDQoNCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIERhdGEgbmlsYWkgdWppYW4gbWF0ZW1hdGlrYSBrZWxhcyAxMg0KbmlsYWkgPC0gYyg4MCwgODUsIDkwLCA3MCwgOTUpICAjIERhdGEgZGVuZ2FuIG91dGxpZXINCm5pbGFpX25vX291dGxpZXIgPC0gbmlsYWlbbmlsYWkgIT0gNzBdICAjIERhdGEgdGFucGEgb3V0bGllcg0KDQojIEhpdHVuZyBNZWFuIChkZW5nYW4gb3V0bGllcikNCm1lYW5fbmlsYWkgPC0gbWVhbihuaWxhaSkNCnByaW50KHBhc3RlKCJNZWFuIE5pbGFpIChEZW5nYW4gT3V0bGllcik6IiwgbWVhbl9uaWxhaSkpDQoNCiMgSGl0dW5nIE1lYW4gKHRhbnBhIG91dGxpZXIpDQptZWFuX25pbGFpX25vX291dGxpZXIgPC0gbWVhbihuaWxhaV9ub19vdXRsaWVyKQ0KcHJpbnQocGFzdGUoIk1lYW4gTmlsYWkgKFRhbnBhIE91dGxpZXIpOiIsIG1lYW5fbmlsYWlfbm9fb3V0bGllcikpDQoNCiMgVmlzdWFsaXNhc2kgbWVuZ2d1bmFrYW4gUGxvdGx5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXINCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkobmlsYWkpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkobmlsYWlfbm9fb3V0bGllcikNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fbmlsYWksIG1lYW5fbmlsYWkpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lYW4gdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl9uaWxhaV9ub19vdXRsaWVyLCBtZWFuX25pbGFpX25vX291dGxpZXIpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSBVamlhbiIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVhbiBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fbmlsYWksDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbiAoRGVuZ2FuIE91dGxpZXJzKToiLCByb3VuZChtZWFuX25pbGFpLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lYW4gZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fbmlsYWlfbm9fb3V0bGllciwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW4gKFRhbnBhIE91dGxpZXJzKToiLCByb3VuZChtZWFuX25pbGFpX25vX291dGxpZXIsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoRGVuZ2FuIE91dGxpZXIpDQpib3hwbG90KG5pbGFpLA0KICAgICAgICBtYWluID0gIkJveHBsb3QgTmlsYWkgVWppYW4gKERlbmdhbiBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiTmlsYWkgVWppYW4iLA0KICAgICAgICBjb2wgPSAic2t5Ymx1ZSIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtZWFuX25pbGFpLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVhbg0KdGV4dChtZWFuX25pbGFpLCAxLjIsIHBhc3RlKCJNZWFuID0iLCBtZWFuX25pbGFpKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QobmlsYWlfbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IE5pbGFpIFVqaWFuIChUYW5wYSBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiTmlsYWkgVWppYW4iLA0KICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtZWFuX25pbGFpX25vX291dGxpZXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQp0ZXh0KG1lYW5fbmlsYWlfbm9fb3V0bGllciwgMS4yLCBwYXN0ZSgiTWVhbiA9IiwgbWVhbl9uaWxhaV9ub19vdXRsaWVyKSwgY29sID0gInJlZCIpDQoNCiMgVmlzdWFsaXNhc2kgSGlzdG9ncmFtIChEZW5nYW4gT3V0bGllcikNCmhpc3QobmlsYWksDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIE5pbGFpIFVqaWFuIChEZW5nYW4gT3V0bGllcikiLA0KICAgICB4bGFiID0gIk5pbGFpIFVqaWFuIiwNCiAgICAgY29sID0gImxpZ2h0Ymx1ZSIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1lYW5fbmlsYWksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lYW4gPSIsIG1lYW5fbmlsYWkpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoVGFucGEgT3V0bGllcikNCmhpc3QobmlsYWlfbm9fb3V0bGllciwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gTmlsYWkgVWppYW4gKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJOaWxhaSBVamlhbiIsDQogICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWVhbl9uaWxhaV9ub19vdXRsaWVyLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVhbg0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IHBhc3RlKCJNZWFuID0iLCBtZWFuX25pbGFpX25vX291dGxpZXIpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQpgYGANCg0KUGVuamVsYXNhbg0KDQpEZW5nYW4gcmF0YS1yYXRhIG5pbGFpIDg0IHBvaW4sIGd1cnUgZGFwYXQgbWVuZ2V0YWh1aSBraW5lcmphIHJhdGEtcmF0YSBzaXN3YSBkYW4gbWVuZW50dWthbiBhcGFrYWggbWF0ZXJpIHBlcmx1IHBlbnllc3VhaWFuIGF0YXUgYWRhIGFyZWEgeWFuZyBwZXJsdSBkaXBlcmJhaWtpLg0KDQoNCiMjIyAzLjIgUGVuaWxhaWFuIEtpbmVyamEgU2lzd2EgTWVkaWFuIA0KDQpEaWd1bmFrYW4gdW50dWsgbWVuZ2V0YWh1aSBuaWxhaSB0ZW5nYWggZGFsYW0gaGFzaWwgdWppYW4gYXRhdSB0ZXMsIHlhbmcgdGlkYWsgdGVycGVuZ2FydWggb2xlaCBuaWxhaSBla3N0cmVtLiBJbmkgbWVtYmVyaWthbiBwZW1haGFtYW4geWFuZyBsZWJpaCBhZGlsIHRlbnRhbmcga2luZXJqYSBtYXlvcml0YXMgc2lzd2EuDQoNCiAgICAtIENvbnRvaDogSmlrYSBhZGEgYmViZXJhcGEgc2lzd2EgeWFuZyBtZW5kYXBhdGthbiBuaWxhaSBzYW5nYXQgdGluZ2dpIGF0YXUgcmVuZGFoLCBtZWRpYW4gZGFwYXQgbWVtYmVyaWthbiBnYW1iYXJhbiBsZWJpaCBha3VyYXQgdGVudGFuZyBraW5lcmphIHNpc3dhIHNlY2FyYSBrZXNlbHVydWhhbi4NCiAgICANCiMjIyMgRWtzZWt1c2kgS2FzdXMgDQoNClNlb3JhbmcgZ3VydSBpbmdpbiBtZW5nZXRhaHVpIG5pbGFpIHRlbmdhaCBkYXJpIHVqaWFuIGFraGlyIHlhbmcgZGlpa3V0aSBvbGVoIDEwIHNpc3dhLiBOaWxhaSB5YW5nIGRpcGVyb2xlaCBhZGFsYWg6DQoNCi0gNTAsIDU1LCA2MCwgNzAsIDgwLCA4MCwgODUsIDkwLCA5MCwgOTUNCg0KIyMjIyBNZW5naGl0dW5nIE1lZGlhbjogDQoNClVydXRrYW4gZGF0YTogNTAsIDU1LCA2MCwgNzAsIDgwLCA4MCwgODUsIDkwLCA5MCwgOTUuIEthcmVuYSBhZGEgMTAgZGF0YSwgbWVkaWFuIGFkYWxhaCByYXRhLXJhdGEgZGFyaSBkYXRhIGtlLTUgZGFuIGtlLTYsIHlhaXR1Og0KDQokJA0KXHRleHR7RGF0YTogfSA1MCwgNTUsIDYwLCA3MCwgODAsIDgwLCA4NSwgOTAsIDkwLCA5NSBcXA0KXHRleHR7TWVkaWFufSA9IFxmcmFjezgwICsgODB9ezJ9ID0gODANCiQkDQoNCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIERhdGEgbmlsYWkgdWppYW4gYWtoaXIgc2lzd2ENCm5pbGFpIDwtIGMoNTAsIDU1LCA2MCwgNzAsIDgwLCA4MCwgODUsIDkwLCA5MCwgOTUpDQoNCiMgSWRlbnRpZmlrYXNpIG91dGxpZXIgKGFuZ2dhcCBuaWxhaSA1MCBkYW4gOTUgYWRhbGFoIG91dGxpZXIpDQpuaWxhaV9ub19vdXRsaWVyIDwtIG5pbGFpW25pbGFpICE9IDUwICYgbmlsYWkgIT0gOTVdICAjIE1lbmdoYXB1cyBvdXRsaWVyDQoNCiMgSGl0dW5nIE1lZGlhbiAoZGVuZ2FuIG91dGxpZXIpDQptZWRpYW5fbmlsYWkgPC0gbWVkaWFuKG5pbGFpKQ0KcHJpbnQocGFzdGUoIk1lZGlhbiBOaWxhaSBVamlhbiAoRGVuZ2FuIE91dGxpZXIpOiIsIG1lZGlhbl9uaWxhaSkpDQoNCiMgSGl0dW5nIE1lZGlhbiAodGFucGEgb3V0bGllcikNCm1lZGlhbl9uaWxhaV9ub19vdXRsaWVyIDwtIG1lZGlhbihuaWxhaV9ub19vdXRsaWVyKQ0KcHJpbnQocGFzdGUoIk1lZGlhbiBOaWxhaSBVamlhbiAoVGFucGEgT3V0bGllcik6IiwgbWVkaWFuX25pbGFpX25vX291dGxpZXIpKQ0KDQojIFZpc3VhbGlzYXNpIG1lbmdndW5ha2FuIFBsb3RseQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyDQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KG5pbGFpKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KG5pbGFpX25vX291dGxpZXIpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9uaWxhaSwgbWVkaWFuX25pbGFpKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fbmlsYWlfbm9fb3V0bGllciwgbWVkaWFuX25pbGFpX25vX291dGxpZXIpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVkaWFuIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgVWppYW4iKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lZGlhbiBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl9uaWxhaSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKERlbmdhbiBPdXRsaWVycyk6Iiwgcm91bmQobWVkaWFuX25pbGFpLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lZGlhbiBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX25pbGFpX25vX291dGxpZXIsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKToiLCByb3VuZChtZWRpYW5fbmlsYWlfbm9fb3V0bGllciwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTQ1LA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KIyBWaXN1YWxpc2FzaSBCb3hwbG90IChEZW5nYW4gT3V0bGllcikNCmJveHBsb3QobmlsYWksDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBOaWxhaSBVamlhbiAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJOaWxhaSBVamlhbiIsDQogICAgICAgIGNvbCA9ICJza3libHVlIiwNCiAgICAgICAgaG9yaXpvbnRhbCA9IFRSVUUpDQphYmxpbmUodiA9IG1lZGlhbl9uaWxhaSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lZGlhbg0KdGV4dChtZWRpYW5fbmlsYWksIDEuMiwgcGFzdGUoIk1lZGlhbiA9IiwgbWVkaWFuX25pbGFpKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QobmlsYWlfbm9fb3V0bGllciwNCiAgICAgICAgbWFpbiA9ICJCb3hwbG90IE5pbGFpIFVqaWFuIChUYW5wYSBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiTmlsYWkgVWppYW4iLA0KICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtZWRpYW5fbmlsYWlfbm9fb3V0bGllciwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1lZGlhbg0KdGV4dChtZWRpYW5fbmlsYWlfbm9fb3V0bGllciwgMS4yLCBwYXN0ZSgiTWVkaWFuID0iLCBtZWRpYW5fbmlsYWlfbm9fb3V0bGllciksIGNvbCA9ICJyZWQiKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoRGVuZ2FuIE91dGxpZXIpDQpoaXN0KG5pbGFpLA0KICAgICBtYWluID0gIkhpc3RvZ3JhbSBOaWxhaSBVamlhbiAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJOaWxhaSBVamlhbiIsDQogICAgIGNvbCA9ICJsaWdodGJsdWUiLA0KICAgICBib3JkZXIgPSAid2hpdGUiKQ0KYWJsaW5lKHYgPSBtZWRpYW5fbmlsYWksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtZWRpYW4NCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBwYXN0ZSgiTWVkaWFuID0iLCByb3VuZChtZWRpYW5fbmlsYWksIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKFRhbnBhIE91dGxpZXIpDQpoaXN0KG5pbGFpX25vX291dGxpZXIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIE5pbGFpIFVqaWFuIChUYW5wYSBPdXRsaWVyKSIsDQogICAgIHhsYWIgPSAiTmlsYWkgVWppYW4iLA0KICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgIGJvcmRlciA9ICJ3aGl0ZSIpDQphYmxpbmUodiA9IG1lZGlhbl9uaWxhaV9ub19vdXRsaWVyLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbWVkaWFuDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1lZGlhbiA9Iiwgcm91bmQobWVkaWFuX25pbGFpX25vX291dGxpZXIsIDIpKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KYGBgDQoNCiMjIyMgS2VzaW1wdWxhbg0KDQpNZWRpYW4gbmlsYWkgYWRhbGFoIDgwLiBJbmkgbWVudW5qdWtrYW4gYmFod2Egc2ViYWdpYW4gYmVzYXIgc2lzd2EgbWVuZGFwYXRrYW4gbmlsYWkgc2VraXRhciA4MCwgbWVtYmVyaSBnYW1iYXJhbiB5YW5nIGxlYmloIHJlcHJlc2VudGF0aWYgdGVudGFuZyBkaXN0cmlidXNpIG5pbGFpIGRpIGtlbGFzLg0KDQojIyMgMy4zIEZyZWt1ZW5zaSBUaW5na2F0IEtldGVyYW1waWxhbiBNb2R1cyANCg0KRGlndW5ha2FuIHVudHVrIG1lbmdldGFodWkgdGluZ2thdCBrZXRlcmFtcGlsYW4gYXRhdSBwZW5nZXRhaHVhbiB5YW5nIHBhbGluZyBzZXJpbmcgZGltaWxpa2kgb2xlaCBzaXN3YSBkYWxhbSBzdWF0dSBrZWxvbXBvay4gSW5pIGRhcGF0IG1lbWJhbnR1IHBlbmRpZGlrIGRhbGFtIG1lcmFuY2FuZyBrdXJpa3VsdW0geWFuZyBsZWJpaCBlZmVrdGlmLg0KDQogICAgLSBDb250b2g6IEppa2Egc2ViYWdpYW4gYmVzYXIgc2lzd2EgbWVtaWxpa2kgcGVtYWhhbWFuIHlhbmcgYmFpayBkYWxhbSB0b3BpayB0ZXJ0ZW50dSwgbWFrYSBtb2R1cyBha2FuIG1lbnVuanVra2FuIHRpbmdrYXQgcGVuZ3Vhc2FhbiB5YW5nIHBhbGluZyB1bXVtIGRpIGtlbGFzIHRlcnNlYnV0Lg0KICAgIA0KIyMjIyBFa3Nla3VzaSBLYXN1cw0KDQpTZW9yYW5nIGd1cnUgaW5naW4gbWVuZ2V0YWh1aSBuaWxhaSB0ZW5nYWggZGFyaSB1amlhbiBha2hpciBzaXN3YS4gTmlsYWkgeWFuZyBkaXBlcm9sZWggYWRhbGFoOg0KDQotIEEgPSAxMCBTaXN3YSANCg0KLSBCID0gMjAgU2lzd2EgDQoNCi0gQyA9IDUgU2lzd2ENCg0KDQokJA0KXHRleHR7TmlsYWkgQTogMTAgc2lzd2EsIE5pbGFpIEI6IDIwIHNpc3dhLCBOaWxhaSBDOiA1IHNpc3dhfSBcXA0KXHRleHR7TW9kdXM6IE5pbGFpIEIgKHBhbGluZyBzZXJpbmcgbXVuY3VsKX0NCiQkDQoNCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIERhdGEganVtbGFoIHNpc3dhIHVudHVrIHNldGlhcCBuaWxhaQ0Ka2F0ZWdvcmkgPC0gYygiQSIsICJCIiwgIkMiKQ0KanVtbGFoX3Npc3dhIDwtIGMoMTAsIDIwLCA1KSAgIyBEYXRhDQoNCiMgSWRlbnRpZmlrYXNpIG91dGxpZXIgKGFuZ2dhcCBuaWxhaSAiQSIgZGFuICJDIiBzZWJhZ2FpIG91dGxpZXIga2FyZW5hIGp1bWxhaCBzaXN3YSBzZWRpa2l0KQ0KanVtbGFoX3Npc3dhX25vX291dGxpZXIgPC0ganVtbGFoX3Npc3dhW2p1bWxhaF9zaXN3YSAhPSBtaW4oanVtbGFoX3Npc3dhKSAmIGp1bWxhaF9zaXN3YSAhPSBtYXgoanVtbGFoX3Npc3dhKV0gICMgTWVuZ2hhcHVzIG91dGxpZXINCmthdGVnb3JpX25vX291dGxpZXIgPC0ga2F0ZWdvcmlbanVtbGFoX3Npc3dhICE9IG1pbihqdW1sYWhfc2lzd2EpICYganVtbGFoX3Npc3dhICE9IG1heChqdW1sYWhfc2lzd2EpXQ0KDQojIE1vZHVzIChrYXRlZ29yaSBkZW5nYW4ganVtbGFoIHNpc3dhIHRlcmJhbnlhaykNCm1vZHVzIDwtIGthdGVnb3JpW3doaWNoLm1heChqdW1sYWhfc2lzd2EpXQ0KcHJpbnQocGFzdGUoIk1vZHVzOiIsIG1vZHVzKSkNCg0KIyBNb2R1cyB0YW5wYSBvdXRsaWVyDQptb2R1c19ub19vdXRsaWVyIDwtIGthdGVnb3JpX25vX291dGxpZXJbd2hpY2gubWF4KGp1bWxhaF9zaXN3YV9ub19vdXRsaWVyKV0NCnByaW50KHBhc3RlKCJNb2R1cyAoVGFucGEgT3V0bGllcik6IiwgbW9kdXNfbm9fb3V0bGllcikpDQoNCiMgVmlzdWFsaXNhc2kgbWVuZ2d1bmFrYW4gUGxvdGx5DQoNCmxpYnJhcnkocGxvdGx5KQ0KDQojIE1lbWJ1YXQgcGxvdCBIaXN0b2dyYW0NCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIEhpc3RvZ3JhbSBkZW5nYW4gb3V0bGllcg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGthdGVnb3JpLA0KICAgIHkgPSBqdW1sYWhfc2lzd2EsDQogICAgdHlwZSA9ICdiYXInLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXIiLA0KICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScpDQogICkgJT4lDQogICMgSGlzdG9ncmFtIHRhbnBhIG91dGxpZXINCiAgYWRkX3RyYWNlKA0KICAgIHggPSBrYXRlZ29yaV9ub19vdXRsaWVyLA0KICAgIHkgPSBqdW1sYWhfc2lzd2Ffbm9fb3V0bGllciwNCiAgICB0eXBlID0gJ2JhcicsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVyIiwNCiAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgTW9kdXMgSnVtbGFoIFNpc3dhIChEZW5nYW4gZGFuIFRhbnBhIE91dGxpZXIpIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2F0ZWdvcmkgTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiSnVtbGFoIFNpc3dhIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXMsDQogICAgICAgIHkgPSBtYXgoanVtbGFoX3Npc3dhKSArIDIsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6IiwgbW9kdXMpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXNfbm9fb3V0bGllciwNCiAgICAgICAgeSA9IG1heChqdW1sYWhfc2lzd2Ffbm9fb3V0bGllcikgKyAyLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzIChUYW5wYSBPdXRsaWVyKToiLCBtb2R1c19ub19vdXRsaWVyKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90IEhpc3RvZ3JhbQ0KcGxvdA0KDQojIFZpc3VhbGlzYXNpIEJveHBsb3QgKERlbmdhbiBPdXRsaWVyKQ0KYm94cGxvdChqdW1sYWhfc2lzd2EsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBKdW1sYWggU2lzd2EgKERlbmdhbiBPdXRsaWVyKSIsDQogICAgICAgIHhsYWIgPSAiSnVtbGFoIFNpc3dhIiwNCiAgICAgICAgY29sID0gInNreWJsdWUiLA0KICAgICAgICBob3Jpem9udGFsID0gVFJVRSkNCmFibGluZSh2ID0gbWF4KGp1bWxhaF9zaXN3YSksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtb2R1cw0KdGV4dChtYXgoanVtbGFoX3Npc3dhKSwgMS4yLCBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzKSwgY29sID0gInJlZCIpICAjIFRhbWJhaGthbiB0ZWtzDQoNCiMgVmlzdWFsaXNhc2kgQm94cGxvdCAoVGFucGEgT3V0bGllcikNCmJveHBsb3QoanVtbGFoX3Npc3dhX25vX291dGxpZXIsDQogICAgICAgIG1haW4gPSAiQm94cGxvdCBKdW1sYWggU2lzd2EgKFRhbnBhIE91dGxpZXIpIiwNCiAgICAgICAgeGxhYiA9ICJKdW1sYWggU2lzd2EiLA0KICAgICAgICBjb2wgPSAibGlnaHRncmVlbiIsDQogICAgICAgIGhvcml6b250YWwgPSBUUlVFKQ0KYWJsaW5lKHYgPSBtYXgoanVtbGFoX3Npc3dhX25vX291dGxpZXIpLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikgICMgR2FyaXMgbW9kdXMNCnRleHQobWF4KGp1bWxhaF9zaXN3YV9ub19vdXRsaWVyKSwgMS4yLCBwYXN0ZSgiTW9kdXMgPSIsIG1vZHVzX25vX291dGxpZXIpLCBjb2wgPSAicmVkIikNCg0KIyBWaXN1YWxpc2FzaSBIaXN0b2dyYW0gKERlbmdhbiBPdXRsaWVyKQ0KaGlzdChqdW1sYWhfc2lzd2EsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIEp1bWxhaCBTaXN3YSAoRGVuZ2FuIE91dGxpZXIpIiwNCiAgICAgeGxhYiA9ICJKdW1sYWggU2lzd2EiLA0KICAgICBjb2wgPSAibGlnaHRibHVlIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWF4KGp1bWxhaF9zaXN3YSksIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKSAgIyBHYXJpcyBtb2R1cw0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IHBhc3RlKCJNb2R1cyA9IiwgbW9kdXMpLCBjb2wgPSAicmVkIiwgbHR5ID0gMiwgYnR5ID0gIm4iKQ0KDQojIFZpc3VhbGlzYXNpIEhpc3RvZ3JhbSAoVGFucGEgT3V0bGllcikNCmhpc3QoanVtbGFoX3Npc3dhX25vX291dGxpZXIsDQogICAgIG1haW4gPSAiSGlzdG9ncmFtIEp1bWxhaCBTaXN3YSAoVGFucGEgT3V0bGllcikiLA0KICAgICB4bGFiID0gIkp1bWxhaCBTaXN3YSIsDQogICAgIGNvbCA9ICJsaWdodGdyZWVuIiwNCiAgICAgYm9yZGVyID0gIndoaXRlIikNCmFibGluZSh2ID0gbWF4KGp1bWxhaF9zaXN3YV9ub19vdXRsaWVyKSwgY29sID0gInJlZCIsIGx3ZCA9IDIsIGx0eSA9IDIpICAjIEdhcmlzIG1vZHVzDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gcGFzdGUoIk1vZHVzID0iLCBtb2R1c19ub19vdXRsaWVyKSwgY29sID0gInJlZCIsIGx0eSA9IDIsIGJ0eSA9ICJuIikNCg0KDQpgYGANCg0KIyMjIyBNZW5naGl0dW5nIE1vZHVzOiANCg0KTW9kdXMgYWRhbGFoIE5pbGFpIEIsIGthcmVuYSAyMCBzaXN3YSBtZW5kYXBhdGthbiBuaWxhaSBpbmksIHlhbmcgbWVydXBha2FuIGp1bWxhaCB0ZXJiYW55YWsuDQoNCiMjIyMgS2VzaW1wdWxhbiANCg0KRGVuZ2FuIG1lbmdldGFodWkgYmFod2EgbmlsYWkgQiBhZGFsYWggeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCwgZ3VydSBkYXBhdCBtZW5nZXZhbHVhc2kgbGViaWggbGFuanV0IGtlbWFtcHVhbiBtZW51bGlzIHNpc3dhIGRhbiBtZW55ZXN1YWlrYW4gY2FyYSBwZW5nYWphcmFuIHVudHVrIG1lbmluZ2thdGthbiBrZXRlcmFtcGlsYW4gc2lzd2Eu