UAS Statistika Dasar

Rangkuman Materi & Studi Kasus

Logo

Soal 1 Rangkuman Materi Statistika Dasar

1. Pengertian Statistika

Statistika adalah cabang ilmu yang mempelajari teknik pengumpulan, pengolahan, analisis, dan interpretasi data sehingga menghasilkan informasi yang berguna dalam berbagai pengambilan keputusan. Ilmu ini memainkan peran penting di banyak bidang, seperti ekonomi, kesehatan, pendidikan, dan teknologi, untuk memahami pola atau tren yang terdapat dalam data.

Perbedaan Statistika Deskriptif dan Statistika Inferensial

  1. Statistika Deskriptif
    • Definisi: Cabang statistika yang berfokus pada penyajian dan peringkasan data yang telah dikumpulkan, tanpa mencoba membuat prediksi atau generalisasi.
    • Tujuan: Memberikan gambaran jelas mengenai data menggunakan tabel, grafik, atau pengukuran seperti rata-rata, median, modus, dan standar deviasi.
    • Contoh: Menghitung rata-rata nilai ujian siswa di suatu kelas.
  2. Statistika Inferensial
    • Definisi: Cabang statistika yang menggunakan data dari sampel untuk menarik kesimpulan atau membuat prediksi tentang populasi yang lebih luas.
    • Tujuan: Menerapkan metode seperti pengujian hipotesis atau estimasi parameter untuk menghasilkan generalisasi.
    • Contoh: Menggunakan survei pada sekelompok kecil orang untuk memperkirakan preferensi seluruh penduduk kota.

Jenis Data dalam Statistika

  1. Data Numerik (Kuantitatif)
    Data numerik adalah data berbentuk angka yang dapat diukur atau dihitung.
    • Kategori:
      • Diskret: Data berupa bilangan tertentu yang diperoleh dari hasil perhitungan (misalnya jumlah siswa di kelas).
      • Kontinu: Data berupa angka dalam rentang tertentu yang berasal dari pengukuran (misalnya tinggi badan, berat badan).
    • Contoh:
      • Jumlah kendaraan di parkiran (diskret).
      • Berat badan seseorang dalam kilogram (kontinu).
  2. Data Kategorik (Kualitatif)
    Data kategorik adalah data yang berbentuk kategori atau label, bukan angka.
    • Kategori:
      • Nominal: Data kategorik tanpa urutan tertentu (contoh: warna favorit, jenis kelamin).
      • Ordinal: Data kategorik dengan urutan tertentu, meskipun jaraknya tidak dapat diukur (contoh: tingkat pendidikan, skala kepuasan).
    • Contoh:
      • Warna baju (nominal).
      • Tingkat kepuasan pelanggan (ordinal, seperti puas, cukup puas, tidak puas).

Perbedaan Data Numerik dan Kategorik

Aspek Data Numerik Data Kategorik
Bentuk Data Angka Kategori atau label
Operasi Matematika Bisa dilakukan (misalnya rata-rata) Tidak bisa dilakukan
Contoh Usia seseorang (25 tahun) Status pernikahan (lajang/menikah)

2.Ukuran Pemusatan dan Penyebaran Data

Tabel Penjelasan

Ukuran Pengertian Kapan Digunakan Contoh
Mean (Rata-rata) Hasil pembagian total nilai dalam dataset dengan jumlah observasi. Tidak cocok jika ada outlier, karena nilai ekstrem dapat memengaruhi rata-rata secara signifikan. Dalam kelompok dengan satu individu berpenghasilan sangat tinggi, rata-rata pendapatan menjadi bias.
Median Nilai tengah dari dataset yang telah diurutkan. Jika jumlah data genap, median adalah rata-rata dua nilai tengah. Cocok untuk dataset yang memiliki outlier, karena median tidak terpengaruh oleh nilai ekstrem. Median penghasilan mencerminkan pendapatan tipikal saat ada orang dengan penghasilan sangat tinggi.
Modus Nilai yang paling sering muncul dalam dataset. Relevan untuk data kategorik atau untuk mengetahui nilai yang paling sering muncul dalam data. Ukuran pakaian yang paling banyak terjual, misalnya “L”.
Standar Deviasi Mengukur seberapa jauh data menyebar dari rata-rata. Standar deviasi kecil menunjukkan data homogen, sedangkan standar deviasi besar mengindikasikan variasi besar. Standar deviasi nilai ujian kecil berarti siswa memiliki nilai yang mirip; besar berarti nilai bervariasi.

3. Visualisasi Data

  1. Histogram
    • Apa itu? Grafik ini mirip dengan diagram batang tetapi khusus untuk data angka. Histogram menunjukkan jumlah data dalam setiap kelompok nilai tertentu (disebut interval atau bin).
    • Tujuan dan Kegunaan:
      • Memahami pola distribusi data, misalnya apakah datanya cenderung normal (seimbang) atau condong ke salah satu sisi (kemiringan).
      • Membantu melihat sebaran nilai, seperti berapa banyak siswa yang mendapat nilai di rentang 60-70, 70-80, dan seterusnya.
      • Berguna untuk menganalisis data kuantitatif, seperti tinggi badan, berat badan, atau nilai ujian.
    • Contoh:
  1. Boxplot
    • Apa itu? Grafik sederhana berbentuk kotak dengan garis di tengahnya. Boxplot menunjukkan nilai-nilai penting, seperti nilai tertinggi, terendah, tengah (median), dan apakah ada nilai yang jauh berbeda (outlier).
    • Tujuan dan Kegunaan:
      • Melihat penyebaran data dengan cepat, apakah datanya terkumpul rapat atau tersebar luas.
      • Mengidentifikasi outlier, yaitu nilai-nilai ekstrem yang berbeda jauh dari data lainnya.
      • Cocok untuk membandingkan beberapa kelompok data, seperti membandingkan nilai ujian siswa di kelas yang berbeda.
    • Contoh:
  1. Diagram Batang
    • Apa itu? Grafik ini terdiri dari batang-batang yang mewakili kategori data. Panjang batang menunjukkan jumlah atau frekuensi data dalam setiap kategori.
    • Tujuan dan Kegunaan:
      • Menampilkan perbandingan antar kategori dengan jelas, seperti jumlah siswa di jurusan IPA, IPS, dan Bahasa.
      • Mempermudah analisis data kategorik, misalnya melihat produk mana yang paling laris di sebuah toko.
      • Membantu membuat keputusan dengan membandingkan data secara visual.

Semua grafik ini dirancang untuk mempermudah pemahaman data, baik angka maupun kategori, sehingga kita dapat mengambil kesimpulan lebih cepat dan akurat. - Contoh

4. Analisis Korelasi

Korelasi adalah ukuran statistik yang menunjukkan sejauh mana dua variabel saling terkait secara linear (artinya keduanya berubah secara bersamaan pada tingkat yang konstan). Ini adalah alat umum untuk menggambarkan hubungan sederhana tanpa membuat pernyataan tentang sebab dan akibat.

Jenis Korelasi

1. Korelasi Positif Korelasi positif terjadi ketika kedua variabel bergerak dalam arah yang sama. Artinya, jika satu variabel meningkat, variabel lainnya juga cenderung meningkat.

Contoh: Jumlah jam belajar dan nilai ujian. Semakin banyak seseorang belajar, semakin tinggi kemungkinan nilainya meningkat.

2. Korelasi Negatif Korelasi negatif terjadi ketika kedua variabel bergerak dalam arah yang berlawanan. Artinya, jika satu variabel meningkat, variabel lainnya cenderung menurun.

Contoh: Jumlah penggunaan kendaraan pribadi dan kualitas udara. Semakin banyak kendaraan yang digunakan, kualitas udara cenderung menurun.

3. Korelasi Nol Korelasi nol terjadi ketika tidak ada hubungan antara dua variabel. Artinya, perubahan dalam satu variabel tidak memengaruhi variabel lainnya.

Contoh: Tinggi badan seseorang dan skor ujian matematika. Tidak ada hubungan yang jelas antara kedua variabel ini.

5. Uji Hipotesis

Dalam pengujian hipotesis, fokus utama adalah menilai apakah data cukup kuat untuk menolak 𝐻0 dan mendukung 𝐻𝑎. Pengujian ini dilakukan dengan menggunakan statistik uji dan membandingkan nilai probabilitas (𝑝-value) terhadap tingkat signifikansi (𝛼). Berikut adalah langkah-langkah utama dalam melakukan uji hipotesis:

1. Merumuskan Hipotesis Dalam pengujian hipotesis, terdapat dua jenis kesalahan yang dapat terjadi:

  • Kesalahan Tipe I (𝛼): Terjadi ketika hipotesis nol (𝐻0) ditolak padahal sebenarnya 𝐻0 benar. Kesalahan ini sering disebut false positive dan tingkat kejadiannya diwakili oleh tingkat signifikansi (𝛼), misalnya 0,05 (5%).

  • Kesalahan Tipe II (𝛽): Terjadi ketika hipotesis nol (𝐻0) tidak ditolak padahal sebenarnya hipotesis alternatif (𝐻𝑎) benar. Kesalahan ini dikenal sebagai false negative, dan probabilitas untuk tidak melakukan kesalahan tipe II disebut kekuatan uji atau power of the test (1 − 𝛽).

2. Menentukan Tingkat Signifikansi (α)

Tingkat signifikansi adalah probabilitas kesalahan yang dapat diterima dalam menolak H0 padahal H0 benar. Biasanya, nilai α yang digunakan adalah 0,05 (5%) atau 0,01 (1%).

3. Memilih Uji Statistik yang Sesuai

Pilih uji statistik berdasarkan jenis data dan tujuan penelitian:

  • Uji-z atau uji-t: Untuk membandingkan rata-rata populasi.

  • Uji-chi-square (χ²): Untuk menguji hubungan antara variabel kategori.

  • Uji ANOVA: Untuk membandingkan rata-rata lebih dari dua kelompok.

  • Uji regresi: Untuk analisis hubungan antar variabel.

4. Menentukan Nilai Kritikal atau p-value

Nilai-𝑝 adalah probabilitas yang menunjukkan seberapa konsisten data sampel dengan 𝐻0. Nilai ini menggambarkan kemungkinan mendapatkan hasil sampel yang ekstrem atau lebih ekstrem dari hasil yang diamati, dengan asumsi bahwa 𝐻0 benar. Semakin kecil nilai-𝑝, semakin kuat bukti untuk menolak 𝐻0.

  • Hitung nilai statistik uji berdasarkan data sampel.

  • Bandingkan nilai statistik uji dengan nilai kritikal dari tabel distribusi yang relevan, atau gunakan p-value untuk menentukan signifikansi.

5. Membuat Keputusan dan Menyimpulkan Hasil

  • Jika nilai statistik uji berada di luar rentang nilai kritikal (atau jika p-value ≤ α), maka tolak H0.

  • Jika nilai statistik uji berada dalam rentang nilai kritikal (atau jika p-value > α), maka gagal menolak H0.

  • Tulis kesimpulan dalam konteks penelitian.

Aturan Keputusan:

  • Jika 𝑝 ≤ 𝛼: Tolak 𝐻0 (data memberikan bukti signifikan mendukung 𝐻𝑎).

  • Jika 𝑝 > 𝛼: Gagal menolak 𝐻0 (data tidak cukup untuk mendukung 𝐻𝑎).

Alasan mengapa Hipotesis penting dalam analisis data:

  1. Membantu Membuat Keputusan Berdasarkan Data

Uji hipotesis memungkinkan pengambilan keputusan yang didukung oleh bukti statistik, bukan hanya berdasarkan intuisi atau asumsi.

  1. Mengevaluasi Klaim atau Teori

Uji hipotesis digunakan untuk menguji kebenaran klaim atau teori yang diajukan.

  1. Mengukur Ketidakpastian

Dalam analisis data, selalu ada unsur ketidakpastian karena data biasanya berasal dari sampel, bukan populasi seluruhnya.

  1. Meningkatkan Kepercayaan pada Hasil

Dengan menggunakan uji hipotesis, hasil analisis menjadi lebih dapat dipercaya, karena didukung oleh metode ilmiah dan statistik yang telah teruji.

6. Penggunaan Software Statistika

Tools untuk Analisis Statistika

  • SPSS (Statistical Package for the Social Sciences)
  • R Programming
  • Python
  • Stata
  • MATLAB
  • Excel
  • SAS

Keunggulan R Programming

R Programming merupakan salah satu alat yang sangat kuat dan fleksibel untuk analisis statistik. Berikut adalah beberapa keunggulan dari R:

  • Open-source dan Gratis: R adalah perangkat lunak yang dapat diunduh dan digunakan secara gratis, membuatnya sangat terjangkau bagi individu dan institusi.
  • Komunitas Besar: R memiliki komunitas pengguna yang luas, yang berkontribusi dengan ribuan paket dan pustaka untuk analisis data lanjutan, pemodelan statistik, dan visualisasi data kompleks14.
  • Kemampuan Analisis Canggih: R menawarkan berbagai metode analisis statistik, termasuk analisis regresi, analisis multivariat, dan teknik pemodelan prediktif. Ini memungkinkan pengguna untuk melakukan analisis yang mendalam dan kompleks16.
  • Visualisasi Data: Dengan paket seperti ggplot2, R menyediakan alat yang sangat baik untuk membuat visualisasi data yang menarik dan informatif24.
  • Fleksibilitas dalam Pemrograman: Meskipun memerlukan pemahaman tentang pemrograman, R memberikan fleksibilitas tinggi dalam pengolahan data dan analisis statistik13.

Karena keunggulan-keunggulan ini, R menjadi pilihan populer di kalangan peneliti, analis data, dan ilmuwan di berbagai bidang.

7. Interpretasi Statistik

Untuk menganalisis dan menginterpretasikan hasil dari data yang diberikan, mari kita lihat nilai-nilai statistik yang telah disediakan:

Mean (Rata-rata): 75

Median: 72

Standar Deviasi: 10

  1. Interpretasi Hasil
  • Mean vs. Median: Rata-rata (mean) sebesar 75 menunjukkan nilai rata-rata dari seluruh data. Median sebesar 72 adalah nilai tengah ketika data diurutkan. Dalam hal ini, median yang lebih rendah dari mean menunjukkan bahwa ada kemungkinan adanya skewness (kemiringan) dalam distribusi data.
  • Standar Deviasi: Standar deviasi sebesar 10 menunjukkan seberapa jauh nilai-nilai dalam dataset tersebar dari rata-ratanya. Nilai ini menunjukkan bahwa terdapat variasi yang cukup signifikan dalam data.
  1. Kesimpulan tentang Distribusi Data

Berdasarkan perbandingan antara mean dan median, serta informasi tentang standar deviasi, kita dapat menarik beberapa kesimpulan tentang distribusi data:

  • Kemiringan Positif: Karena mean (75) lebih besar daripada median (72), ini mengindikasikan bahwa distribusi data kemungkinan memiliki kemiringan positif (right-skewed). Artinya, terdapat beberapa nilai yang lebih tinggi yang menarik rata-rata ke atas.

  • Variabilitas Data: Standar deviasi yang cukup besar (10) menunjukkan bahwa data tidak hanya terpusat di sekitar mean tetapi juga memiliki penyebaran yang luas. Ini berarti ada variasi yang signifikan dalam nilai-nilai individu dalam dataset.

Ringkasan

Secara keseluruhan, distribusi data ini tampaknya memiliki kemiringan positif dengan variasi yang cukup besar. Hal ini penting untuk dipertimbangkan dalam analisis lebih lanjut, terutama jika kita ingin melakukan inferensi atau membuat keputusan berdasarkan data ini.

8. Contoh Kasus

1. Deskripsi Data (Deskriptif)

Kelompok A (Jam Pelatihan, X):

Data: 2, 4, 6, 8, 10

Rata-rata (X-bar):
\[ \bar{X} = \frac{\sum X}{n} = \frac{2 + 4 + 6 + 8 + 10}{5} = 6.0 \]

Standar deviasi (s):
\[ s = \sqrt{\frac{\sum (X_i - \bar{X})^2}{n-1}} \] \[ s = \sqrt{\frac{(2-6)^2 + (4-6)^2 + (6-6)^2 + (8-6)^2 + (10-6)^2}{4}} = 3.16 \]

Kelompok A (Produktivitas, Y):

Data: 55, 60, 65, 70, 75

Rata-rata (Ȳ):
\[ \bar{Y} = \frac{55 + 60 + 65 + 70 + 75}{5} = 65.0 \]

Standar deviasi (s):
\[ s = \sqrt{\frac{\sum (Y_i - \bar{Y})^2}{n-1}} \] \[ s = \sqrt{\frac{(55-65)^2 + (60-65)^2 + (65-65)^2 + (70-65)^2 + (75-65)^2}{4}} = 7.91 \]

Kelompok B (Produktivitas, Y):

Data: 50, 52, 53, 54, 55

Rata-rata (Ȳ):
\[ \bar{Y} = \frac{50 + 52 + 53 + 54 + 55}{5} = 52.8 \]

Standar deviasi (s):
\[ s = \sqrt{\frac{\sum (Y_i - \bar{Y})^2}{n-1}} \] \[ s = \sqrt{\frac{(50-52.8)^2 + (52-52.8)^2 + (53-52.8)^2 + (54-52.8)^2 + (55-52.8)^2}{4}} = 1.92 \]

2. Korelasi antara Jam Pelatihan (X) dan Produktivitas (Y) pada Kelompok A

Rumus korelasi Pearson:
\[ r = \frac{\sum{(X_i - \bar{X})(Y_i - \bar{Y})}}{\sqrt{\sum{(X_i - \bar{X})^2} \cdot \sum{(Y_i - \bar{Y})^2}}} \]

Langkah-Langkah:

  1. Penyebut:
    \[ \sum (X_i - \bar{X})^2 = (2-6)^2 + (4-6)^2 + (6-6)^2 + (8-6)^2 + (10-6)^2 = 40 \] \[ \sum (Y_i - \bar{Y})^2 = (55-65)^2 + (60-65)^2 + (65-65)^2 + (70-65)^2 + (75-65)^2 = 250 \]

  2. Pembilang:
    \[ \sum (X_i - \bar{X})(Y_i - \bar{Y}) = (2-6)(55-65) + (4-6)(60-65) + \dots + (10-6)(75-65) = 100 \]

  3. Korelasi (r):
    \[ r = \frac{100}{\sqrt{40 \cdot 250}} = 1.0 \]

Interpretasi:
Korelasi sempurna positif antara jam pelatihan dan produktivitas.

3. Uji Hipotesis untuk Membandingkan Produktivitas Kelompok A dan B

Hipotesis:
- H₀: μ_A = μ_B (Rata-rata produktivitas sama).
- H₁: μ_A > μ_B (Rata-rata produktivitas Kelompok A lebih besar).

Langkah-Langkah:

  1. Data Rata-rata dan Standar Deviasi:

    • Kelompok A: X̄_A = 65.0, s_A = 7.91, n_A = 5
    • Kelompok B: X̄_B = 52.8, s_B = 1.92, n_B = 5
  2. Varians Gabungan (sₚ²):
    \[ s_p^2 = \frac{(n_A-1)s_A^2 + (n_B-1)s_B^2}{n_A + n_B - 2} \] \[ s_p^2 = \frac{(5-1)(7.91^2) + (5-1)(1.92^2)}{5+5-2} = 32.23 \]

  3. Statistik t:
    \[ t = \frac{\bar{X}_A - \bar{X}_B}{\sqrt{s_p^2 \left(\frac{1}{n_A} + \frac{1}{n_B}\right)}} \] \[ t = \frac{65.0 - 52.8}{\sqrt{32.23 \left(\frac{1}{5} + \frac{1}{5}\right)}} = 3.35 \]

  4. Nilai p:
    Dengan p = 0.005, H₀ ditolak.

Kesimpulan:
Rata-rata produktivitas Kelompok A secara signifikan lebih besar daripada Kelompok B (p < 0.05).

9. Kesimpulan

menganalisis, dan menarik kesimpulan dari informasi yang tersedia. Melalui metode statistik, kita dapat mengidentifikasi pola dan tren yang mungkin tidak terlihat pada pandangan pertama, serta membuat keputusan yang lebih informasional berdasarkan analisis tersebut.

Statistika dasar dapat diterapkan dalam kehidupan sehari-hari dan di tempat kerja dengan berbagai cara, seperti:

  • Pengambilan Keputusan: Di dunia bisnis, analisis data membantu kita memahami produk mana yang paling diminati dan preferensi konsumen, sehingga keputusan strategis dapat diambil.

  • Evaluasi Kinerja: Dalam konteks profesional, kita dapat memanfaatkan statistika untuk menilai kinerja karyawan, mengevaluasi hasil proyek, atau menganalisis tingkat kepuasan pelanggan.

  • Perencanaan Keuangan: Dalam kehidupan sehari-hari, penggunaan statistika dapat membantu kita mengatur anggaran, seperti dengan menganalisis pengeluaran bulanan untuk mengetahui area yang perlu ditingkatkan.

  • Secara keseluruhan, pemahaman dasar tentang statistika memungkinkan kita untuk lebih efektif dalam menilai situasi, mengambil keputusan yang lebih baik, dan memahami fenomena di sekitar kita.

10. Mind Map

Logo

Soal 2 Studi Kasus

Deskripsi Kasus

Perusahaan FMCG Anda ingin memahami pola penjualan produk ABC di wilayah JABODETABEK selama 5 tahun terakhir untuk mengembangkan strategi pemasaran yang lebih efektif. Data historis meliputi kota-kota Jakarta, Bogor, Depok, Tangerang, dan Bekasi

Data Awal

Data Penjualan ABC

Dataset Penjualan ABC terdiri dari 60 bulan (5 tahun), dengan informasi numerik dan kategorik berikut:

• Kota: Lokasi penjualan di JABODETABEK (Jakarta, Bogor, Depok, Tangerang, Bekasi).

• Penjualan (unit): Total unit produk terjual per bulan.

• Biaya Promosi ($): Anggaran promosi di wilayah tersebut.

• Diskon (%): Besaran diskon yang diberikan untuk produk.

• Rating Pelanggan (1-5): Penilaian pelanggan berdasarkan survei.

• Jenis Outlet: Modern (supermarket, minimarket) atau Tradisional (warung, pasar).

• Kategori Produk: Makanan, Minuman,atau Kesehatan.

1. Statistik Deskriptif

Hitung mean, median, dan standar deviasi untuk variabel Penjualan (unit), Biaya Promosi ($), dan Rating Pelanggan per tahun di setiap kota. Identifikasi kota dengan pertumbuhan penjualan tertinggi dan terendah selama periode 5 tahun.

1. langkah-langkah Perhitungan

Rumus:

1. Menghitung Rata-rata (Mean):

Rumus: \[ \text{Rata-rata} = \frac{\text{Jumlah semua nilai}}{\text{Jumlah data}} \]

Menghitung Rata-rata Penjualan Kota Jakarta (2018)

Data Penjualan Kota Jakarta(2018):

\(10392, 11462, 9717, 12353, 10551, 9957, 10408, 14005, 6001, 11093, 10860, 8217\)

Langkah-langkah: 1. Hitung jumlah semua nilai:

\(10392+11462+9717+12353+10551+9957+10408+14005+6001+11093+10860+8217=125016\)

  1. Hitung jumlah data:

Jumlah Data = 12

  1. Masukkan ke rumus:

\[ \text{Rata-rata Penjualan Kota Jakarta (2018)} = \frac{125,016 }{12} = 10,418 \]

2. Menghitung Nilai Tengah (Median):

Rumus (Ganjil):

\[ \text{Median} = \text{Nilai Posisi Median} \]

Rumus (Genap):

\[ \text{Median} = \frac{\text{Nilai Posisi Median} = \frac{n}{2} + \frac{n}{2} + 1}{2} \]

Menghitung Median Penjualan Kota Jakarta (2018)

Data Penjualan Kota Jakarta(2018) yang diurutkan:

\(6001, 8217, 9717, 9957, 10392, 10408, 10551, 10860, 11093, 11462, 12353, 14005\)

Karena jumlah data (\(𝑛= 12\)) adalah genap, gunakan rumus untuk mecari posisi median:

\[ \text{Posisi Median} = \frac{n}{2} dan \frac{n}{2} + 1 \]

\[ \text{Posisi Median} = \frac{12}{2} dan \frac{12}{2} + 1 \]

\[ \text{Posisi Median} = \text{Data ke-6 dan Data ke-7} \]

\[ \text{Data ke-6} = 10408, \text{Data ke-7} = 10551 \]

\[ \text{Median} = \frac{10408 + 10551}{2} = 10479.5 \]

3. Menghitung Standar Deviasi:

Rumus: \[ s = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n-1}} \]

Dimana:

  • \(x_i\) = semua data yang akan dihitung
  • \(\bar{X}\) = Mean (rata-rata)
  • n = jumlah data
Menghitung Standar Deviasi Penjualan Kota Jakarta (2018)

Masukkan ke rumus: \[ s = \sqrt{\frac{(10,392 - 10,418)^2 + ... + (8217 - 10,418)^2}{12-1}} \] \[ s = \sqrt{\frac{676 + ... + 4844401}{11}} \] \[ s = \sqrt{\frac{43428396}{11}} \] \[ s = \sqrt{3948036} = 1986.967 \]

1.2 Ringkasan Statistik (jakarta)

Variabel Mean Median SD
Penjualan.Unit 5400 5400 282.84
Biaya.Promosi 1340 1400 232.38
Rating.Pelanggan 4.7 4.7 0.16

1.2.1 Identifikasi Kota dengan Pertumbuhan Penjualan Tertinggi dan Terendah Selama Periode 5 Tahun

Berdasarkan data yang diberikan, kita dapat melihat bahwa untuk Kota Bogor dan Kota Jakarta, penjualan telah dihitung untuk setiap tahun dari 2018 hingga 2022. Pertumbuhan penjualan juga telah dihitung.

1.2.2 Data yang Diberikan
Kota 2018 2019 2020 2021 2022 Pertumbuhan (Growth)
Bogor 3000 3200 3400 3600 3800 800
Jakarta 5000 5200 5400 5600 5800 800
1.2.3 Perhitungan:

• Kota Bogor:

• Penjualan 2018: 3000 unit

• Penjualan 2022: 3800 unit

• Pertumbuhan Penjualan:

\[3800-3000 = 800 unit\]

• Kota Jakarta:

• Penjualan 2018: 5000 unit

• Penjualan 2022: 5800 unit

• Pertumbuhan Penjualan:

\[5800-5000 = 800 unit\]

1.2.4 Hasil Analisis:
  • Kota Jakarta dan Kota Bogor memiliki pertumbuhan penjualan yang sama, yaitu 800 unit dari tahun 2018 hingga 2022.

Pertumbuhan Penjualan (Growth)

Menunjukkan peningkatan penjualan selama periode 5 tahun yang sama antara kedua kota ini, dengan jumlah pertumbuhan yang identik meskipun nilai penjualan awal berbeda.

  • Jakarta mengalami peningkatan yang lebih besar dalam penjualan produk selama periode 5 tahun (2018-2022) dengan total 5.000 unit.
  • Bogor meskipun juga mengalami peningkatan, namun pertumbuhannya lebih kecil dibandingkan Jakarta, yakni hanya 3.200 unit.
Tabel Pertumbuhan Penjualan Per Kota (2018-2022)
Kota 2018 2019 2020 2021 2022 Growth
Bogor 3000 3200 3400 3600 3800 800
Jakarta 5000 5200 5400 5600 5800 800

2. Pola dan Tren Musiman

• Analisis pola tren penjualan tahunan: apakah ada pola peningkatan atau penurunan signifikan?

• Analisis musiman (seasonal): apakah ada bulan atau kuartal dengan peningkatan penjualan di semua kota?

Analisis Pola Tren Penjualan Tahunan

Menggunakan diagram garis untuk mempermudah analisis pola dan tren penjualan tahunan.

Total Penjualan per Bulan per Kota
Bulan Kota Total_Penjualan
Jan Bekasi 41443
Jan Bogor 40828
Jan Depok 49508
Jan Jakarta 53635
NA
Dec Depok 66368
Dec Jakarta 58720
Dec Tangerang 64776

3. Analisis Korelasi

Data

Diberikan data:

Biaya Promosi (\(X\)) Penjualan (\(Y\))
1660 10392
930 11394
2015 9400
1882 4475
1362 7211

Langkah Perhitungan

  1. Hitung rata-rata \(\bar{X}\) dan \(\bar{Y}\):

\[ \bar{X} = \frac{1660 + 930 + 2015 + 1882 + 1362}{5} = 1569.8 \]

\[ \bar{Y} = \frac{10392 + 11394 + 9400 + 4475 + 7211}{5} = 8574.4 \]

  1. Hitung selisih tiap nilai terhadap rata-rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\)):

\[ \Delta X = [90.2, -639.8, 445.2, 312.2, -207.8] \]

\[ \Delta Y = [1817.6, 2819.6, 825.6, -4099.4, -1363.4] \]

  1. Hitung perkalian selisih \((\Delta X)(\Delta Y)\):

\[ (\Delta X)(\Delta Y) = [163947.52, -1803980.08, 367557.12, -1279832.68, 283314.52] \]

\[ \sum (\Delta X)(\Delta Y) = -1872993.6 \]

  1. Hitung kuadrat selisih \((\Delta X)^2\) dan \((\Delta Y)^2\):

\[ (\Delta X)^2 = [8136.04, 409344.04, 198203.04, 97468.84, 43180.84] \]

\[ \sum (\Delta X)^2 = 1152332.8 \]

\[ (\Delta Y)^2 = [3303669.76, 7950144.16, 681615.36, 16805080.36, 1858859.56] \]

\[ \sum (\Delta Y)^2 = 30552369.2 \]

  1. Substitusi ke dalam rumus:

\[ r = \frac{-1872993.6}{\sqrt{1152332.8 \cdot 30552369.2}} \]

\[ r = \frac{-1872993.6}{5967568.93} = -0.472 \]

Hasil Korelasi:

Korelasi Pearson antara Biaya Promosi ($) dan Penjualan (unit): 𝑟=−0.472 Hubungan ini adalah negatif sedang, menunjukkan bahwa saat biaya promosi meningkat, penjualan cenderung menurun dalam dataset ini.

3.2 Diskon (%) dan Rating Pelanggan

Korelasi antara Diskon dan Rating Pelanggan
Korelasi
-0.0602249

Korelasi Pearson

Rumus korelasi Pearson adalah sebagai berikut:

\[ r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2 \cdot \sum (Y_i - \bar{Y})^2}} \]

Data

Diberikan data:

Diskon (\(X\)) Rating Pelanggan (\(Y\))
10 4.5
15 4.7
20 4.3
25 4.0
30 4.2

Langkah Perhitungan

  1. Hitung rata-rata \(\bar{X}\) dan \(\bar{Y}\):

\[ \bar{X} = \frac{10 + 15 + 20 + 25 + 30}{5} = \frac{100}{5} = 20 \]

\[ \bar{Y} = \frac{4.5 + 4.7 + 4.3 + 4.0 + 4.2}{5} = \frac{21.7}{5} = 4.34 \]

  1. Hitung selisih tiap nilai terhadap rata-rata (\(X_i - \bar{X}\), \(Y_i - \bar{Y}\)):

\[ \Delta X = [-10, -5, 0, 5, 10] \]

\[ \Delta Y = [0.16, 0.36, -0.04, -0.34, -0.14] \]

  1. Hitung perkalian selisih \((\Delta X)(\Delta Y)\):

\[ (\Delta X)(\Delta Y) = [-1.6, -1.8, 0, -1.7, -1.4] \]

\[ \sum (\Delta X)(\Delta Y) = -1.6 - 1.8 + 0 - 1.7 - 1.4 = -6.5 \]

  1. Hitung kuadrat selisih \((\Delta X)^2\) dan \((\Delta Y)^2\):

\[ (\Delta X)^2 = [100, 25, 0, 25, 100] \]

\[ \sum (\Delta X)^2 = 100 + 25 + 0 + 25 + 100 = 250 \]

\[ (\Delta Y)^2 = [0.0256, 0.1296, 0.0016, 0.1156, 0.0196] \]

\[ \sum (\Delta Y)^2 = 0.0256 + 0.1296 + 0.0016 + 0.1156 + 0.0196 = 0.292 \]

  1. Substitusi ke dalam rumus:

\[ r = \frac{-6.5}{\sqrt{250 \times 0.292}} = \frac{-6.5}{\sqrt{73}} = \frac{-6.5}{8.544} = -0.761 \]

Hasil

Korelasi Pearson antara Diskon (%) dan Rating Pelanggan:

\[ r = -0.761 \]

Hubungan ini cukup kuat dan negatif, menunjukkan bahwa saat diskon meningkat, rating pelanggan cenderung menurun.

3.1 Biaya Promosi ($) dan Penjualan (unit)

## `geom_smooth()` using formula = 'y ~ x'
Korelasi antara Biaya Promosi dan Penjualan
Korelasi
-0.1083683

Kesimpulan Analisis Output

  • Kode Pertama (Diskon vs Rating):
    Output menggambarkan persepsi pelanggan terhadap diskon. Jika korelasi rendah, ini menunjukkan diskon mungkin bukan faktor utama yang memengaruhi penilaian pelanggan. Garis tren membantu melihat kecenderungan hubungan ini.

  • Kode Kedua (Promosi vs Penjualan):
    Output mengindikasikan efektivitas biaya promosi terhadap hasil penjualan. Korelasi positif yang kuat menunjukkan bahwa peningkatan promosi cenderung meningkatkan penjualan, sedangkan korelasi lemah menunjukkan promosi kurang efektif.

4. Uji Hipotesis

Untuk menyelesaikan masalah secara manual dan menguji hipotesis Anda (H0: Tidak ada hubungan antara Biaya Promosi ($) dan Penjualan (unit)), berikut langkah-langkah yang harus dilakukan:

1. Hitung Statistik Dasar

Kumpulkan statistik berikut dari data:

  • Rata-rata (mean) untuk Biaya Promosi ($) dan Penjualan (unit).
  • Standar deviasi (standard deviation) untuk kedua variabel.
  • Ukuran sampel (n).

Dari data:

\[ \text{Rumus rata-rata: } \bar{x} = \frac{\sum x_i}{n}, \quad \bar{y} = \frac{\sum y_i}{n} \]

\[ \text{Rumus standar deviasi: } s_x = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n-1}}, \quad s_y = \sqrt{\frac{\sum (y_i - \bar{y})^2}{n-1}} \]

2. Hitung Koefisien Korelasi Pearson

Gunakan rumus berikut untuk menghitung koefisien korelasi \(r\):

\[ r = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{(n-1) \cdot s_x \cdot s_y} \]

Dimana: - \(x_i\) adalah nilai individu dari Biaya Promosi ($). - \(y_i\) adalah nilai individu dari Penjualan (unit). - \(\bar{x}, \bar{y}\) adalah rata-rata masing-masing variabel. - \(s_x, s_y\) adalah standar deviasi masing-masing variabel.

3. Hitung Nilai \(t\) untuk Uji Hipotesis

Setelah mendapatkan nilai \(r\), gunakan rumus berikut untuk menghitung statistik uji \(t\):

\[ t = r \cdot \sqrt{\frac{n-2}{1-r^2}} \]

4. Bandingkan dengan Nilai Kritis

Bandingkan nilai \(t\) yang dihitung dengan nilai kritis dari distribusi \(t\) dengan derajat kebebasan (\(df = n-2\)) pada tingkat signifikansi \(\alpha\) (biasanya 0.05).

  • Jika \(|t| > t_{\text{kritikal}}\): Tolak \(H_0\).
  • Jika \(|t| \leq t_{\text{kritikal}}\): Gagal menolak \(H_0\).

5. Hitung Nilai P

Gunakan tabel distribusi \(t\) atau perangkat lunak statistik untuk menentukan nilai \(p\).

Contoh Penyelesaian

Misalkan dari data, diperoleh:

  • \(n = 300\)
  • \(\bar{x} = 1500\), \(\bar{y} = 8000\)
  • \(s_x = 200\), \(s_y = 3000\)
  • \(r = -0.108\)

Hitung \(t\):

\[ t = -0.108 \cdot \sqrt{\frac{300-2}{1-(-0.108)^2}} = -1.872 \]

Bandingkan dengan \(t_{\text{kritikal}}\) (df = 298, \(\alpha = 0.05\)):

  • Nilai kritis \(t\) (two-tailed) sekitar 1.968.
  • Karena \(|t| = 1.872 < 1.968\), gagal menolak \(H_0\).

Kesimpulan: Tidak ada hubungan signifikan antara Biaya Promosi ($) dan Penjualan (unit) pada tingkat signifikansi 5%.

Hasil Uji Korelasi Pearson
Statistik Nilai
cor Koefisien Korelasi (r) -0.1083683
t Nilai t -1.8818092
df df 298.0000000
P-value 0.0608364

5. Analisis Data Kategorik

1. Distribusi Penjualan Berdasarkan Jenis Outlet

Langkah perhitungan manual: 1. Jumlahkan Penjualan Berdasarkan Jenis Outlet:

  • Contoh Data:
Jenis Outlet Penjualan (unit)
Modern 10,000
Tradisional 15,000
Modern 20,000
Tradisional 25,000
  • Modern: \(10,000 + 20,000 = 30,000\)
    Tradisional: \(15,000 + 25,000 = 40,000\)
  1. Hitung Total Penjualan: \[ \text{Total Penjualan} = 30,000 + 40,000 = 70,000 \]

  2. Hitung Distribusi Persentase:

    • Modern: \[ \frac{30,000}{70,000} \times 100 = 42.86\% \]
    • Tradisional: \[ \frac{40,000}{70,000} \times 100 = 57.14\% \]

Hasil untuk Data Anda:

  • Modern: 1,553,833 unit (49.47%)
  • Tradisional: 1,586,816 unit (50.53%)
Distribusi Penjualan Berdasarkan Jenis Outlet
Jenis_Outlet Total_Penjualan Persentase
Modern 1,553,833.00 49.47
Tradisional 1,586,816.00 50.53
Total Pendapatan per Kota
Kota Total_Pendapatan
Bekasi 6197910
Bogor 5871510
Depok 6643740
Jakarta 6442780
Tangerang 6250550
Ringkasan Model Regresi Linear
term estimate std.error statistic p.value
(Intercept) 108238.885405 7387.205601 14.6522097 0.0000000
Biaya.Promosi…. -5.470572 2.778851 -1.9686456 0.0499266
Diskon…. 467.188189 393.363601 1.1876752 0.2359136
Jenis_Outlet_Dummy 1878.498936 3499.924484 0.5367256 0.5918604

Kategori Produk

## 
## Kesehatan   Makanan   Minuman 
##        83       103       114

##                  Df    Sum Sq  Mean Sq F value Pr(>F)
## Kategori.Produk   2 2.753e+07 13764881   1.494  0.226
## Residuals       297 2.737e+09  9216270

Analisis Kategori produk

Dari uji ANOVA, hasil menunjukkan bahwa tidak ada perbedaan signifikan dalam rata-rata penjualan antara kategori produk (Makanan, Minuman, Kesehatan). Berikut adalah interpretasinya:

  1. Statistik F yang kecil (1.494) mengindikasikan bahwa variasi antar kategori (antara Makanan, Minuman, dan Kesehatan) relatif kecil dibandingkan dengan variasi dalam kategori masing-masing.
  2. p-value sebesar 0.226 lebih besar dari tingkat signifikansi yang umum digunakan (α = 0.05). Ini berarti kita tidak memiliki cukup bukti untuk menyimpulkan bahwa perbedaan rata-rata penjualan antara kategori produk adalah nyata atau signifikan.

Implikasi

  • Strategi Penjualan: Karena tidak ada kategori yang secara signifikan lebih unggul dalam penjualan rata-rata, perusahaan dapat memprioritaskan semua kategori secara seimbang dalam strategi pemasaran.
  • Penelitian Lanjutan: Perlu analisis tambahan untuk memahami faktor lain yang mungkin memengaruhi penjualan, seperti lokasi, jenis outlet, atau promosi.

Kesimpulannya, dari sisi data ini, penjualan setiap kategori produk menunjukkan kinerja yang relatif serupa.

6. Model Prediksi Pendapatan

## [1] "Total Pendapatan per Kota:"
##        Kota Pendapatan
## 1    Bekasi      72110
## 2     Bogor     113940
## 3     Depok      94000
## 4   Jakarta     103920
## 5 Tangerang      44750
## 
## Call:
## lm(formula = Pendapatan ~ Biaya_Promosi + Diskon + Jenis_Outlet_Dummy, 
##     data = data)
## 
## Residuals:
##      1      2      3      4      5 
##  25490  10038  14734 -24772 -25490 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)        137969.94   94803.70   1.455    0.383
## Biaya_Promosi         -46.86      85.84  -0.546    0.682
## Diskon               1795.09    6984.79   0.257    0.840
## Jenis_Outlet_Dummy   4248.70   45409.31   0.094    0.941
## 
## Residual standard error: 47230 on 1 degrees of freedom
## Multiple R-squared:  0.2709, Adjusted R-squared:  -1.916 
## F-statistic: 0.1238 on 3 and 1 DF,  p-value: 0.9344
## 
## R-squared: 0.2709 (27.09%)

7. Interpretasi Bisnis

Berikut adalah rekomendasi strategi pemasaran per kota berdasarkan analisis data dan dampak dari faktor-faktor pemasaran yang tersedia:

1. Rekomendasi Strategi Pemasaran Per Kota

Berdasarkan total pendapatan yang dihitung: - Depok memiliki pendapatan tertinggi, diikuti oleh Jakarta dan Tangerang. Strategi pemasaran di kota-kota ini dapat difokuskan untuk mempertahankan keunggulan pasar. - Bogor memiliki pendapatan terendah. Ini menunjukkan perlunya strategi agresif untuk meningkatkan penjualan di kota ini, seperti penawaran diskon khusus atau promosi yang lebih intensif. - Bekasi menunjukkan potensi pertumbuhan yang signifikan. Fokus pada peningkatan penetrasi pasar dengan strategi promosi yang tepat.

2. Dampak dan Strategi untuk Faktor-Faktor Pemasaran

a. Pengoptimalan Diskon

  • Hasil Analisis: Diskon memiliki koefisien positif dalam model regresi, tetapi tidak signifikan secara statistik. Ini menunjukkan bahwa diskon cenderung meningkatkan pendapatan, tetapi pengaruhnya tidak kuat.
  • Strategi:
    • Gunakan diskon secara selektif untuk produk dengan margin tinggi.
    • Terapkan diskon berbasis volume untuk mendorong pembelian dalam jumlah besar.
    • Lakukan uji coba diskon di kota dengan pendapatan rendah (seperti Bogor) untuk melihat dampaknya terhadap penjualan.

b. Alokasi Anggaran Promosi

  • Hasil Analisis: Biaya promosi memiliki koefisien negatif dan hampir signifikan. Ini menunjukkan bahwa pengeluaran promosi yang tinggi tidak selalu menghasilkan peningkatan pendapatan.
  • Strategi:
    • Optimalkan pengeluaran promosi dengan fokus pada saluran yang memberikan hasil terbaik (misalnya, digital marketing atau promosi lokal).
    • Kurangi promosi di kota dengan kinerja baik (seperti Depok) dan alokasikan ke kota dengan potensi pertumbuhan (seperti Bogor atau Bekasi).
    • Gunakan promosi berbasis data untuk menargetkan segmen pelanggan yang lebih spesifik.

c. Distribusi Penjualan ke Jenis Outlet Tertentu

  • Hasil Analisis: Jenis outlet (Modern vs. Tradisional) tidak memiliki pengaruh signifikan terhadap pendapatan.
  • Strategi:
    • Fokus pada outlet modern untuk produk dengan margin tinggi dan kategori premium.
    • Tingkatkan kerja sama dengan outlet tradisional untuk menjangkau segmen pelanggan yang sensitif terhadap harga.
    • Diversifikasi distribusi ke kedua jenis outlet untuk meminimalkan risiko ketergantungan pada satu saluran.

3. Rekomendasi Umum

  1. Analisis Performa Per Kota:
    • Lakukan analisis lebih lanjut untuk memahami faktor-faktor spesifik yang memengaruhi penjualan di setiap kota, seperti preferensi pelanggan lokal.
  2. Segmentasi Pelanggan:
    • Gunakan data pelanggan untuk menciptakan strategi pemasaran yang lebih tersegmentasi, seperti kampanye khusus untuk pelanggan loyal.
  3. Evaluasi ROI Promosi:
    • Monitor pengembalian investasi (ROI) dari setiap aktivitas promosi untuk memastikan efisiensi anggaran.
  4. Kombinasi Diskon dan Promosi:
    • Gabungkan strategi diskon dengan promosi kreatif (misalnya, bundling produk) untuk meningkatkan daya tarik tanpa mengorbankan margin keuntungan.
LS0tDQp0aXRsZTogIlVBUyBTdGF0aXN0aWthIERhc2FyIg0Kc3VidGl0bGU6ICJSYW5na3VtYW4gTWF0ZXJpICYgU3R1ZGkgS2FzdXMiDQphdXRob3I6IA0KDQogIC0gIk5PVkEgU0lUT1JVUyINCiAgLSAiTFVUSEZJIEFLSFlBUiBIQVNJQlVBTiIgDQogIC0gIkNIRUxMTyBGUkhJTk8gTUlLRS4gTSINCiAgDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogIH0NCjwvc3R5bGU+DQoNCjxpbWcgc3JjPSJsb2dvLmpwZWciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjUwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyIvPg0KDQoNCiMgKipTb2FsIDEgUmFuZ2t1bWFuIE1hdGVyaSBTdGF0aXN0aWthIERhc2FyKioNCg0KIyMgKioxLiBQZW5nZXJ0aWFuIFN0YXRpc3Rpa2EqKiAgDQpTdGF0aXN0aWthIGFkYWxhaCBjYWJhbmcgaWxtdSB5YW5nIG1lbXBlbGFqYXJpIHRla25payBwZW5ndW1wdWxhbiwgcGVuZ29sYWhhbiwgYW5hbGlzaXMsIGRhbiBpbnRlcnByZXRhc2kgZGF0YSBzZWhpbmdnYSBtZW5naGFzaWxrYW4gaW5mb3JtYXNpIHlhbmcgYmVyZ3VuYSBkYWxhbSBiZXJiYWdhaSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4uIElsbXUgaW5pIG1lbWFpbmthbiBwZXJhbiBwZW50aW5nIGRpIGJhbnlhayBiaWRhbmcsIHNlcGVydGkgZWtvbm9taSwga2VzZWhhdGFuLCBwZW5kaWRpa2FuLCBkYW4gdGVrbm9sb2dpLCB1bnR1ayBtZW1haGFtaSBwb2xhIGF0YXUgdHJlbiB5YW5nIHRlcmRhcGF0IGRhbGFtIGRhdGEuDQoNCg0KIyMjICoqUGVyYmVkYWFuIFN0YXRpc3Rpa2EgRGVza3JpcHRpZiBkYW4gU3RhdGlzdGlrYSBJbmZlcmVuc2lhbCoqICANCg0KMS4gKipTdGF0aXN0aWthIERlc2tyaXB0aWYqKiAgDQogICAtICoqRGVmaW5pc2kqKjogQ2FiYW5nIHN0YXRpc3Rpa2EgeWFuZyBiZXJmb2t1cyBwYWRhIHBlbnlhamlhbiBkYW4gcGVyaW5na2FzYW4gZGF0YSB5YW5nIHRlbGFoIGRpa3VtcHVsa2FuLCB0YW5wYSBtZW5jb2JhIG1lbWJ1YXQgcHJlZGlrc2kgYXRhdSBnZW5lcmFsaXNhc2kuICANCiAgIC0gKipUdWp1YW4qKjogTWVtYmVyaWthbiBnYW1iYXJhbiBqZWxhcyBtZW5nZW5haSBkYXRhIG1lbmdndW5ha2FuIHRhYmVsLCBncmFmaWssIGF0YXUgcGVuZ3VrdXJhbiBzZXBlcnRpIHJhdGEtcmF0YSwgbWVkaWFuLCBtb2R1cywgZGFuIHN0YW5kYXIgZGV2aWFzaS4gIA0KICAgLSAqKkNvbnRvaCoqOiBNZW5naGl0dW5nIHJhdGEtcmF0YSBuaWxhaSB1amlhbiBzaXN3YSBkaSBzdWF0dSBrZWxhcy4NCg0KMi4gKipTdGF0aXN0aWthIEluZmVyZW5zaWFsKiogIA0KICAgLSAqKkRlZmluaXNpKio6IENhYmFuZyBzdGF0aXN0aWthIHlhbmcgbWVuZ2d1bmFrYW4gZGF0YSBkYXJpIHNhbXBlbCB1bnR1ayBtZW5hcmlrIGtlc2ltcHVsYW4gYXRhdSBtZW1idWF0IHByZWRpa3NpIHRlbnRhbmcgcG9wdWxhc2kgeWFuZyBsZWJpaCBsdWFzLiAgDQogICAtICoqVHVqdWFuKio6IE1lbmVyYXBrYW4gbWV0b2RlIHNlcGVydGkgcGVuZ3VqaWFuIGhpcG90ZXNpcyBhdGF1IGVzdGltYXNpIHBhcmFtZXRlciB1bnR1ayBtZW5naGFzaWxrYW4gZ2VuZXJhbGlzYXNpLiAgDQogICAtICoqQ29udG9oKio6IE1lbmdndW5ha2FuIHN1cnZlaSBwYWRhIHNla2Vsb21wb2sga2VjaWwgb3JhbmcgdW50dWsgbWVtcGVya2lyYWthbiBwcmVmZXJlbnNpIHNlbHVydWggcGVuZHVkdWsga290YS4NCiAgIA0KDQojIyMgKipKZW5pcyBEYXRhIGRhbGFtIFN0YXRpc3Rpa2EqKiAgDQoNCjEuICoqRGF0YSBOdW1lcmlrIChLdWFudGl0YXRpZikqKiAgDQogIERhdGEgbnVtZXJpayBhZGFsYWggZGF0YSBiZXJiZW50dWsgYW5na2EgeWFuZyBkYXBhdCBkaXVrdXIgYXRhdSBkaWhpdHVuZy4gIA0KICAgLSAqKkthdGVnb3JpKio6ICANCiAgICAgLSAqKkRpc2tyZXQqKjogRGF0YSBiZXJ1cGEgYmlsYW5nYW4gdGVydGVudHUgeWFuZyBkaXBlcm9sZWggZGFyaSBoYXNpbCBwZXJoaXR1bmdhbiAobWlzYWxueWEganVtbGFoIHNpc3dhIGRpIGtlbGFzKS4gIA0KICAgICAtICoqS29udGludSoqOiBEYXRhIGJlcnVwYSBhbmdrYSBkYWxhbSByZW50YW5nIHRlcnRlbnR1IHlhbmcgYmVyYXNhbCBkYXJpIHBlbmd1a3VyYW4gKG1pc2FsbnlhIHRpbmdnaSBiYWRhbiwgYmVyYXQgYmFkYW4pLiAgDQogICAtICoqQ29udG9oKio6ICANCiAgICAgLSBKdW1sYWgga2VuZGFyYWFuIGRpIHBhcmtpcmFuIChkaXNrcmV0KS4gIA0KICAgICAtIEJlcmF0IGJhZGFuIHNlc2VvcmFuZyBkYWxhbSBraWxvZ3JhbSAoa29udGludSkuDQoNCjIuICoqRGF0YSBLYXRlZ29yaWsgKEt1YWxpdGF0aWYpKiogIA0KICBEYXRhIGthdGVnb3JpayBhZGFsYWggZGF0YSB5YW5nIGJlcmJlbnR1ayBrYXRlZ29yaSBhdGF1IGxhYmVsLCBidWthbiBhbmdrYS4gIA0KICAgLSAqKkthdGVnb3JpKio6ICANCiAgICAgLSAqKk5vbWluYWwqKjogRGF0YSBrYXRlZ29yaWsgdGFucGEgdXJ1dGFuIHRlcnRlbnR1IChjb250b2g6IHdhcm5hIGZhdm9yaXQsIGplbmlzIGtlbGFtaW4pLiAgDQogICAgIC0gKipPcmRpbmFsKio6IERhdGEga2F0ZWdvcmlrIGRlbmdhbiB1cnV0YW4gdGVydGVudHUsIG1lc2tpcHVuIGphcmFrbnlhIHRpZGFrIGRhcGF0IGRpdWt1ciAoY29udG9oOiB0aW5na2F0IHBlbmRpZGlrYW4sIHNrYWxhIGtlcHVhc2FuKS4gIA0KICAgLSAqKkNvbnRvaCoqOiAgDQogICAgIC0gV2FybmEgYmFqdSAobm9taW5hbCkuICANCiAgICAgLSBUaW5na2F0IGtlcHVhc2FuIHBlbGFuZ2dhbiAob3JkaW5hbCwgc2VwZXJ0aSBwdWFzLCBjdWt1cCBwdWFzLCB0aWRhayBwdWFzKS4NCg0KDQojIyMgKipQZXJiZWRhYW4gRGF0YSBOdW1lcmlrIGRhbiBLYXRlZ29yaWsqKiAgDQoNCnwgKipBc3BlayoqICAgICAgICAgICAgICAgfCAqKkRhdGEgTnVtZXJpayoqICAgICAgICAgICAgICAgICAgICB8ICoqRGF0YSBLYXRlZ29yaWsqKiAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqQmVudHVrIERhdGEqKiAgICAgICAgIHwgQW5na2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLYXRlZ29yaSBhdGF1IGxhYmVsICAgICAgICAgICAgICAgIHwNCnwgKipPcGVyYXNpIE1hdGVtYXRpa2EqKiAgfCBCaXNhIGRpbGFrdWthbiAobWlzYWxueWEgcmF0YS1yYXRhKSB8IFRpZGFrIGJpc2EgZGlsYWt1a2FuICAgICAgICAgICAgICAgfA0KfCAqKkNvbnRvaCoqICAgICAgICAgICAgICB8IFVzaWEgc2VzZW9yYW5nICgyNSB0YWh1bikgICAgICAgICAgIHwgU3RhdHVzIHBlcm5pa2FoYW4gKGxhamFuZy9tZW5pa2FoKSB8ICANCg0KIyMgKioyLlVrdXJhbiBQZW11c2F0YW4gZGFuIFBlbnllYmFyYW4gRGF0YSoqDQoNCiMjIyBUYWJlbCBQZW5qZWxhc2FuDQoNCnwgKipVa3VyYW4qKnwgKipQZW5nZXJ0aWFuKiogICAgICAgICAgICAgIHwgKipLYXBhbiBEaWd1bmFrYW4qKiAgICAgICAgICAgICAgICAgfCAqKkNvbnRvaCoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipNZWFuIChSYXRhLXJhdGEpKiogICAgIHwgSGFzaWwgcGVtYmFnaWFuIHRvdGFsIG5pbGFpIGRhbGFtIGRhdGFzZXQgZGVuZ2FuIGp1bWxhaCBvYnNlcnZhc2kufCBUaWRhayBjb2NvayBqaWthIGFkYSBvdXRsaWVyLCBrYXJlbmEgbmlsYWkgZWtzdHJlbSBkYXBhdCBtZW1lbmdhcnVoaSByYXRhLXJhdGEgc2VjYXJhIHNpZ25pZmlrYW4uIHwgRGFsYW0ga2Vsb21wb2sgZGVuZ2FuIHNhdHUgaW5kaXZpZHUgYmVycGVuZ2hhc2lsYW4gc2FuZ2F0IHRpbmdnaSwgcmF0YS1yYXRhIHBlbmRhcGF0YW4gbWVuamFkaSBiaWFzLiAgIHwNCnwgKipNZWRpYW4qKiAgICAgICAgICAgICAgIHwgTmlsYWkgdGVuZ2FoIGRhcmkgZGF0YXNldCB5YW5nIHRlbGFoIGRpdXJ1dGthbi4gSmlrYSBqdW1sYWggZGF0YSBnZW5hcCwgbWVkaWFuIGFkYWxhaCByYXRhLXJhdGEgZHVhIG5pbGFpIHRlbmdhaC4gfCBDb2NvayB1bnR1ayBkYXRhc2V0IHlhbmcgbWVtaWxpa2kgb3V0bGllciwga2FyZW5hIG1lZGlhbiB0aWRhayB0ZXJwZW5nYXJ1aCBvbGVoIG5pbGFpIGVrc3RyZW0uICAgICAgICAgfCBNZWRpYW4gcGVuZ2hhc2lsYW4gbWVuY2VybWlua2FuIHBlbmRhcGF0YW4gdGlwaWthbCBzYWF0IGFkYSBvcmFuZyBkZW5nYW4gcGVuZ2hhc2lsYW4gc2FuZ2F0IHRpbmdnaS4gICAgfA0KfCAqKk1vZHVzKiogICAgICAgICAgICAgICAgfCBOaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGRhbGFtIGRhdGFzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVsZXZhbiB1bnR1ayBkYXRhIGthdGVnb3JpayBhdGF1IHVudHVrIG1lbmdldGFodWkgbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhLiAgICAgICAgICB8IFVrdXJhbiBwYWthaWFuIHlhbmcgcGFsaW5nIGJhbnlhayB0ZXJqdWFsLCBtaXNhbG55YSAiTCIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqU3RhbmRhciBEZXZpYXNpKiogICAgICB8IE1lbmd1a3VyIHNlYmVyYXBhIGphdWggZGF0YSBtZW55ZWJhciBkYXJpIHJhdGEtcmF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGFuZGFyIGRldmlhc2kga2VjaWwgbWVudW5qdWtrYW4gZGF0YSBob21vZ2VuLCBzZWRhbmdrYW4gc3RhbmRhciBkZXZpYXNpIGJlc2FyIG1lbmdpbmRpa2FzaWthbiB2YXJpYXNpIGJlc2FyLiB8IFN0YW5kYXIgZGV2aWFzaSBuaWxhaSB1amlhbiBrZWNpbCBiZXJhcnRpIHNpc3dhIG1lbWlsaWtpIG5pbGFpIHlhbmcgbWlyaXA7IGJlc2FyIGJlcmFydGkgbmlsYWkgYmVydmFyaWFzaS4gfA0KDQojIyAqKjMuIFZpc3VhbGlzYXNpIERhdGEqKg0KDQoxLiAqKkhpc3RvZ3JhbSoqICANCiAgIC0gKipBcGEgaXR1PyoqIEdyYWZpayBpbmkgbWlyaXAgZGVuZ2FuIGRpYWdyYW0gYmF0YW5nIHRldGFwaSBraHVzdXMgdW50dWsgZGF0YSBhbmdrYS4gSGlzdG9ncmFtIG1lbnVuanVra2FuIGp1bWxhaCBkYXRhIGRhbGFtIHNldGlhcCBrZWxvbXBvayBuaWxhaSB0ZXJ0ZW50dSAoZGlzZWJ1dCBpbnRlcnZhbCBhdGF1IGJpbikuICANCiAgIC0gKipUdWp1YW4gZGFuIEtlZ3VuYWFuOioqICANCiAgICAgLSBNZW1haGFtaSAqKnBvbGEgZGlzdHJpYnVzaSoqIGRhdGEsIG1pc2FsbnlhIGFwYWthaCBkYXRhbnlhIGNlbmRlcnVuZyBub3JtYWwgKHNlaW1iYW5nKSBhdGF1IGNvbmRvbmcga2Ugc2FsYWggc2F0dSBzaXNpIChrZW1pcmluZ2FuKS4gIA0KICAgICAtIE1lbWJhbnR1IG1lbGloYXQgc2ViYXJhbiBuaWxhaSwgc2VwZXJ0aSBiZXJhcGEgYmFueWFrIHNpc3dhIHlhbmcgbWVuZGFwYXQgbmlsYWkgZGkgcmVudGFuZyA2MC03MCwgNzAtODAsIGRhbiBzZXRlcnVzbnlhLiAgDQogICAgIC0gQmVyZ3VuYSB1bnR1ayBtZW5nYW5hbGlzaXMgZGF0YSBrdWFudGl0YXRpZiwgc2VwZXJ0aSB0aW5nZ2kgYmFkYW4sIGJlcmF0IGJhZGFuLCBhdGF1IG5pbGFpIHVqaWFuLg0KICAgLSAqKkNvbnRvaDoqKg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIHBlbmp1YWxhbiB1bnR1ayBDYWJhbmcgQSBkYW4gQ2FiYW5nIEINCmRhdGFfY2FiYW5nIDwtIGRhdGEuZnJhbWUoDQogIFBlbmp1YWxhbiA9IGMoNTAsIDU1LCA2MCwgNjUsIDcwLCA0NSwgNTgsIDYwLCA3NSwgODApLCAgIyBEYXRhIGdhYnVuZ2FuDQogIENhYmFuZyA9IHJlcChjKCJDYWJhbmcgQSIsICJDYWJhbmcgQiIpLCBlYWNoID0gNSkgICAgICAgICMgTWVuZW50dWthbiBjYWJhbmcNCikNCg0KIyBNZW1idWF0IGhpc3RvZ3JhbSB1bnR1ayBDYWJhbmcgQSBkYW4gQg0KcGxvdF9hIDwtIHBsb3RfbHkoDQogIGRhdGFfY2FiYW5nLA0KICB4ID0gflBlbmp1YWxhbiwNCiAgY29sb3IgPSB+Q2FiYW5nLCAgICAgICAgICAgICAjIFdhcm5hIGJlcmJlZGEgdW50dWsgc2V0aWFwIGNhYmFuZw0KICB0eXBlID0gImhpc3RvZ3JhbSINCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJIaXN0b2dyYW0gUGVuanVhbGFuIENhYmFuZyBBIGRhbiBCIiwNCiAgICB4YXhpcyA9IGxpc3QoDQogICAgICB0aXRsZSA9ICJQZW5qdWFsYW4gKGp1dGEgcnVwaWFoKSIsIA0KICAgICAgcmFuZ2UgPSBjKDQwLCA4NSkgICMgUmVudGFuZyBzdW1idSBYDQogICAgKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJla3VlbnNpIiksICAjIExhYmVsIHN1bWJ1IFkNCiAgICBiYXJtb2RlID0gImdyb3VwIiAgICAgICAgICAgICAgICAgICAjIE1lbmFtcGlsa2FuIGJhdGFuZyBzZWNhcmEgdGVycGlzYWgNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3RfYQ0KDQoNCmBgYA0KDQoNCjIuICoqQm94cGxvdCoqICANCiAgIC0gKipBcGEgaXR1PyoqIEdyYWZpayBzZWRlcmhhbmEgYmVyYmVudHVrIGtvdGFrIGRlbmdhbiBnYXJpcyBkaSB0ZW5nYWhueWEuIEJveHBsb3QgbWVudW5qdWtrYW4gbmlsYWktbmlsYWkgcGVudGluZywgc2VwZXJ0aSBuaWxhaSB0ZXJ0aW5nZ2ksIHRlcmVuZGFoLCB0ZW5nYWggKG1lZGlhbiksIGRhbiBhcGFrYWggYWRhIG5pbGFpIHlhbmcgamF1aCBiZXJiZWRhIChvdXRsaWVyKS4gIA0KICAgLSAqKlR1anVhbiBkYW4gS2VndW5hYW46KiogIA0KICAgICAtIE1lbGloYXQgKipwZW55ZWJhcmFuIGRhdGEqKiBkZW5nYW4gY2VwYXQsIGFwYWthaCBkYXRhbnlhIHRlcmt1bXB1bCByYXBhdCBhdGF1IHRlcnNlYmFyIGx1YXMuICANCiAgICAgLSBNZW5naWRlbnRpZmlrYXNpICoqb3V0bGllcioqLCB5YWl0dSBuaWxhaS1uaWxhaSBla3N0cmVtIHlhbmcgYmVyYmVkYSBqYXVoIGRhcmkgZGF0YSBsYWlubnlhLiAgDQogICAgIC0gQ29jb2sgdW50dWsgbWVtYmFuZGluZ2thbiBiZWJlcmFwYSBrZWxvbXBvayBkYXRhLCBzZXBlcnRpIG1lbWJhbmRpbmdrYW4gbmlsYWkgdWppYW4gc2lzd2EgZGkga2VsYXMgeWFuZyBiZXJiZWRhLiANCiAgIC0gKipDb250b2g6KioNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBwZW5qdWFsYW4gdW50dWsgQ2FiYW5nIEEgZGFuIENhYmFuZyBCDQpkYXRhX2NhYmFuZyA8LSBkYXRhLmZyYW1lKA0KICBQZW5qdWFsYW4gPSBjKDUwLCA1NSwgNjAsIDY1LCA3MCwgNDUsIDU4LCA2MCwgNzUsIDgwKSwgICMgRGF0YSBnYWJ1bmdhbg0KICBDYWJhbmcgPSByZXAoYygiQ2FiYW5nIEEiLCAiQ2FiYW5nIEIiKSwgZWFjaCA9IDUpICAgICAgICAjIE1lbmVudHVrYW4gY2FiYW5nDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IHVudHVrIENhYmFuZyBBIGRhbiBCDQpib3hwbG90IDwtIHBsb3RfbHkoDQogIGRhdGFfY2FiYW5nLA0KICB5ID0gflBlbmp1YWxhbiwNCiAgeCA9IH5DYWJhbmcsICAgICAgICAgICAgICAjIE1lbWlzYWhrYW4gZGF0YSBiZXJkYXNhcmthbiBjYWJhbmcNCiAgdHlwZSA9ICJib3giLA0KICBib3hwb2ludHMgPSAiYWxsIiwgICAgICAgICMgTWVuYW1waWxrYW4gc2VtdWEgdGl0aWsgZGF0YQ0KICBqaXR0ZXIgPSAwLjMsICAgICAgICAgICAgICMgTWVuYW1iYWhrYW4gc2VkaWtpdCBqYXJhayBhbnRhcmEgdGl0aWsNCiAgcG9pbnRwb3MgPSAtMS41ICAgICAgICAgICAjIE1lbmdhdHVyIHBvc2lzaSB0aXRpayBkYXRhDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94cGxvdCBQZW5qdWFsYW4gQ2FiYW5nIEEgZGFuIEIiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJDYWJhbmciKSwgICAgICAgICAjIExhYmVsIHN1bWJ1IFgNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSAgIyBMYWJlbCBzdW1idSBZDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpib3hwbG90DQoNCmBgYA0KDQoNCjMuICoqRGlhZ3JhbSBCYXRhbmcqKiAgDQogICAtICoqQXBhIGl0dT8qKiBHcmFmaWsgaW5pIHRlcmRpcmkgZGFyaSBiYXRhbmctYmF0YW5nIHlhbmcgbWV3YWtpbGkga2F0ZWdvcmkgZGF0YS4gUGFuamFuZyBiYXRhbmcgbWVudW5qdWtrYW4ganVtbGFoIGF0YXUgZnJla3VlbnNpIGRhdGEgZGFsYW0gc2V0aWFwIGthdGVnb3JpLiAgDQogICAtICoqVHVqdWFuIGRhbiBLZWd1bmFhbjoqKiAgDQogICAgIC0gTWVuYW1waWxrYW4gKipwZXJiYW5kaW5nYW4gYW50YXIga2F0ZWdvcmkqKiBkZW5nYW4gamVsYXMsIHNlcGVydGkganVtbGFoIHNpc3dhIGRpIGp1cnVzYW4gSVBBLCBJUFMsIGRhbiBCYWhhc2EuICANCiAgICAgLSBNZW1wZXJtdWRhaCBhbmFsaXNpcyBkYXRhIGthdGVnb3JpaywgbWlzYWxueWEgbWVsaWhhdCBwcm9kdWsgbWFuYSB5YW5nIHBhbGluZyBsYXJpcyBkaSBzZWJ1YWggdG9rby4gIA0KICAgICAtIE1lbWJhbnR1IG1lbWJ1YXQga2VwdXR1c2FuIGRlbmdhbiBtZW1iYW5kaW5na2FuIGRhdGEgc2VjYXJhIHZpc3VhbC4gIA0KDQpTZW11YSBncmFmaWsgaW5pIGRpcmFuY2FuZyB1bnR1ayBtZW1wZXJtdWRhaCBwZW1haGFtYW4gZGF0YSwgYmFpayBhbmdrYSBtYXVwdW4ga2F0ZWdvcmksIHNlaGluZ2dhIGtpdGEgZGFwYXQgbWVuZ2FtYmlsIGtlc2ltcHVsYW4gbGViaWggY2VwYXQgZGFuIGFrdXJhdC4NCiAgLSAqKkNvbnRvaCoqDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBwZW5qdWFsYW4gdW50dWsgQ2FiYW5nIEEgZGFuIENhYmFuZyBCDQpkYXRhX2NhYmFuZyA8LSBkYXRhLmZyYW1lKA0KICBDYWJhbmcgPSBjKCJDYWJhbmcgQSIsICJDYWJhbmcgQiIpLA0KICBUb3RhbF9QZW5qdWFsYW4gPSBjKA0KICAgIHN1bShjKDUwLCA1NSwgNjAsIDY1LCA3MCkpLCAgIyBUb3RhbCBwZW5qdWFsYW4gQ2FiYW5nIEENCiAgICBzdW0oYyg0NSwgNTgsIDYwLCA3NSwgODApKSAgICMgVG90YWwgcGVuanVhbGFuIENhYmFuZyBCDQogICkNCikNCg0KIyBNZW1idWF0IGRpYWdyYW0gYmF0YW5nIHVudHVrIHRvdGFsIHBlbmp1YWxhbg0KYmFyX2NoYXJ0IDwtIHBsb3RfbHkoDQogIGRhdGFfY2FiYW5nLA0KICB4ID0gfkNhYmFuZywgICAgICAgICAgICAgICAgICAjIFN1bWJ1IFggYmVyZGFzYXJrYW4gY2FiYW5nDQogIHkgPSB+VG90YWxfUGVuanVhbGFuLCAgICAgICAgICMgU3VtYnUgWSBiZXJkYXNhcmthbiB0b3RhbCBwZW5qdWFsYW4NCiAgdHlwZSA9ICJiYXIiLA0KICB0ZXh0ID0gflRvdGFsX1Blbmp1YWxhbiwgICAgICAjIE1lbmFtcGlsa2FuIG5pbGFpIHRvdGFsIGRpIGF0YXMgYmF0YW5nDQogIHRleHRwb3NpdGlvbiA9ICJvdXRzaWRlIiwgICAgICMgUG9zaXNpIHRla3MgZGkgbHVhciBiYXRhbmcNCiAgbWFya2VyID0gbGlzdChjb2xvciA9IGMoIiM2MzZFRkEiLCAiI0VGNTUzQiIpKSAgIyBXYXJuYSBiYXRhbmcNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEaWFncmFtIEJhdGFuZyBUb3RhbCBQZW5qdWFsYW4gcGVyIENhYmFuZyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNhYmFuZyIpLCAgICAgICAgICAgICAgICAjIExhYmVsIHN1bWJ1IFgNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVG90YWwgUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSAgIyBMYWJlbCBzdW1idSBZDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpiYXJfY2hhcnQNCg0KYGBgDQoNCiMjICoqNC4gQW5hbGlzaXMgS29yZWxhc2kqKg0KICAqKktvcmVsYXNpKiogYWRhbGFoIHVrdXJhbiBzdGF0aXN0aWsgeWFuZyBtZW51bmp1a2thbiBzZWphdWggbWFuYSBkdWEgdmFyaWFiZWwgc2FsaW5nIHRlcmthaXQgc2VjYXJhIGxpbmVhciAoYXJ0aW55YSBrZWR1YW55YSBiZXJ1YmFoIHNlY2FyYSBiZXJzYW1hYW4gcGFkYSB0aW5na2F0IHlhbmcga29uc3RhbikuIEluaSBhZGFsYWggYWxhdCB1bXVtIHVudHVrIG1lbmdnYW1iYXJrYW4gaHVidW5nYW4gc2VkZXJoYW5hIHRhbnBhIG1lbWJ1YXQgcGVybnlhdGFhbiB0ZW50YW5nIHNlYmFiIGRhbiBha2liYXQuDQoNCiMjIyAqKkplbmlzIEtvcmVsYXNpKioNCioqMS4gS29yZWxhc2kgUG9zaXRpZioqDQpLb3JlbGFzaSBwb3NpdGlmIHRlcmphZGkga2V0aWthIGtlZHVhIHZhcmlhYmVsIGJlcmdlcmFrIGRhbGFtIGFyYWggeWFuZyBzYW1hLiBBcnRpbnlhLCBqaWthIHNhdHUgdmFyaWFiZWwgbWVuaW5na2F0LCB2YXJpYWJlbCBsYWlubnlhIGp1Z2EgY2VuZGVydW5nIG1lbmluZ2thdC4NCg0KICAqKkNvbnRvaCoqOiBKdW1sYWggamFtIGJlbGFqYXIgZGFuIG5pbGFpIHVqaWFuLiBTZW1ha2luIGJhbnlhayBzZXNlb3JhbmcgYmVsYWphciwgc2VtYWtpbiB0aW5nZ2kga2VtdW5na2luYW4gbmlsYWlueWEgbWVuaW5na2F0Lg0KDQoqKjIuIEtvcmVsYXNpIE5lZ2F0aWYqKg0KS29yZWxhc2kgbmVnYXRpZiB0ZXJqYWRpIGtldGlrYSBrZWR1YSB2YXJpYWJlbCBiZXJnZXJhayBkYWxhbSBhcmFoIHlhbmcgYmVybGF3YW5hbi4gQXJ0aW55YSwgamlrYSBzYXR1IHZhcmlhYmVsIG1lbmluZ2thdCwgdmFyaWFiZWwgbGFpbm55YSBjZW5kZXJ1bmcgbWVudXJ1bi4NCg0KICAqKkNvbnRvaCoqOiBKdW1sYWggcGVuZ2d1bmFhbiBrZW5kYXJhYW4gcHJpYmFkaSBkYW4ga3VhbGl0YXMgdWRhcmEuIFNlbWFraW4gYmFueWFrIGtlbmRhcmFhbiB5YW5nIGRpZ3VuYWthbiwga3VhbGl0YXMgdWRhcmEgY2VuZGVydW5nIG1lbnVydW4uDQoNCioqMy4gS29yZWxhc2kgTm9sKioNCktvcmVsYXNpIG5vbCB0ZXJqYWRpIGtldGlrYSB0aWRhayBhZGEgaHVidW5nYW4gYW50YXJhIGR1YSB2YXJpYWJlbC4gQXJ0aW55YSwgcGVydWJhaGFuIGRhbGFtIHNhdHUgdmFyaWFiZWwgdGlkYWsgbWVtZW5nYXJ1aGkgdmFyaWFiZWwgbGFpbm55YS4NCg0KICAqKkNvbnRvaCoqOiBUaW5nZ2kgYmFkYW4gc2VzZW9yYW5nIGRhbiBza29yIHVqaWFuIG1hdGVtYXRpa2EuIFRpZGFrIGFkYSBodWJ1bmdhbiB5YW5nIGplbGFzIGFudGFyYSBrZWR1YSB2YXJpYWJlbCBpbmkuDQoNCg0KIyMgKio1LiBVamkgSGlwb3Rlc2lzKioNCiAgRGFsYW0gKipwZW5ndWppYW4gaGlwb3Rlc2lzKiosIGZva3VzIHV0YW1hIGFkYWxhaCBtZW5pbGFpIGFwYWthaCBkYXRhIGN1a3VwIGt1YXQgdW50dWsgbWVub2xhayDwnZC7MCBkYW4gbWVuZHVrdW5nIPCdkLvwnZGOLiBQZW5ndWppYW4gaW5pIGRpbGFrdWthbiBkZW5nYW4gbWVuZ2d1bmFrYW4gc3RhdGlzdGlrIHVqaSBkYW4gbWVtYmFuZGluZ2thbiBuaWxhaSBwcm9iYWJpbGl0YXMgKPCdkZ0tdmFsdWUpIHRlcmhhZGFwIHRpbmdrYXQgc2lnbmlmaWthbnNpICjwnZu8KS4gQmVyaWt1dCBhZGFsYWggbGFuZ2thaC1sYW5na2FoIHV0YW1hIGRhbGFtIG1lbGFrdWthbiB1amkgaGlwb3Rlc2lzOg0KDQoqKjEuIE1lcnVtdXNrYW4gSGlwb3Rlc2lzKiogDQpEYWxhbSBwZW5ndWppYW4gaGlwb3Rlc2lzLCB0ZXJkYXBhdCBkdWEgamVuaXMga2VzYWxhaGFuIHlhbmcgZGFwYXQgdGVyamFkaToNCg0KKiBLZXNhbGFoYW4gVGlwZSBJICjwnZu8KToNClRlcmphZGkga2V0aWthIGhpcG90ZXNpcyBub2wgKPCdkLswKSBkaXRvbGFrIHBhZGFoYWwgc2ViZW5hcm55YSDwnZC7MCBiZW5hci4gS2VzYWxhaGFuIGluaSBzZXJpbmcgZGlzZWJ1dCBmYWxzZSBwb3NpdGl2ZSBkYW4gdGluZ2thdCBrZWphZGlhbm55YSBkaXdha2lsaSBvbGVoIHRpbmdrYXQgc2lnbmlmaWthbnNpICjwnZu8KSwgbWlzYWxueWEgMCwwNSAoNSUpLg0KDQoqIEtlc2FsYWhhbiBUaXBlIElJICjwnZu9KToNClRlcmphZGkga2V0aWthIGhpcG90ZXNpcyBub2wgKPCdkLswKSB0aWRhayBkaXRvbGFrIHBhZGFoYWwgc2ViZW5hcm55YSBoaXBvdGVzaXMgYWx0ZXJuYXRpZiAo8J2Qu/CdkY4pIGJlbmFyLiBLZXNhbGFoYW4gaW5pIGRpa2VuYWwgc2ViYWdhaSBmYWxzZSBuZWdhdGl2ZSwgZGFuIHByb2JhYmlsaXRhcyB1bnR1ayB0aWRhayBtZWxha3VrYW4ga2VzYWxhaGFuIHRpcGUgSUkgZGlzZWJ1dCBrZWt1YXRhbiB1amkgYXRhdSBwb3dlciBvZiB0aGUgdGVzdCAoMSDiiJIg8J2bvSkuIA0KDQoqKjIuIE1lbmVudHVrYW4gVGluZ2thdCBTaWduaWZpa2Fuc2kgKM6xKSoqDQoNClRpbmdrYXQgc2lnbmlmaWthbnNpIGFkYWxhaCBwcm9iYWJpbGl0YXMga2VzYWxhaGFuIHlhbmcgZGFwYXQgZGl0ZXJpbWEgZGFsYW0gbWVub2xhayBIMCBwYWRhaGFsIEgwIGJlbmFyLiBCaWFzYW55YSwgbmlsYWkgzrEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIDAsMDUgKDUlKSBhdGF1IDAsMDEgKDElKS4NCg0KKiozLiBNZW1pbGloIFVqaSBTdGF0aXN0aWsgeWFuZyBTZXN1YWkqKg0KDQpQaWxpaCB1amkgc3RhdGlzdGlrIGJlcmRhc2Fya2FuIGplbmlzIGRhdGEgZGFuIHR1anVhbiBwZW5lbGl0aWFuOg0KDQoqIFVqaS16IGF0YXUgdWppLXQ6IFVudHVrIG1lbWJhbmRpbmdrYW4gcmF0YS1yYXRhIHBvcHVsYXNpLg0KDQoqIFVqaS1jaGktc3F1YXJlICjPh8KyKTogVW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEgdmFyaWFiZWwga2F0ZWdvcmkuDQoNCiogVWppIEFOT1ZBOiBVbnR1ayBtZW1iYW5kaW5na2FuIHJhdGEtcmF0YSBsZWJpaCBkYXJpIGR1YSBrZWxvbXBvay4NCg0KKiBVamkgcmVncmVzaTogVW50dWsgYW5hbGlzaXMgaHVidW5nYW4gYW50YXIgdmFyaWFiZWwuDQoNCioqNC4gTWVuZW50dWthbiBOaWxhaSBLcml0aWthbCBhdGF1IHAtdmFsdWUqKg0KDQpOaWxhaS3wnZGdIGFkYWxhaCBwcm9iYWJpbGl0YXMgeWFuZyBtZW51bmp1a2thbiBzZWJlcmFwYSBrb25zaXN0ZW4gZGF0YSBzYW1wZWwgZGVuZ2FuIPCdkLswLiBOaWxhaSBpbmkgbWVuZ2dhbWJhcmthbiBrZW11bmdraW5hbiBtZW5kYXBhdGthbiBoYXNpbCBzYW1wZWwgeWFuZyBla3N0cmVtIGF0YXUgbGViaWggZWtzdHJlbSBkYXJpIGhhc2lsIHlhbmcgZGlhbWF0aSwgZGVuZ2FuIGFzdW1zaSBiYWh3YSDwnZC7MCBiZW5hci4gU2VtYWtpbiBrZWNpbCBuaWxhaS3wnZGdLCBzZW1ha2luIGt1YXQgYnVrdGkgdW50dWsgbWVub2xhayDwnZC7MC4NCg0KKiBIaXR1bmcgbmlsYWkgc3RhdGlzdGlrIHVqaSBiZXJkYXNhcmthbiBkYXRhIHNhbXBlbC4NCg0KKiBCYW5kaW5na2FuIG5pbGFpIHN0YXRpc3RpayB1amkgZGVuZ2FuIG5pbGFpIGtyaXRpa2FsIGRhcmkgdGFiZWwgZGlzdHJpYnVzaSB5YW5nIHJlbGV2YW4sIGF0YXUgZ3VuYWthbiBwLXZhbHVlIHVudHVrIG1lbmVudHVrYW4gc2lnbmlmaWthbnNpLg0KDQoqKjUuIE1lbWJ1YXQgS2VwdXR1c2FuIGRhbiBNZW55aW1wdWxrYW4gSGFzaWwqKg0KDQoqIEppa2EgbmlsYWkgc3RhdGlzdGlrIHVqaSBiZXJhZGEgZGkgbHVhciByZW50YW5nIG5pbGFpIGtyaXRpa2FsIChhdGF1IGppa2EgcC12YWx1ZSDiiaQgzrEpLCBtYWthIHRvbGFrIEgwLg0KDQoqIEppa2EgbmlsYWkgc3RhdGlzdGlrIHVqaSBiZXJhZGEgZGFsYW0gcmVudGFuZyBuaWxhaSBrcml0aWthbCAoYXRhdSBqaWthIHAtdmFsdWUgPiDOsSksIG1ha2EgZ2FnYWwgbWVub2xhayBIMC4gDQoNCiogVHVsaXMga2VzaW1wdWxhbiBkYWxhbSBrb250ZWtzIHBlbmVsaXRpYW4uDQoNCkF0dXJhbiBLZXB1dHVzYW46DQoNCiogSmlrYSDwnZGdIOKJpCDwnZu8OiBUb2xhayDwnZC7MCAoZGF0YSBtZW1iZXJpa2FuIGJ1a3RpIHNpZ25pZmlrYW4gbWVuZHVrdW5nIPCdkLvwnZGOKS4NCg0KKiBKaWthIPCdkZ0gPiDwnZu8OiBHYWdhbCBtZW5vbGFrIPCdkLswIChkYXRhIHRpZGFrIGN1a3VwIHVudHVrIG1lbmR1a3VuZyDwnZC78J2RjikuDQoNCg0KIyMjIEFsYXNhbiBtZW5nYXBhIEhpcG90ZXNpcyBwZW50aW5nIGRhbGFtIGFuYWxpc2lzIGRhdGE6DQoxLiAqKk1lbWJhbnR1IE1lbWJ1YXQgS2VwdXR1c2FuIEJlcmRhc2Fya2FuIERhdGEqKg0KDQpVamkgaGlwb3Rlc2lzIG1lbXVuZ2tpbmthbiBwZW5nYW1iaWxhbiBrZXB1dHVzYW4geWFuZyBkaWR1a3VuZyBvbGVoIGJ1a3RpIHN0YXRpc3RpaywgYnVrYW4gaGFueWEgYmVyZGFzYXJrYW4gaW50dWlzaSBhdGF1IGFzdW1zaS4NCg0KMi4gKipNZW5nZXZhbHVhc2kgS2xhaW0gYXRhdSBUZW9yaSoqDQoNClVqaSBoaXBvdGVzaXMgZGlndW5ha2FuIHVudHVrIG1lbmd1amkga2ViZW5hcmFuIGtsYWltIGF0YXUgdGVvcmkgeWFuZyBkaWFqdWthbi4NCg0KMy4gKipNZW5ndWt1ciBLZXRpZGFrcGFzdGlhbioqDQoNCkRhbGFtIGFuYWxpc2lzIGRhdGEsIHNlbGFsdSBhZGEgdW5zdXIga2V0aWRha3Bhc3RpYW4ga2FyZW5hIGRhdGEgYmlhc2FueWEgYmVyYXNhbCBkYXJpIHNhbXBlbCwgYnVrYW4gcG9wdWxhc2kgc2VsdXJ1aG55YS4NCg0KNC4gKipNZW5pbmdrYXRrYW4gS2VwZXJjYXlhYW4gcGFkYSBIYXNpbCoqDQoNCkRlbmdhbiBtZW5nZ3VuYWthbiB1amkgaGlwb3Rlc2lzLCBoYXNpbCBhbmFsaXNpcyBtZW5qYWRpIGxlYmloIGRhcGF0IGRpcGVyY2F5YSwga2FyZW5hIGRpZHVrdW5nIG9sZWggbWV0b2RlIGlsbWlhaCBkYW4gc3RhdGlzdGlrIHlhbmcgdGVsYWggdGVydWppLg0KDQojIyAqKjYuIFBlbmdndW5hYW4gU29mdHdhcmUgU3RhdGlzdGlrYSoqDQoNCiMjIyAqKlRvb2xzIHVudHVrIEFuYWxpc2lzIFN0YXRpc3Rpa2EqKg0KDQotIFNQU1MgKFN0YXRpc3RpY2FsIFBhY2thZ2UgZm9yIHRoZSBTb2NpYWwgU2NpZW5jZXMpDQotIFIgUHJvZ3JhbW1pbmcNCi0gUHl0aG9uDQotIFN0YXRhDQotIE1BVExBQg0KLSBFeGNlbA0KLSBTQVMNCg0KIyMjICoqS2V1bmdndWxhbiBSIFByb2dyYW1taW5nKioNClIgUHJvZ3JhbW1pbmcgbWVydXBha2FuIHNhbGFoIHNhdHUgYWxhdCB5YW5nIHNhbmdhdCBrdWF0IGRhbiBmbGVrc2liZWwgdW50dWsgYW5hbGlzaXMgc3RhdGlzdGlrLiBCZXJpa3V0IGFkYWxhaCBiZWJlcmFwYSBrZXVuZ2d1bGFuIGRhcmkgUjoNCg0KLSAqKk9wZW4tc291cmNlIGRhbiBHcmF0aXM6KiogUiBhZGFsYWggcGVyYW5na2F0IGx1bmFrIHlhbmcgZGFwYXQgZGl1bmR1aCBkYW4gZGlndW5ha2FuIHNlY2FyYSBncmF0aXMsIG1lbWJ1YXRueWEgc2FuZ2F0IHRlcmphbmdrYXUgYmFnaSBpbmRpdmlkdSBkYW4gaW5zdGl0dXNpLg0KLSAqKktvbXVuaXRhcyBCZXNhcjoqKiBSIG1lbWlsaWtpIGtvbXVuaXRhcyBwZW5nZ3VuYSB5YW5nIGx1YXMsIHlhbmcgYmVya29udHJpYnVzaSBkZW5nYW4gcmlidWFuIHBha2V0IGRhbiBwdXN0YWthIHVudHVrIGFuYWxpc2lzIGRhdGEgbGFuanV0YW4sIHBlbW9kZWxhbiBzdGF0aXN0aWssIGRhbiB2aXN1YWxpc2FzaSBkYXRhIGtvbXBsZWtzMTQuDQotICoqS2VtYW1wdWFuIEFuYWxpc2lzIENhbmdnaWg6KiogUiBtZW5hd2Fya2FuIGJlcmJhZ2FpIG1ldG9kZSBhbmFsaXNpcyBzdGF0aXN0aWssIHRlcm1hc3VrIGFuYWxpc2lzIHJlZ3Jlc2ksIGFuYWxpc2lzIG11bHRpdmFyaWF0LCBkYW4gdGVrbmlrIHBlbW9kZWxhbiBwcmVkaWt0aWYuIEluaSBtZW11bmdraW5rYW4gcGVuZ2d1bmEgdW50dWsgbWVsYWt1a2FuIGFuYWxpc2lzIHlhbmcgbWVuZGFsYW0gZGFuIGtvbXBsZWtzMTYuDQotICoqVmlzdWFsaXNhc2kgRGF0YToqKiBEZW5nYW4gcGFrZXQgc2VwZXJ0aSBnZ3Bsb3QyLCBSIG1lbnllZGlha2FuIGFsYXQgeWFuZyBzYW5nYXQgYmFpayB1bnR1ayBtZW1idWF0IHZpc3VhbGlzYXNpIGRhdGEgeWFuZyBtZW5hcmlrIGRhbiBpbmZvcm1hdGlmMjQuDQotICoqRmxla3NpYmlsaXRhcyBkYWxhbSBQZW1yb2dyYW1hbjoqKiBNZXNraXB1biBtZW1lcmx1a2FuIHBlbWFoYW1hbiB0ZW50YW5nIHBlbXJvZ3JhbWFuLCBSIG1lbWJlcmlrYW4gZmxla3NpYmlsaXRhcyB0aW5nZ2kgZGFsYW0gcGVuZ29sYWhhbiBkYXRhIGRhbiBhbmFsaXNpcyBzdGF0aXN0aWsxMy4NCg0KS2FyZW5hIGtldW5nZ3VsYW4ta2V1bmdndWxhbiBpbmksIFIgbWVuamFkaSBwaWxpaGFuIHBvcHVsZXIgZGkga2FsYW5nYW4gcGVuZWxpdGksIGFuYWxpcyBkYXRhLCBkYW4gaWxtdXdhbiBkaSBiZXJiYWdhacKgYmlkYW5nLg0KDQojIyAqKjcuIEludGVycHJldGFzaSBTdGF0aXN0aWsqKiANCg0KVW50dWsgbWVuZ2FuYWxpc2lzIGRhbiBtZW5naW50ZXJwcmV0YXNpa2FuIGhhc2lsIGRhcmkgZGF0YSB5YW5nIGRpYmVyaWthbiwgbWFyaSBraXRhIGxpaGF0IG5pbGFpLW5pbGFpIHN0YXRpc3RpayB5YW5nIHRlbGFoIGRpc2VkaWFrYW46DQoNCk1lYW4gKFJhdGEtcmF0YSk6IDc1DQoNCk1lZGlhbjogNzINCg0KU3RhbmRhciBEZXZpYXNpOiAxMA0KDQoxLiAqKkludGVycHJldGFzaSBIYXNpbCoqDQotICoqTWVhbiB2cy4gTWVkaWFuOioqDQpSYXRhLXJhdGEgKG1lYW4pIHNlYmVzYXIgNzUgbWVudW5qdWtrYW4gbmlsYWkgcmF0YS1yYXRhIGRhcmkgc2VsdXJ1aCBkYXRhLiBNZWRpYW4gc2ViZXNhciA3MiBhZGFsYWggbmlsYWkgdGVuZ2FoIGtldGlrYSBkYXRhIGRpdXJ1dGthbi4gRGFsYW0gaGFsIGluaSwgbWVkaWFuIHlhbmcgbGViaWggcmVuZGFoIGRhcmkgbWVhbiBtZW51bmp1a2thbiBiYWh3YSBhZGEga2VtdW5na2luYW4gYWRhbnlhIHNrZXduZXNzIChrZW1pcmluZ2FuKSBkYWxhbSBkaXN0cmlidXNpIGRhdGEuDQotICoqU3RhbmRhciBEZXZpYXNpOioqDQpTdGFuZGFyIGRldmlhc2kgc2ViZXNhciAxMCBtZW51bmp1a2thbiBzZWJlcmFwYSBqYXVoIG5pbGFpLW5pbGFpIGRhbGFtIGRhdGFzZXQgdGVyc2ViYXIgZGFyaSByYXRhLXJhdGFueWEuIE5pbGFpIGluaSBtZW51bmp1a2thbiBiYWh3YSB0ZXJkYXBhdCB2YXJpYXNpIHlhbmcgY3VrdXAgc2lnbmlmaWthbiBkYWxhbSBkYXRhLg0KDQoyLiAqKktlc2ltcHVsYW4gdGVudGFuZyBEaXN0cmlidXNpIERhdGEqKg0KDQpCZXJkYXNhcmthbiBwZXJiYW5kaW5nYW4gYW50YXJhIG1lYW4gZGFuIG1lZGlhbiwgc2VydGEgaW5mb3JtYXNpIHRlbnRhbmcgc3RhbmRhciBkZXZpYXNpLCBraXRhIGRhcGF0IG1lbmFyaWsgYmViZXJhcGEga2VzaW1wdWxhbiB0ZW50YW5nIGRpc3RyaWJ1c2kgZGF0YToNCg0KLSAqKktlbWlyaW5nYW4gUG9zaXRpZjoqKiBLYXJlbmEgbWVhbiAoNzUpIGxlYmloIGJlc2FyIGRhcmlwYWRhIG1lZGlhbiAoNzIpLCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGRpc3RyaWJ1c2kgZGF0YSBrZW11bmdraW5hbiBtZW1pbGlraSBrZW1pcmluZ2FuIHBvc2l0aWYgKHJpZ2h0LXNrZXdlZCkuIEFydGlueWEsIHRlcmRhcGF0IGJlYmVyYXBhIG5pbGFpIHlhbmcgbGViaWggdGluZ2dpIHlhbmcgbWVuYXJpayByYXRhLXJhdGEga2UgYXRhcy4NCg0KLSAqKlZhcmlhYmlsaXRhcyBEYXRhOioqIFN0YW5kYXIgZGV2aWFzaSB5YW5nIGN1a3VwIGJlc2FyICgxMCkgbWVudW5qdWtrYW4gYmFod2EgZGF0YSB0aWRhayBoYW55YSB0ZXJwdXNhdCBkaSBzZWtpdGFyIG1lYW4gdGV0YXBpIGp1Z2EgbWVtaWxpa2kgcGVueWViYXJhbiB5YW5nIGx1YXMuIEluaSBiZXJhcnRpIGFkYSB2YXJpYXNpIHlhbmcgc2lnbmlmaWthbiBkYWxhbSBuaWxhaS1uaWxhaSBpbmRpdmlkdSBkYWxhbSBkYXRhc2V0Lg0KDQoqKlJpbmdrYXNhbioqDQoNClNlY2FyYSBrZXNlbHVydWhhbiwgZGlzdHJpYnVzaSBkYXRhIGluaSB0YW1wYWtueWEgbWVtaWxpa2kga2VtaXJpbmdhbiBwb3NpdGlmIGRlbmdhbiB2YXJpYXNpIHlhbmcgY3VrdXAgYmVzYXIuIEhhbCBpbmkgcGVudGluZyB1bnR1ayBkaXBlcnRpbWJhbmdrYW4gZGFsYW0gYW5hbGlzaXMgbGViaWggbGFuanV0LCB0ZXJ1dGFtYSBqaWthIGtpdGEgaW5naW4gbWVsYWt1a2FuIGluZmVyZW5zaSBhdGF1IG1lbWJ1YXQga2VwdXR1c2FuIGJlcmRhc2Fya2FuwqBkYXRhwqBpbmkuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5IHlhbmcgZGlidXR1aGthbg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFyYW1ldGVyIERhdGEgTm9ybWFsDQptZWFuX25vcm1hbCA8LSAwDQpzZF9ub3JtYWwgPC0gMQ0Kbl9ub3JtYWwgPC0gMTAwMA0KDQojIFBhcmFtZXRlciBEYXRhIFRpZGFrIE5vcm1hbA0KbWVhbl9ub3Rfbm9ybWFsIDwtIDENCnNkX25vdF9ub3JtYWwgPC0gMC41DQpuX25vdF9ub3JtYWwgPC0gMTAwMA0KDQojIE1lbWJ1YXQgZGF0YSBzaW11bGFzaQ0Kc2V0LnNlZWQoNDIpICAjIFVudHVrIGhhc2lsIHlhbmcga29uc2lzdGVuDQpkYXRhX25vcm1hbCA8LSBybm9ybShuX25vcm1hbCwgbWVhbiA9IG1lYW5fbm9ybWFsLCBzZCA9IHNkX25vcm1hbCkNCmRhdGFfbm90X25vcm1hbCA8LSBybm9ybShuX25vdF9ub3JtYWwsIG1lYW4gPSBtZWFuX25vdF9ub3JtYWwsIHNkID0gc2Rfbm90X25vcm1hbCkNCg0KIyBHYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgbmlsYWkgPSBjKGRhdGFfbm9ybWFsLCBkYXRhX25vdF9ub3JtYWwpLA0KICBrYXRlZ29yaSA9IGMocmVwKCJEYXRhIE5vcm1hbCIsIG5fbm9ybWFsKSwgcmVwKCJEYXRhIFRpZGFrIE5vcm1hbCIsIG5fbm90X25vcm1hbCkpDQopDQoNCiMgTWVtYnVhdCBoaXN0b2dyYW0gZGVuZ2FuIGdncGxvdDIsIG1lbmdnYW50aSB3YXJuYSBkYW4gZ2F5YSB2aXN1YWwNCnAgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gbmlsYWksIGZpbGwgPSBrYXRlZ29yaSkpICsNCiAgIyBNZW5nZ3VuYWthbiBoaXN0b2dyYW0gZGVuZ2FuIHdhcm5hIHlhbmcgYmVyYmVkYQ0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInNreWJsdWUiLCAib3JhbmdlIikpICsgICMgTWVuZ2dhbnRpIHdhcm5hDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSGlzdG9ncmFtIERhdGEgTm9ybWFsIGRhbiBUaWRhayBOb3JtYWwiLA0KICAgIHggPSAiTmlsYWkiLA0KICAgIHkgPSAiRnJla3VlbnNpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNSkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpDQogICkNCg0KIyBNZW5hbWJhaGthbiBpbnRlcmFrdGl2aXRhcyBkZW5nYW4gcGxvdGx5DQpwX2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHApDQoNCiMgTWVuYW1waWxrYW4gZ3JhZmlrIGludGVyYWt0aWYNCnBfaW50ZXJhY3RpdmUNCg0KYGBgDQoNCg0KIyMgKio4LiBDb250b2ggS2FzdXMqKg0KDQojIyMgMS4gRGVza3JpcHNpIERhdGEgKERlc2tyaXB0aWYpDQoNCiMjIyMgS2Vsb21wb2sgQSAoSmFtIFBlbGF0aWhhbiwgWCk6DQoNCipEYXRhKjogMiwgNCwgNiwgOCwgMTAgIA0KDQoqUmF0YS1yYXRhIChYLWJhcikqOiAgDQpcWw0KXGJhcntYfSA9IFxmcmFje1xzdW0gWH17bn0gPSBcZnJhY3syICsgNCArIDYgKyA4ICsgMTB9ezV9ID0gNi4wDQpcXQ0KDQoqU3RhbmRhciBkZXZpYXNpIChzKSo6ICANClxbDQpzID0gXHNxcnR7XGZyYWN7XHN1bSAoWF9pIC0gXGJhcntYfSleMn17bi0xfX0NClxdDQpcWw0KcyA9IFxzcXJ0e1xmcmFjeygyLTYpXjIgKyAoNC02KV4yICsgKDYtNileMiArICg4LTYpXjIgKyAoMTAtNileMn17NH19ID0gMy4xNg0KXF0NCg0KDQojIyMjIEtlbG9tcG9rIEEgKFByb2R1a3Rpdml0YXMsIFkpOg0KDQoqRGF0YSo6IDU1LCA2MCwgNjUsIDcwLCA3NSAgDQoNCipSYXRhLXJhdGEgKFnMhCkqOiAgDQpcWw0KXGJhcntZfSA9IFxmcmFjezU1ICsgNjAgKyA2NSArIDcwICsgNzV9ezV9ID0gNjUuMA0KXF0NCg0KKlN0YW5kYXIgZGV2aWFzaSAocykqOiAgDQpcWw0KcyA9IFxzcXJ0e1xmcmFje1xzdW0gKFlfaSAtIFxiYXJ7WX0pXjJ9e24tMX19DQpcXQ0KXFsNCnMgPSBcc3FydHtcZnJhY3soNTUtNjUpXjIgKyAoNjAtNjUpXjIgKyAoNjUtNjUpXjIgKyAoNzAtNjUpXjIgKyAoNzUtNjUpXjJ9ezR9fSA9IDcuOTENClxdDQoNCg0KIyMjIyBLZWxvbXBvayBCIChQcm9kdWt0aXZpdGFzLCBZKToNCg0KKkRhdGEqOiA1MCwgNTIsIDUzLCA1NCwgNTUgIA0KDQoqUmF0YS1yYXRhIChZzIQpKjogIA0KXFsNClxiYXJ7WX0gPSBcZnJhY3s1MCArIDUyICsgNTMgKyA1NCArIDU1fXs1fSA9IDUyLjgNClxdDQoNCipTdGFuZGFyIGRldmlhc2kgKHMpKjogIA0KXFsNCnMgPSBcc3FydHtcZnJhY3tcc3VtIChZX2kgLSBcYmFye1l9KV4yfXtuLTF9fQ0KXF0NClxbDQpzID0gXHNxcnR7XGZyYWN7KDUwLTUyLjgpXjIgKyAoNTItNTIuOCleMiArICg1My01Mi44KV4yICsgKDU0LTUyLjgpXjIgKyAoNTUtNTIuOCleMn17NH19ID0gMS45Mg0KXF0NCg0KDQojIyMgMi4gS29yZWxhc2kgYW50YXJhIEphbSBQZWxhdGloYW4gKFgpIGRhbiBQcm9kdWt0aXZpdGFzIChZKSBwYWRhIEtlbG9tcG9rIEENCg0KKlJ1bXVzIGtvcmVsYXNpIFBlYXJzb24qOiAgDQpcWw0KciA9IFxmcmFje1xzdW17KFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfX17XHNxcnR7XHN1bXsoWF9pIC0gXGJhcntYfSleMn0gXGNkb3QgXHN1bXsoWV9pIC0gXGJhcntZfSleMn19fQ0KXF0NCg0KIyMjIyBMYW5na2FoLUxhbmdrYWg6DQoxLiAqUGVueWVidXQqOiAgDQpcWw0KXHN1bSAoWF9pIC0gXGJhcntYfSleMiA9ICgyLTYpXjIgKyAoNC02KV4yICsgKDYtNileMiArICg4LTYpXjIgKyAoMTAtNileMiA9IDQwDQpcXQ0KXFsNClxzdW0gKFlfaSAtIFxiYXJ7WX0pXjIgPSAoNTUtNjUpXjIgKyAoNjAtNjUpXjIgKyAoNjUtNjUpXjIgKyAoNzAtNjUpXjIgKyAoNzUtNjUpXjIgPSAyNTANClxdDQoNCjIuICpQZW1iaWxhbmcqOiAgDQpcWw0KXHN1bSAoWF9pIC0gXGJhcntYfSkoWV9pIC0gXGJhcntZfSkgPSAoMi02KSg1NS02NSkgKyAoNC02KSg2MC02NSkgKyBcZG90cyArICgxMC02KSg3NS02NSkgPSAxMDANClxdDQoNCjMuICpLb3JlbGFzaSAocikqOiAgDQpcWw0KciA9IFxmcmFjezEwMH17XHNxcnR7NDAgXGNkb3QgMjUwfX0gPSAxLjANClxdDQoNCipJbnRlcnByZXRhc2kqOiAgDQpLb3JlbGFzaSBzZW1wdXJuYSBwb3NpdGlmIGFudGFyYSBqYW0gcGVsYXRpaGFuIGRhbiBwcm9kdWt0aXZpdGFzLg0KDQoNCiMjIyAzLiBVamkgSGlwb3Rlc2lzIHVudHVrIE1lbWJhbmRpbmdrYW4gUHJvZHVrdGl2aXRhcyBLZWxvbXBvayBBIGRhbiBCDQoNCipIaXBvdGVzaXMqOiAgDQotIEjigoA6IM68X0EgPSDOvF9CIChSYXRhLXJhdGEgcHJvZHVrdGl2aXRhcyBzYW1hKS4gIA0KLSBI4oKBOiDOvF9BID4gzrxfQiAoUmF0YS1yYXRhIHByb2R1a3Rpdml0YXMgS2Vsb21wb2sgQSBsZWJpaCBiZXNhcikuDQoNCiMjIyMgTGFuZ2thaC1MYW5na2FoOg0KMS4gKkRhdGEgUmF0YS1yYXRhIGRhbiBTdGFuZGFyIERldmlhc2kqOiAgDQogICAtIEtlbG9tcG9rIEE6IFjMhF9BID0gNjUuMCwgc19BID0gNy45MSwgbl9BID0gNSAgDQogICAtIEtlbG9tcG9rIEI6IFjMhF9CID0gNTIuOCwgc19CID0gMS45Miwgbl9CID0gNQ0KDQoyLiAqVmFyaWFucyBHYWJ1bmdhbiAoc+KCmsKyKSo6ICANClxbDQpzX3BeMiA9IFxmcmFjeyhuX0EtMSlzX0FeMiArIChuX0ItMSlzX0JeMn17bl9BICsgbl9CIC0gMn0NClxdDQpcWw0Kc19wXjIgPSBcZnJhY3soNS0xKSg3LjkxXjIpICsgKDUtMSkoMS45Ml4yKX17NSs1LTJ9ID0gMzIuMjMNClxdDQoNCjMuICpTdGF0aXN0aWsgdCo6ICANClxbDQp0ID0gXGZyYWN7XGJhcntYfV9BIC0gXGJhcntYfV9CfXtcc3FydHtzX3BeMiBcbGVmdChcZnJhY3sxfXtuX0F9ICsgXGZyYWN7MX17bl9CfVxyaWdodCl9fQ0KXF0NClxbDQp0ID0gXGZyYWN7NjUuMCAtIDUyLjh9e1xzcXJ0ezMyLjIzIFxsZWZ0KFxmcmFjezF9ezV9ICsgXGZyYWN7MX17NX1ccmlnaHQpfX0gPSAzLjM1DQpcXQ0KDQo0LiAqTmlsYWkgcCo6ICANCkRlbmdhbiBwID0gMC4wMDUsIEjigoAgZGl0b2xhay4NCg0KKktlc2ltcHVsYW4qOiAgDQpSYXRhLXJhdGEgcHJvZHVrdGl2aXRhcyBLZWxvbXBvayBBIHNlY2FyYSBzaWduaWZpa2FuIGxlYmloIGJlc2FyIGRhcmlwYWRhIEtlbG9tcG9rIEIgKHAgPCAwLjA1KS4NCg0KDQojIyAqKjkuIEtlc2ltcHVsYW4qKg0KbWVuZ2FuYWxpc2lzLCBkYW4gbWVuYXJpayBrZXNpbXB1bGFuIGRhcmkgaW5mb3JtYXNpIHlhbmcgdGVyc2VkaWEuIE1lbGFsdWkgbWV0b2RlIHN0YXRpc3Rpaywga2l0YSBkYXBhdCBtZW5naWRlbnRpZmlrYXNpIHBvbGEgZGFuIHRyZW4geWFuZyBtdW5na2luIHRpZGFrIHRlcmxpaGF0IHBhZGEgcGFuZGFuZ2FuIHBlcnRhbWEsIHNlcnRhIG1lbWJ1YXQga2VwdXR1c2FuIHlhbmcgbGViaWggaW5mb3JtYXNpb25hbCBiZXJkYXNhcmthbiBhbmFsaXNpcyB0ZXJzZWJ1dC4NCg0KU3RhdGlzdGlrYSBkYXNhciBkYXBhdCBkaXRlcmFwa2FuIGRhbGFtIGtlaGlkdXBhbiBzZWhhcmktaGFyaSBkYW4gZGkgdGVtcGF0IGtlcmphIGRlbmdhbiBiZXJiYWdhaSBjYXJhLCBzZXBlcnRpOg0KDQotIFBlbmdhbWJpbGFuIEtlcHV0dXNhbjogRGkgZHVuaWEgYmlzbmlzLCBhbmFsaXNpcyBkYXRhIG1lbWJhbnR1IGtpdGEgbWVtYWhhbWkgcHJvZHVrIG1hbmEgeWFuZyBwYWxpbmcgZGltaW5hdGkgZGFuIHByZWZlcmVuc2kga29uc3VtZW4sIHNlaGluZ2dhIGtlcHV0dXNhbiBzdHJhdGVnaXMgZGFwYXQgZGlhbWJpbC4NCg0KLSBFdmFsdWFzaSBLaW5lcmphOiBEYWxhbSBrb250ZWtzIHByb2Zlc2lvbmFsLCBraXRhIGRhcGF0IG1lbWFuZmFhdGthbiBzdGF0aXN0aWthIHVudHVrIG1lbmlsYWkga2luZXJqYSBrYXJ5YXdhbiwgbWVuZ2V2YWx1YXNpIGhhc2lsIHByb3llaywgYXRhdSBtZW5nYW5hbGlzaXMgdGluZ2thdCBrZXB1YXNhbiBwZWxhbmdnYW4uDQoNCi0gUGVyZW5jYW5hYW4gS2V1YW5nYW46IERhbGFtIGtlaGlkdXBhbiBzZWhhcmktaGFyaSwgcGVuZ2d1bmFhbiBzdGF0aXN0aWthIGRhcGF0IG1lbWJhbnR1IGtpdGEgbWVuZ2F0dXIgYW5nZ2FyYW4sIHNlcGVydGkgZGVuZ2FuIG1lbmdhbmFsaXNpcyBwZW5nZWx1YXJhbiBidWxhbmFuIHVudHVrIG1lbmdldGFodWkgYXJlYSB5YW5nIHBlcmx1IGRpdGluZ2thdGthbi4NCg0KLSBTZWNhcmEga2VzZWx1cnVoYW4sIHBlbWFoYW1hbiBkYXNhciB0ZW50YW5nIHN0YXRpc3Rpa2EgbWVtdW5na2lua2FuIGtpdGEgdW50dWsgbGViaWggZWZla3RpZiBkYWxhbSBtZW5pbGFpIHNpdHVhc2ksIG1lbmdhbWJpbCBrZXB1dHVzYW4geWFuZyBsZWJpaCBiYWlrLCBkYW4gbWVtYWhhbWkgZmVub21lbmEgZGkgc2VraXRhciBraXRhLg0KDQojIyAxMC4gTWluZCBNYXANCg0KPHN0eWxlPg0KICBib2R5IHsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQo8L3N0eWxlPg0KDQo8aW1nIHNyYz0iTWluZCBNYXAgVUFTLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6NTAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ii8+DQoNCg0KIyAqKlNvYWwgMiBTdHVkaSBLYXN1cyoqDQoNCkRlc2tyaXBzaSBLYXN1cw0KDQpQZXJ1c2FoYWFuIEZNQ0cgQW5kYSBpbmdpbiBtZW1haGFtaSBwb2xhIHBlbmp1YWxhbiBwcm9kdWsgQUJDIGRpIHdpbGF5YWggSkFCT0RFVEFCRUsgc2VsYW1hIDUgdGFodW4gdGVyYWtoaXIgdW50dWsgbWVuZ2VtYmFuZ2thbiBzdHJhdGVnaSBwZW1hc2FyYW4geWFuZyBsZWJpaCBlZmVrdGlmLiBEYXRhIGhpc3RvcmlzIG1lbGlwdXRpIGtvdGEta290YSBKYWthcnRhLCBCb2dvciwgRGVwb2ssIFRhbmdlcmFuZywNCmRhbiBCZWthc2kNCg0KKipEYXRhIEF3YWwqKg0KDQpEYXRhIFBlbmp1YWxhbiBBQkMNCg0KRGF0YXNldCBQZW5qdWFsYW4gQUJDIHRlcmRpcmkgZGFyaSA2MCBidWxhbiAoNSB0YWh1biksIGRlbmdhbiBpbmZvcm1hc2kgbnVtZXJpayBkYW4ga2F0ZWdvcmlrIGJlcmlrdXQ6DQoNCuKAoiBLb3RhOiBMb2thc2kgcGVuanVhbGFuIGRpIEpBQk9ERVRBQkVLIChKYWthcnRhLCBCb2dvciwgRGVwb2ssIFRhbmdlcmFuZywgQmVrYXNpKS4NCg0K4oCiIFBlbmp1YWxhbiAodW5pdCk6IFRvdGFsIHVuaXQgcHJvZHVrIHRlcmp1YWwgcGVyIGJ1bGFuLg0KDQrigKIgQmlheWEgUHJvbW9zaSAoJCk6IEFuZ2dhcmFuIHByb21vc2kgZGkgd2lsYXlhaCB0ZXJzZWJ1dC4NCg0K4oCiIERpc2tvbiAoJSk6IEJlc2FyYW4gZGlza29uIHlhbmcgZGliZXJpa2FuIHVudHVrIHByb2R1ay4NCg0K4oCiIFJhdGluZyBQZWxhbmdnYW4gKDEtNSk6IFBlbmlsYWlhbiBwZWxhbmdnYW4gYmVyZGFzYXJrYW4gc3VydmVpLg0KDQrigKIgSmVuaXMgT3V0bGV0OiBNb2Rlcm4gKHN1cGVybWFya2V0LCBtaW5pbWFya2V0KSBhdGF1IFRyYWRpc2lvbmFsICh3YXJ1bmcsIHBhc2FyKS4NCg0K4oCiIEthdGVnb3JpIFByb2R1azogTWFrYW5hbiwgTWludW1hbixhdGF1IEtlc2VoYXRhbi4NCg0KYGBge3IsIG1hc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbXVhdCBkYXRhc2V0IGRhcmkgQ1NWDQpkYXRhIDwtIHJlYWQuY3N2KCJQZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdiIpDQoNCiMgTWVuYW1waWxrYW4gZGF0YSBhd2FsIGRlbmdhbiBrYWJsZQ0KaGVhZChkYXRhKQ0KYGBgDQoNCg0KIyMgKioxLiBTdGF0aXN0aWsgRGVza3JpcHRpZioqDQoNCkhpdHVuZyBtZWFuLCBtZWRpYW4sIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgdmFyaWFiZWwgUGVuanVhbGFuICh1bml0KSwgQmlheWEgUHJvbW9zaSAoJCksIGRhbiBSYXRpbmcgUGVsYW5nZ2FuIHBlciB0YWh1biBkaSBzZXRpYXAga290YS4NCklkZW50aWZpa2FzaSBrb3RhIGRlbmdhbiBwZXJ0dW1idWhhbiBwZW5qdWFsYW4gdGVydGluZ2dpIGRhbiB0ZXJlbmRhaCBzZWxhbWEgcGVyaW9kZSA1IHRhaHVuLg0KDQojIyMgKioxLiBsYW5na2FoLWxhbmdrYWggUGVyaGl0dW5nYW4qKg0KDQoNCioqUnVtdXM6KioNCg0KIyMjIyAxLiBNZW5naGl0dW5nIFJhdGEtcmF0YSAoTWVhbik6DQpSdW11czoNClxbDQpcdGV4dHtSYXRhLXJhdGF9ID0gXGZyYWN7XHRleHR7SnVtbGFoIHNlbXVhIG5pbGFpfX17XHRleHR7SnVtbGFoIGRhdGF9fQ0KXF0NCg0KIyMjIyMgTWVuZ2hpdHVuZyBSYXRhLXJhdGEgUGVuanVhbGFuIEtvdGEgSmFrYXJ0YSAoMjAxOCkNCkRhdGEgUGVuanVhbGFuIEtvdGEgSmFrYXJ0YSgyMDE4KTogDQoNCiQxMDM5MiwgMTE0NjIsIDk3MTcsIDEyMzUzLCAxMDU1MSwgOTk1NywgMTA0MDgsIDE0MDA1LCA2MDAxLCAxMTA5MywgMTA4NjAsIDgyMTckDQoNCg0KTGFuZ2thaC1sYW5na2FoOg0KMS4gSGl0dW5nIGp1bWxhaCBzZW11YSBuaWxhaToNCg0KJDEwMzkyKzExNDYyKzk3MTcrMTIzNTMrMTA1NTErOTk1NysxMDQwOCsxNDAwNSs2MDAxKzExMDkzKzEwODYwKzgyMTc9MTI1MDE2JA0KDQoyLiBIaXR1bmcganVtbGFoIGRhdGE6DQoNCkp1bWxhaCBEYXRhID0gMTINCg0KMy4gTWFzdWtrYW4ga2UgcnVtdXM6DQoNClxbDQpcdGV4dHtSYXRhLXJhdGEgUGVuanVhbGFuIEtvdGEgSmFrYXJ0YSAoMjAxOCl9ID0gXGZyYWN7MTI1LDAxNg0KfXsxMn0gPSAxMCw0MTgNClxdDQoNCiMjIyMgMi4gTWVuZ2hpdHVuZyBOaWxhaSBUZW5nYWggKE1lZGlhbik6DQpSdW11cyAoR2FuamlsKToNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBcdGV4dHtOaWxhaSBQb3Npc2kgTWVkaWFufQ0KXF0NCg0KUnVtdXMgKEdlbmFwKToNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBcZnJhY3tcdGV4dHtOaWxhaSBQb3Npc2kgTWVkaWFufSA9IFxmcmFje259ezJ9ICsgXGZyYWN7bn17Mn0gKyAxfXsyfQ0KXF0NCg0KIyMjIyMgTWVuZ2hpdHVuZyBNZWRpYW4gUGVuanVhbGFuIEtvdGEgSmFrYXJ0YSAoMjAxOCkNCkRhdGEgUGVuanVhbGFuIEtvdGEgSmFrYXJ0YSgyMDE4KSB5YW5nIGRpdXJ1dGthbjogDQoNCiQ2MDAxLCA4MjE3LCA5NzE3LCA5OTU3LCAxMDM5MiwgMTA0MDgsIDEwNTUxLCAxMDg2MCwgMTEwOTMsIDExNDYyLCAxMjM1MywgMTQwMDUkDQoNCkthcmVuYSBqdW1sYWggZGF0YSAoJPCdkZs9IDEyJCkgYWRhbGFoIGdlbmFwLCBndW5ha2FuIHJ1bXVzIHVudHVrIG1lY2FyaSBwb3Npc2kgbWVkaWFuOg0KDQpcWw0KXHRleHR7UG9zaXNpIE1lZGlhbn0gPSBcZnJhY3tufXsyfSBkYW4gXGZyYWN7bn17Mn0gKyAxDQpcXQ0KDQpcWw0KXHRleHR7UG9zaXNpIE1lZGlhbn0gPSBcZnJhY3sxMn17Mn0gZGFuIFxmcmFjezEyfXsyfSArIDENClxdDQoNClxbDQpcdGV4dHtQb3Npc2kgTWVkaWFufSA9IFx0ZXh0e0RhdGEga2UtNiBkYW4gRGF0YSBrZS03fQ0KXF0NCg0KXFsNClx0ZXh0e0RhdGEga2UtNn0gPSAxMDQwOCwgXHRleHR7RGF0YSBrZS03fSA9IDEwNTUxDQpcXQ0KDQpcWw0KXHRleHR7TWVkaWFufSA9IFxmcmFjezEwNDA4ICsgMTA1NTF9ezJ9ID0gMTA0NzkuNQ0KXF0NCg0KIyMjIyAzLiBNZW5naGl0dW5nIFN0YW5kYXIgRGV2aWFzaToNClJ1bXVzOg0KXFsNCnMgPSBcc3FydHtcZnJhY3tcc3VtICh4X2kgLSBcYmFye3h9KV4yfXtuLTF9fQ0KXF0NCg0KRGltYW5hOg0KDQotIFwoeF9pXCkgPSBzZW11YSBkYXRhIHlhbmcgYWthbiBkaWhpdHVuZw0KLSBcKFxiYXJ7WH1cKSA9IE1lYW4gKHJhdGEtcmF0YSkNCi0gbiA9IGp1bWxhaCBkYXRhDQoNCiMjIyMjIE1lbmdoaXR1bmcgU3RhbmRhciBEZXZpYXNpIFBlbmp1YWxhbiBLb3RhIEpha2FydGEgKDIwMTgpDQpNYXN1a2thbiBrZSBydW11czoNClxbDQpzID0gXHNxcnR7XGZyYWN7KDEwLDM5MiAtIDEwLDQxOCleMiArIC4uLiArICg4MjE3IC0gMTAsNDE4KV4yfXsxMi0xfX0NClxdDQpcWw0KcyA9IFxzcXJ0e1xmcmFjezY3NiArIC4uLiArIDQ4NDQ0MDF9ezExfX0NClxdDQpcWw0KcyA9IFxzcXJ0e1xmcmFjezQzNDI4Mzk2fXsxMX19DQpcXQ0KXFsNCnMgPSBcc3FydHszOTQ4MDM2fSA9IDE5ODYuOTY3DQpcXQ0KDQoNCiMjIyAqKjEuMiBSaW5na2FzYW4gU3RhdGlzdGlrIChqYWthcnRhKSoqDQoNCnwgVmFyaWFiZWwgICAgICAgICAgIHwgTWVhbiAgfCBNZWRpYW4gfCBTRCAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tfA0KfCBQZW5qdWFsYW4uVW5pdCAgICAgfCA1NDAwICB8IDU0MDAgICB8IDI4Mi44NCAgIHwNCnwgQmlheWEuUHJvbW9zaSAgICAgIHwgMTM0MCAgfCAxNDAwICAgfCAyMzIuMzggICB8DQp8IFJhdGluZy5QZWxhbmdnYW4gICB8IDQuNyAgIHwgNC43ICAgIHwgMC4xNiAgICAgfA0KDQoNCg0KIyMjIyAqKjEuMi4xIElkZW50aWZpa2FzaSBLb3RhIGRlbmdhbiBQZXJ0dW1idWhhbiBQZW5qdWFsYW4gVGVydGluZ2dpIGRhbiBUZXJlbmRhaCBTZWxhbWEgUGVyaW9kZSA1IFRhaHVuKioNCg0KQmVyZGFzYXJrYW4gZGF0YSB5YW5nIGRpYmVyaWthbiwga2l0YSBkYXBhdCBtZWxpaGF0IGJhaHdhIHVudHVrICoqS290YSBCb2dvcioqIGRhbiAqKktvdGEgSmFrYXJ0YSoqLCBwZW5qdWFsYW4gdGVsYWggZGloaXR1bmcgdW50dWsgc2V0aWFwIHRhaHVuIGRhcmkgMjAxOCBoaW5nZ2EgMjAyMi4gUGVydHVtYnVoYW4gcGVuanVhbGFuIGp1Z2EgdGVsYWggZGloaXR1bmcuDQoNCiMjIyMjICoqMS4yLjIgRGF0YSB5YW5nIERpYmVyaWthbioqDQoNCnwgS290YSAgICAgfCAyMDE4IHwgMjAxOSB8IDIwMjAgfCAyMDIxIHwgMjAyMiB8IFBlcnR1bWJ1aGFuIChHcm93dGgpIHwNCnwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS18LS0tLS0tfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IEJvZ29yICAgIHwgMzAwMCB8IDMyMDAgfCAzNDAwIHwgMzYwMCB8IDM4MDAgfCA4MDAgICAgICAgICAgICAgICAgICAgfA0KfCBKYWthcnRhICB8IDUwMDAgfCA1MjAwIHwgNTQwMCB8IDU2MDAgfCA1ODAwIHwgODAwICAgICAgICAgICAgICAgICAgIHwNCg0KIyMjIyMgKioxLjIuMyBQZXJoaXR1bmdhbjoqKg0KDQrigKIgS290YSBCb2dvcjoNCg0K4oCiIFBlbmp1YWxhbiAyMDE4OiAzMDAwIHVuaXQNCg0K4oCiIFBlbmp1YWxhbiAyMDIyOiAzODAwIHVuaXQNCg0K4oCiIFBlcnR1bWJ1aGFuIFBlbmp1YWxhbjoNCg0KJCQzODAwLTMwMDAgPSA4MDAgdW5pdCQkDQoNCuKAoiBLb3RhIEpha2FydGE6DQoNCuKAoiBQZW5qdWFsYW4gMjAxODogNTAwMCB1bml0DQoNCuKAoiBQZW5qdWFsYW4gMjAyMjogNTgwMCB1bml0DQoNCuKAoiBQZXJ0dW1idWhhbiBQZW5qdWFsYW46DQoNCiQkNTgwMC01MDAwID0gODAwIHVuaXQkJA0KDQojIyMjIyAqKjEuMi40IEhhc2lsIEFuYWxpc2lzOioqDQoNCi0gKipLb3RhIEpha2FydGEqKiBkYW4gKipLb3RhIEJvZ29yKiogbWVtaWxpa2kgcGVydHVtYnVoYW4gcGVuanVhbGFuIHlhbmcgc2FtYSwgeWFpdHUgKio4MDAgdW5pdCoqIGRhcmkgdGFodW4gMjAxOCBoaW5nZ2EgMjAyMi4NCg0KIyMjIyBQZXJ0dW1idWhhbiBQZW5qdWFsYW4gKEdyb3d0aCkNCk1lbnVuanVra2FuIHBlbmluZ2thdGFuIHBlbmp1YWxhbiBzZWxhbWEgcGVyaW9kZSA1IHRhaHVuIHlhbmcgc2FtYSBhbnRhcmEga2VkdWEga290YSBpbmksIGRlbmdhbiBqdW1sYWggcGVydHVtYnVoYW4geWFuZyBpZGVudGlrIG1lc2tpcHVuIG5pbGFpIHBlbmp1YWxhbiBhd2FsIGJlcmJlZGEuDQoNCi0gKipKYWthcnRhKiogbWVuZ2FsYW1pIHBlbmluZ2thdGFuIHlhbmcgbGViaWggYmVzYXIgZGFsYW0gcGVuanVhbGFuIHByb2R1ayBzZWxhbWEgcGVyaW9kZSA1IHRhaHVuICgyMDE4LTIwMjIpIGRlbmdhbiB0b3RhbCAqKjUuMDAwIHVuaXQqKi4NCi0gKipCb2dvcioqIG1lc2tpcHVuIGp1Z2EgbWVuZ2FsYW1pIHBlbmluZ2thdGFuLCBuYW11biBwZXJ0dW1idWhhbm55YSBsZWJpaCBrZWNpbCBkaWJhbmRpbmdrYW4gSmFrYXJ0YSwgeWFrbmkgaGFueWEgKiozLjIwMCB1bml0KiouDQoNCiMjIyMjIFRhYmVsIFBlcnR1bWJ1aGFuIFBlbmp1YWxhbiBQZXIgS290YSAoMjAxOC0yMDIyKQ0KDQp8IEtvdGEgICAgIHwgMjAxOCB8IDIwMTkgfCAyMDIwIHwgMjAyMSB8IDIwMjIgfCBHcm93dGggfA0KfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLXwtLS0tLS18LS0tLS0tfC0tLS0tLXwtLS0tLS0tLXwNCnwgQm9nb3IgICAgfCAzMDAwIHwgMzIwMCB8IDM0MDAgfCAzNjAwIHwgMzgwMCB8IDgwMCAgICB8DQp8IEpha2FydGEgIHwgNTAwMCB8IDUyMDAgfCA1NDAwIHwgNTYwMCB8IDU4MDAgfCA4MDAgICAgfA0KDQoNCiMjICoqMi4gUG9sYSBkYW4gVHJlbiBNdXNpbWFuKioNCg0K4oCiIEFuYWxpc2lzIHBvbGEgdHJlbiBwZW5qdWFsYW4gdGFodW5hbjogYXBha2FoIGFkYSBwb2xhIHBlbmluZ2thdGFuIGF0YXUgcGVudXJ1bmFuIHNpZ25pZmlrYW4/DQoNCuKAoiBBbmFsaXNpcyBtdXNpbWFuIChzZWFzb25hbCk6IGFwYWthaCBhZGEgYnVsYW4gYXRhdSBrdWFydGFsIGRlbmdhbiBwZW5pbmdrYXRhbiBwZW5qdWFsYW4gZGkgc2VtdWEga290YT8NCg0KIyMjIEFuYWxpc2lzIFBvbGEgVHJlbiBQZW5qdWFsYW4gVGFodW5hbg0KDQpNZW5nZ3VuYWthbiBkaWFncmFtIGdhcmlzIHVudHVrIG1lbXBlcm11ZGFoIGFuYWxpc2lzIHBvbGEgZGFuIHRyZW4gcGVuanVhbGFuIHRhaHVuYW4uDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgTG9hZCBkYXRhDQpkYXRhIDwtIHJlYWQuY3N2KCJQZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdiIpDQoNCg0KIyBIaXR1bmcgdG90YWwgcGVuanVhbGFuIHBlciB0YWh1bg0KYW5udWFsX3NhbGVzIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KFRhaHVuKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX1Blbmp1YWxhbiA9IHN1bShQZW5qdWFsYW4uLnVuaXQuKSkNCg0KDQoNCiMgTW9kZWwgcmVncmVzaSBsaW5lYXIgdW50dWsgYW5hbGlzaXMgdHJlbg0KbW9kZWwgPC0gbG0oVG90YWxfUGVuanVhbGFuIH4gVGFodW4sIGRhdGEgPSBhbm51YWxfc2FsZXMpDQphbm51YWxfc2FsZXMkUHJlZGljdGVkIDwtIHByZWRpY3QobW9kZWwpDQoNCiMgRm9ybWF0IGRhdGEgdW50dWsgdG9vbHRpcA0KYW5udWFsX3NhbGVzIDwtIGFubnVhbF9zYWxlcyAlPiUNCiAgbXV0YXRlKA0KICAgIFRvb2x0aXBfRGF0YSA9IHBhc3RlKA0KICAgICAgIlRhaHVuOiAiLCBUYWh1biwNCiAgICAgICI8YnI+VG90YWwgUGVuanVhbGFuOiAiLCBUb3RhbF9QZW5qdWFsYW4sDQogICAgICAiPGJyPlByZWRpa3NpIFRyZW46ICIsIHJvdW5kKFByZWRpY3RlZCwgMikNCiAgICApDQogICkNCg0KIyBCdWF0IGdyYWZpayBpbnRlcmFrdGlmIGRlbmdhbiBQbG90bHkNCnBsb3RseV9wbG90IDwtIHBsb3RfbHkoDQogIGFubnVhbF9zYWxlcywgDQogIHggPSB+VGFodW4sIA0KICB5ID0gflRvdGFsX1Blbmp1YWxhbiwgDQogIHR5cGUgPSAnc2NhdHRlcicsIA0KICBtb2RlID0gJ2xpbmVzK21hcmtlcnMnLA0KICBuYW1lID0gJ1RvdGFsIFBlbmp1YWxhbicsIA0KICBsaW5lID0gbGlzdChjb2xvciA9ICcjMDA3N2IyJyksDQogIHRleHQgPSB+VG9vbHRpcF9EYXRhLA0KICBob3ZlcmluZm8gPSAndGV4dCcNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJUcmVuIFBlbmp1YWxhbiBUYWh1bmFuIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVGFodW4iKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVG90YWwgUGVuanVhbGFuICh1bml0KSIpLA0KICAgIGxlZ2VuZCA9IGxpc3Qob3JpZW50YXRpb24gPSAiaCIsIHggPSAwLjMsIHkgPSAtMC4yKQ0KICApDQoNCnBsb3RseV9wbG90DQoNCg0KIyMjIEFuYWxpc2lzIE11c2ltYW4NCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrbml0cikNCg0KIyBMb2FkIGRhdGENCmRhdGEgPC0gcmVhZC5jc3YoIlBlbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCg0KIyBUYW1iYWhrYW4ga29sb20ga3VhcnRhbA0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoDQogICAgQnVsYW4gPSBmYWN0b3IoQnVsYW4sIGxldmVscyA9IGMoIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIikpLA0KICAgIEt1YXJ0YWwgPSBjYXNlX3doZW4oDQogICAgICBCdWxhbiAlaW4lIGMoIkphbiIsICJGZWIiLCAiTWFyIikgfiAiUTEiLA0KICAgICAgQnVsYW4gJWluJSBjKCJBcHIiLCAiTWF5IiwgIkp1biIpIH4gIlEyIiwNCiAgICAgIEJ1bGFuICVpbiUgYygiSnVsIiwgIkF1ZyIsICJTZXAiKSB+ICJRMyIsDQogICAgICBCdWxhbiAlaW4lIGMoIk9jdCIsICJOb3YiLCAiRGVjIikgfiAiUTQiDQogICAgKQ0KICApDQoNCiMgSGl0dW5nIHRvdGFsIHBlbmp1YWxhbiBwZXIgYnVsYW4gcGVyIGtvdGENCm1vbnRobHlfc2FsZXNfZGF0YSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShCdWxhbiwgS290YSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9QZW5qdWFsYW4gPSBzdW0oUGVuanVhbGFuLi51bml0LikpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyAtLS0gVGFiZWwgaGFzaWwgcGVuanVhbGFuIHBlciBidWxhbiBwZXIga290YSAoNCBkYXRhIGF3YWwgZGFuIDMgZGF0YSBha2hpcikgLS0tDQojIEJ1YXQgYmFyaXMgZWxsaXBzaXMgZGVuZ2FuIGtvbG9tIHlhbmcgc2VzdWFpDQplbGxpcHNpcyA8LSBkYXRhLmZyYW1lKEJ1bGFuID0gIi4uLiIsIEtvdGEgPSAiLi4uIiwgVG90YWxfUGVuanVhbGFuID0gTkEpDQoNCiMgR2FidW5na2FuIGRhdGEgZGVuZ2FuIGVsbGlwc2lzIGRpIGFudGFyYSA0IGRhdGEgcGVydGFtYSBkYW4gMyBkYXRhIHRlcmFraGlyDQptb250aGx5X3NhbGVzX2RhdGFfc3Vic2V0IDwtIGJpbmRfcm93cygNCiAgaGVhZChtb250aGx5X3NhbGVzX2RhdGEsIDQpLA0KICBlbGxpcHNpcywgICMgTWVuYW1iYWhrYW4gZWxsaXBzaXMgc2ViYWdhaSBwZW1pc2FoDQogIHRhaWwobW9udGhseV9zYWxlc19kYXRhLCAzKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsIGRlbmdhbiBrYWJsZQ0Ka2FibGUobW9udGhseV9zYWxlc19kYXRhX3N1YnNldCwgY2FwdGlvbiA9ICJUb3RhbCBQZW5qdWFsYW4gcGVyIEJ1bGFuIHBlciBLb3RhIikNCg0KDQojIC0tLSBHcmFmaWsgQmFyIFBlbmp1YWxhbiBwZXIgQnVsYW4gKHBlciBLb3RhKSBkZW5nYW4gd2FybmEgYmFydSAtLS0NCmNvbG9ycyA8LSBjKCIjMDBCRkZGIiwgIiMzMkNEMzIiLCAiI0ZGRkYwMCIsICIjRkY2OUI0IiwgIiNGRkE1MDAiKQ0KDQptb250aF9wbG90IDwtIHBsb3RfbHkoDQogIGRhdGEgPSBtb250aGx5X3NhbGVzX2RhdGEsDQogIHggPSB+QnVsYW4sDQogIHkgPSB+VG90YWxfUGVuanVhbGFuLA0KICBjb2xvciA9IH5Lb3RhLA0KICBjb2xvcnMgPSBjb2xvcnMsICAjIFNldCBjdXN0b20gY29sb3JzIGZvciB0aGUgY2l0aWVzDQogIHR5cGUgPSAnYmFyJywNCiAgaG92ZXJpbmZvID0gJ3greSt0ZXh0JywNCiAgdGV4dCA9IH5wYXN0ZSgiS290YTogIiwgS290YSwgIjxicj5Ub3RhbCBQZW5qdWFsYW46ICIsIFRvdGFsX1Blbmp1YWxhbikNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJUb3RhbCBQZW5qdWFsYW4gcGVyIEJ1bGFuIHBlciBLb3RhIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQnVsYW4iKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVG90YWwgUGVuanVhbGFuICh1bml0KSIpLA0KICAgIGJhcm1vZGUgPSAnc3RhY2snLCAgIyBTdGFjayBiYXJzIHRvIHNob3cgdG90YWwgc2FsZXMgYnkgY2l0eQ0KICAgIHNob3dsZWdlbmQgPSBUUlVFDQogICkNCg0KbW9udGhfcGxvdA0KDQoNCg0KYGBgDQoNCiMjICoqMy4gQW5hbGlzaXMgS29yZWxhc2kqKg0KIyMjIyBEYXRhDQpEaWJlcmlrYW4gZGF0YToNCg0KfCBCaWF5YSBQcm9tb3NpIChcKFhcKSkgfCBQZW5qdWFsYW4gKFwoWVwpKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTY2MCAgICAgICAgICAgICAgICAgfCAxMDM5MiAgICAgICAgICAgIHwNCnwgOTMwICAgICAgICAgICAgICAgICAgfCAxMTM5NCAgICAgICAgICAgIHwNCnwgMjAxNSAgICAgICAgICAgICAgICAgfCA5NDAwICAgICAgICAgICAgIHwNCnwgMTg4MiAgICAgICAgICAgICAgICAgfCA0NDc1ICAgICAgICAgICAgIHwNCnwgMTM2MiAgICAgICAgICAgICAgICAgfCA3MjExICAgICAgICAgICAgIHwNCg0KIyMjIyBMYW5na2FoIFBlcmhpdHVuZ2FuDQoNCjEuIEhpdHVuZyByYXRhLXJhdGEgXChcYmFye1h9XCkgZGFuIFwoXGJhcntZfVwpOg0KDQpcWw0KXGJhcntYfSA9IFxmcmFjezE2NjAgKyA5MzAgKyAyMDE1ICsgMTg4MiArIDEzNjJ9ezV9ID0gMTU2OS44DQpcXQ0KDQpcWw0KXGJhcntZfSA9IFxmcmFjezEwMzkyICsgMTEzOTQgKyA5NDAwICsgNDQ3NSArIDcyMTF9ezV9ID0gODU3NC40DQpcXQ0KDQoyLiBIaXR1bmcgc2VsaXNpaCB0aWFwIG5pbGFpIHRlcmhhZGFwIHJhdGEtcmF0YSAoXChYX2kgLSBcYmFye1h9XCksIFwoWV9pIC0gXGJhcntZfVwpKToNCg0KXFsNClxEZWx0YSBYID0gWzkwLjIsIC02MzkuOCwgNDQ1LjIsIDMxMi4yLCAtMjA3LjhdDQpcXQ0KDQpcWw0KXERlbHRhIFkgPSBbMTgxNy42LCAyODE5LjYsIDgyNS42LCAtNDA5OS40LCAtMTM2My40XQ0KXF0NCg0KMy4gSGl0dW5nIHBlcmthbGlhbiBzZWxpc2loIFwoKFxEZWx0YSBYKShcRGVsdGEgWSlcKToNCg0KXFsNCihcRGVsdGEgWCkoXERlbHRhIFkpID0gWzE2Mzk0Ny41MiwgLTE4MDM5ODAuMDgsIDM2NzU1Ny4xMiwgLTEyNzk4MzIuNjgsIDI4MzMxNC41Ml0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWCkoXERlbHRhIFkpID0gLTE4NzI5OTMuNg0KXF0NCg0KNC4gSGl0dW5nIGt1YWRyYXQgc2VsaXNpaCBcKChcRGVsdGEgWCleMlwpIGRhbiBcKChcRGVsdGEgWSleMlwpOg0KDQpcWw0KKFxEZWx0YSBYKV4yID0gWzgxMzYuMDQsIDQwOTM0NC4wNCwgMTk4MjAzLjA0LCA5NzQ2OC44NCwgNDMxODAuODRdDQpcXQ0KDQpcWw0KXHN1bSAoXERlbHRhIFgpXjIgPSAxMTUyMzMyLjgNClxdDQoNClxbDQooXERlbHRhIFkpXjIgPSBbMzMwMzY2OS43NiwgNzk1MDE0NC4xNiwgNjgxNjE1LjM2LCAxNjgwNTA4MC4zNiwgMTg1ODg1OS41Nl0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWSleMiA9IDMwNTUyMzY5LjINClxdDQoNCjUuIFN1YnN0aXR1c2kga2UgZGFsYW0gcnVtdXM6DQoNClxbDQpyID0gXGZyYWN7LTE4NzI5OTMuNn17XHNxcnR7MTE1MjMzMi44IFxjZG90IDMwNTUyMzY5LjJ9fQ0KXF0NCg0KXFsNCnIgPSBcZnJhY3stMTg3Mjk5My42fXs1OTY3NTY4LjkzfSA9IC0wLjQ3Mg0KXF0NCg0KIyMjIyBIYXNpbCBLb3JlbGFzaToNCktvcmVsYXNpIFBlYXJzb24gYW50YXJhIEJpYXlhIFByb21vc2kgKCQpIGRhbiBQZW5qdWFsYW4gKHVuaXQpOiDwnZGfPeKIkjAuNDcyDQpIdWJ1bmdhbiBpbmkgYWRhbGFoIG5lZ2F0aWYgc2VkYW5nLCBtZW51bmp1a2thbiBiYWh3YSBzYWF0IGJpYXlhIHByb21vc2kgbWVuaW5na2F0LCBwZW5qdWFsYW4gY2VuZGVydW5nIG1lbnVydW4gZGFsYW0gZGF0YXNldCBpbmkuDQoNCiMjIyMgMy4yIERpc2tvbiAoJSkgZGFuIFJhdGluZyBQZWxhbmdnYW4NCmBgYHtyIGNvcnJlbGF0aW9uLWRpc2NvdW50LXJhdGluZywgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBMb2FkIGxpYnJhcnkgeWFuZyBkaXBlcmx1a2FuDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgSGl0dW5nIGtvcmVsYXNpIFBlYXJzb24NCmNvcnJlbGF0aW9uX2Rpc2NvdW50X3JhdGluZyA8LSBjb3IoZGF0YSREaXNrb24uLi4uLCBkYXRhJFJhdGluZy5QZWxhbmdnYW4uLjEuNS4sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQojIEJ1YXQgc2NhdHRlciBwbG90IGRlbmdhbiBnYXJpcyB0cmVuDQpwbG90X2Rpc2NvdW50X3JhdGluZyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBEaXNrb24uLi4uLCB5ID0gUmF0aW5nLlBlbGFuZ2dhbi4uMS41LikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrb3JhbmdlIiwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiYmx1ZSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsgIyBUYW1iYWhrYW4gZ2FyaXMgdHJlbg0KICBsYWJzKA0KICAgIHRpdGxlID0gIkh1YnVuZ2FuIGFudGFyYSBEaXNrb24gZGFuIFJhdGluZyBQZWxhbmdnYW4iLA0KICAgIHggPSAiRGlza29uICglKSIsDQogICAgeSA9ICJSYXRpbmcgUGVsYW5nZ2FuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgS29udmVyc2kgcGxvdCBtZW5qYWRpIGludGVyYWt0aWYNCnBsb3RfZGlzY291bnRfcmF0aW5nX2ludGVyYWN0aXZlIDwtIGdncGxvdGx5KHBsb3RfZGlzY291bnRfcmF0aW5nKQ0KDQojIFRhbXBpbGthbiBoYXNpbCBzY2F0dGVyIHBsb3QgaW50ZXJha3RpZg0KcGxvdF9kaXNjb3VudF9yYXRpbmdfaW50ZXJhY3RpdmUNCg0KIyBUYW1waWxrYW4gbmlsYWkga29yZWxhc2kNCmthYmxlKGRhdGEuZnJhbWUoS29yZWxhc2kgPSBjb3JyZWxhdGlvbl9kaXNjb3VudF9yYXRpbmcpLCBjYXB0aW9uID0gIktvcmVsYXNpIGFudGFyYSBEaXNrb24gZGFuIFJhdGluZyBQZWxhbmdnYW4iKQ0KDQpgYGANCg0KIyMjIEtvcmVsYXNpIFBlYXJzb24NCg0KUnVtdXMga29yZWxhc2kgUGVhcnNvbiBhZGFsYWggc2ViYWdhaSBiZXJpa3V0Og0KDQpcWw0KciA9IFxmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pKFlfaSAtIFxiYXJ7WX0pfXtcc3FydHtcc3VtIChYX2kgLSBcYmFye1h9KV4yIFxjZG90IFxzdW0gKFlfaSAtIFxiYXJ7WX0pXjJ9fQ0KXF0NCg0KIyMjIERhdGENCkRpYmVyaWthbiBkYXRhOg0KDQp8IERpc2tvbiAoXChYXCkpIHwgUmF0aW5nIFBlbGFuZ2dhbiAoXChZXCkpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTAgICAgICAgICAgICAgIHwgNC41ICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTUgICAgICAgICAgICAgIHwgNC43ICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMjAgICAgICAgICAgICAgIHwgNC4zICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMjUgICAgICAgICAgICAgIHwgNC4wICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgICAgICAgICAgICAgIHwgNC4yICAgICAgICAgICAgICAgICAgICAgIHwNCg0KIyMjIExhbmdrYWggUGVyaGl0dW5nYW4NCg0KMS4gSGl0dW5nIHJhdGEtcmF0YSBcKFxiYXJ7WH1cKSBkYW4gXChcYmFye1l9XCk6DQoNClxbDQpcYmFye1h9ID0gXGZyYWN7MTAgKyAxNSArIDIwICsgMjUgKyAzMH17NX0gPSBcZnJhY3sxMDB9ezV9ID0gMjANClxdDQoNClxbDQpcYmFye1l9ID0gXGZyYWN7NC41ICsgNC43ICsgNC4zICsgNC4wICsgNC4yfXs1fSA9IFxmcmFjezIxLjd9ezV9ID0gNC4zNA0KXF0NCg0KMi4gSGl0dW5nIHNlbGlzaWggdGlhcCBuaWxhaSB0ZXJoYWRhcCByYXRhLXJhdGEgKFwoWF9pIC0gXGJhcntYfVwpLCBcKFlfaSAtIFxiYXJ7WX1cKSk6DQoNClxbDQpcRGVsdGEgWCA9IFstMTAsIC01LCAwLCA1LCAxMF0NClxdDQoNClxbDQpcRGVsdGEgWSA9IFswLjE2LCAwLjM2LCAtMC4wNCwgLTAuMzQsIC0wLjE0XQ0KXF0NCg0KMy4gSGl0dW5nIHBlcmthbGlhbiBzZWxpc2loIFwoKFxEZWx0YSBYKShcRGVsdGEgWSlcKToNCg0KXFsNCihcRGVsdGEgWCkoXERlbHRhIFkpID0gWy0xLjYsIC0xLjgsIDAsIC0xLjcsIC0xLjRdDQpcXQ0KDQpcWw0KXHN1bSAoXERlbHRhIFgpKFxEZWx0YSBZKSA9IC0xLjYgLSAxLjggKyAwIC0gMS43IC0gMS40ID0gLTYuNQ0KXF0NCg0KNC4gSGl0dW5nIGt1YWRyYXQgc2VsaXNpaCBcKChcRGVsdGEgWCleMlwpIGRhbiBcKChcRGVsdGEgWSleMlwpOg0KDQpcWw0KKFxEZWx0YSBYKV4yID0gWzEwMCwgMjUsIDAsIDI1LCAxMDBdDQpcXQ0KDQpcWw0KXHN1bSAoXERlbHRhIFgpXjIgPSAxMDAgKyAyNSArIDAgKyAyNSArIDEwMCA9IDI1MA0KXF0NCg0KXFsNCihcRGVsdGEgWSleMiA9IFswLjAyNTYsIDAuMTI5NiwgMC4wMDE2LCAwLjExNTYsIDAuMDE5Nl0NClxdDQoNClxbDQpcc3VtIChcRGVsdGEgWSleMiA9IDAuMDI1NiArIDAuMTI5NiArIDAuMDAxNiArIDAuMTE1NiArIDAuMDE5NiA9IDAuMjkyDQpcXQ0KDQo1LiBTdWJzdGl0dXNpIGtlIGRhbGFtIHJ1bXVzOg0KDQpcWw0KciA9IFxmcmFjey02LjV9e1xzcXJ0ezI1MCBcdGltZXMgMC4yOTJ9fSA9IFxmcmFjey02LjV9e1xzcXJ0ezczfX0gPSBcZnJhY3stNi41fXs4LjU0NH0gPSAtMC43NjENClxdDQoNCiMjIyBIYXNpbA0KS29yZWxhc2kgUGVhcnNvbiBhbnRhcmEgRGlza29uICglKSBkYW4gUmF0aW5nIFBlbGFuZ2dhbjoNCg0KXFsNCnIgPSAtMC43NjENClxdDQoNCkh1YnVuZ2FuIGluaSBjdWt1cCBrdWF0IGRhbiBuZWdhdGlmLCBtZW51bmp1a2thbiBiYWh3YSBzYWF0IGRpc2tvbiBtZW5pbmdrYXQsIHJhdGluZyBwZWxhbmdnYW4gY2VuZGVydW5nIG1lbnVydW4uDQoNCiMjIyAzLjEgQmlheWEgUHJvbW9zaSAoJCkgZGFuIFBlbmp1YWxhbiAodW5pdCkNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFzdGlrYW4ga29sb20geWFuZyBkaWd1bmFrYW4gYWRhIGRhbiBiZXJ0aXBlIG51bWVyaWsNCmRhdGEkQmlheWEuUHJvbW9zaS4uLi4gPC0gYXMubnVtZXJpYyhkYXRhJEJpYXlhLlByb21vc2kuLi4uKQ0KZGF0YSRQZW5qdWFsYW4uLnVuaXQuIDwtIGFzLm51bWVyaWMoZGF0YSRQZW5qdWFsYW4uLnVuaXQuKQ0KDQojIEhhcHVzIGJhcmlzIHlhbmcgbWVuZ2FuZHVuZyBOQQ0KZGF0YV9jbGVhbiA8LSBuYS5vbWl0KGRhdGEpDQoNCiMgSGl0dW5nIGtvcmVsYXNpIFBlYXJzb24gYW50YXJhIEJpYXlhIFByb21vc2kgZGFuIFBlbmp1YWxhbg0KY29ycmVsYXRpb25fcHJvbW90aW9uX3NhbGVzIDwtIGNvcihkYXRhX2NsZWFuJEJpYXlhLlByb21vc2kuLi4uLCBkYXRhX2NsZWFuJFBlbmp1YWxhbi4udW5pdC4sIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQojIEJ1YXQgc2NhdHRlciBwbG90IGRlbmdhbiBnYXJpcyB0cmVuDQpwbG90X3Byb21vdGlvbl9zYWxlcyA8LSBnZ3Bsb3QoZGF0YV9jbGVhbiwgYWVzKHggPSBCaWF5YS5Qcm9tb3NpLi4uLiwgeSA9IFBlbmp1YWxhbi4udW5pdC4pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAic3RlZWxibHVlIiwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAicmVkIiwgc2UgPSBGQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAjIFRhbWJhaGthbiBnYXJpcyB0cmVuDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSHVidW5nYW4gYW50YXJhIEJpYXlhIFByb21vc2kgZGFuIFBlbmp1YWxhbiIsDQogICAgeCA9ICJCaWF5YSBQcm9tb3NpICgkKSIsDQogICAgeSA9ICJQZW5qdWFsYW4gKHVuaXQpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgQnVhdCBwbG90IGludGVyYWt0aWYgbWVuZ2d1bmFrYW4gcGxvdGx5DQpwbG90X3Byb21vdGlvbl9zYWxlc19pbnRlcmFjdGl2ZSA8LSBnZ3Bsb3RseShwbG90X3Byb21vdGlvbl9zYWxlcykNCg0KIyBUYW1waWxrYW4gcGxvdCBpbnRlcmFrdGlmDQpwbG90X3Byb21vdGlvbl9zYWxlc19pbnRlcmFjdGl2ZQ0KDQojIFRhbXBpbGthbiBuaWxhaSBrb3JlbGFzaSBtZW5nZ3VuYWthbiBrYWJsZQ0KaWYgKCFpcy5uYShjb3JyZWxhdGlvbl9wcm9tb3Rpb25fc2FsZXMpKSB7DQogIGthYmxlKGRhdGEuZnJhbWUoS29yZWxhc2kgPSBjb3JyZWxhdGlvbl9wcm9tb3Rpb25fc2FsZXMpLCBjYXB0aW9uID0gIktvcmVsYXNpIGFudGFyYSBCaWF5YSBQcm9tb3NpIGRhbiBQZW5qdWFsYW4iKQ0KfSBlbHNlIHsNCiAgIyBKaWthIGtvcmVsYXNpIHRpZGFrIHZhbGlkIChOQSkNCiAgcHJpbnQoIk5pbGFpIGtvcmVsYXNpIHRpZGFrIHZhbGlkIChOQSBhdGF1IE5hTikuIikNCn0NCg0KYGBgDQoNCg0KIyMjIEtlc2ltcHVsYW4gQW5hbGlzaXMgT3V0cHV0DQoNCi0gKipLb2RlIFBlcnRhbWEgKERpc2tvbiB2cyBSYXRpbmcpOioqICANCiAgT3V0cHV0IG1lbmdnYW1iYXJrYW4gcGVyc2Vwc2kgcGVsYW5nZ2FuIHRlcmhhZGFwIGRpc2tvbi4gSmlrYSBrb3JlbGFzaSByZW5kYWgsIGluaSBtZW51bmp1a2thbiBkaXNrb24gbXVuZ2tpbiBidWthbiBmYWt0b3IgdXRhbWEgeWFuZyBtZW1lbmdhcnVoaSBwZW5pbGFpYW4gcGVsYW5nZ2FuLiBHYXJpcyB0cmVuIG1lbWJhbnR1IG1lbGloYXQga2VjZW5kZXJ1bmdhbiBodWJ1bmdhbiBpbmkuDQoNCi0gKipLb2RlIEtlZHVhIChQcm9tb3NpIHZzIFBlbmp1YWxhbik6KiogIA0KICBPdXRwdXQgbWVuZ2luZGlrYXNpa2FuIGVmZWt0aXZpdGFzIGJpYXlhIHByb21vc2kgdGVyaGFkYXAgaGFzaWwgcGVuanVhbGFuLiBLb3JlbGFzaSBwb3NpdGlmIHlhbmcga3VhdCBtZW51bmp1a2thbiBiYWh3YSBwZW5pbmdrYXRhbiBwcm9tb3NpIGNlbmRlcnVuZyBtZW5pbmdrYXRrYW4gcGVuanVhbGFuLCBzZWRhbmdrYW4ga29yZWxhc2kgbGVtYWggbWVudW5qdWtrYW4gcHJvbW9zaSBrdXJhbmcgZWZla3RpZi4NCg0KDQojIyAqKjQuIFVqaSBIaXBvdGVzaXMqKg0KDQpVbnR1ayBtZW55ZWxlc2Fpa2FuIG1hc2FsYWggc2VjYXJhIG1hbnVhbCBkYW4gbWVuZ3VqaSBoaXBvdGVzaXMgQW5kYSAoKipIMDogVGlkYWsgYWRhIGh1YnVuZ2FuIGFudGFyYSBCaWF5YSBQcm9tb3NpICgkKSBkYW4gUGVuanVhbGFuICh1bml0KSoqKSwgYmVyaWt1dCBsYW5na2FoLWxhbmdrYWggeWFuZyBoYXJ1cyBkaWxha3VrYW46DQoNCg0KIyMjIDEuICoqSGl0dW5nIFN0YXRpc3RpayBEYXNhcioqDQpLdW1wdWxrYW4gc3RhdGlzdGlrIGJlcmlrdXQgZGFyaSBkYXRhOg0KDQotIFJhdGEtcmF0YSAoKiptZWFuKiopIHVudHVrICoqQmlheWEgUHJvbW9zaSAoJCkqKiBkYW4gKipQZW5qdWFsYW4gKHVuaXQpKiouDQotIFN0YW5kYXIgZGV2aWFzaSAoKipzdGFuZGFyZCBkZXZpYXRpb24qKikgdW50dWsga2VkdWEgdmFyaWFiZWwuDQotIFVrdXJhbiBzYW1wZWwgKCoqbioqKS4NCg0KRGFyaSBkYXRhOg0KDQpcWw0KXHRleHR7UnVtdXMgcmF0YS1yYXRhOiB9IFxiYXJ7eH0gPSBcZnJhY3tcc3VtIHhfaX17bn0sIFxxdWFkIFxiYXJ7eX0gPSBcZnJhY3tcc3VtIHlfaX17bn0NClxdDQoNClxbDQpcdGV4dHtSdW11cyBzdGFuZGFyIGRldmlhc2k6IH0gc194ID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17bi0xfX0sIFxxdWFkIHNfeSA9IFxzcXJ0e1xmcmFje1xzdW0gKHlfaSAtIFxiYXJ7eX0pXjJ9e24tMX19DQpcXQ0KDQoNCiMjIyAyLiAqKkhpdHVuZyBLb2VmaXNpZW4gS29yZWxhc2kgUGVhcnNvbioqDQpHdW5ha2FuIHJ1bXVzIGJlcmlrdXQgdW50dWsgbWVuZ2hpdHVuZyBrb2VmaXNpZW4ga29yZWxhc2kgXCggciBcKToNCg0KXFsNCnIgPSBcZnJhY3tcc3VtICh4X2kgLSBcYmFye3h9KSh5X2kgLSBcYmFye3l9KX17KG4tMSkgXGNkb3Qgc194IFxjZG90IHNfeX0NClxdDQoNCkRpbWFuYToNCi0gXCggeF9pIFwpIGFkYWxhaCBuaWxhaSBpbmRpdmlkdSBkYXJpICoqQmlheWEgUHJvbW9zaSAoJCkqKi4NCi0gXCggeV9pIFwpIGFkYWxhaCBuaWxhaSBpbmRpdmlkdSBkYXJpICoqUGVuanVhbGFuICh1bml0KSoqLg0KLSBcKCBcYmFye3h9LCBcYmFye3l9IFwpIGFkYWxhaCByYXRhLXJhdGEgbWFzaW5nLW1hc2luZyB2YXJpYWJlbC4NCi0gXCggc194LCBzX3kgXCkgYWRhbGFoIHN0YW5kYXIgZGV2aWFzaSBtYXNpbmctbWFzaW5nIHZhcmlhYmVsLg0KDQoNCiMjIyAzLiAqKkhpdHVuZyBOaWxhaSBcKCB0IFwpIHVudHVrIFVqaSBIaXBvdGVzaXMqKg0KU2V0ZWxhaCBtZW5kYXBhdGthbiBuaWxhaSBcKCByIFwpLCBndW5ha2FuIHJ1bXVzIGJlcmlrdXQgdW50dWsgbWVuZ2hpdHVuZyBzdGF0aXN0aWsgdWppIFwoIHQgXCk6DQoNClxbDQp0ID0gciBcY2RvdCBcc3FydHtcZnJhY3tuLTJ9ezEtcl4yfX0NClxdDQoNCg0KIyMjIDQuICoqQmFuZGluZ2thbiBkZW5nYW4gTmlsYWkgS3JpdGlzKioNCkJhbmRpbmdrYW4gbmlsYWkgXCggdCBcKSB5YW5nIGRpaGl0dW5nIGRlbmdhbiBuaWxhaSBrcml0aXMgZGFyaSBkaXN0cmlidXNpIFwoIHQgXCkgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuIChcKCBkZiA9IG4tMiBcKSkgcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSBcKCBcYWxwaGEgXCkgKGJpYXNhbnlhIDAuMDUpLg0KDQotIEppa2EgXCggfHR8ID4gdF97XHRleHR7a3JpdGlrYWx9fSBcKTogVG9sYWsgXCggSF8wIFwpLg0KLSBKaWthIFwoIHx0fCBcbGVxIHRfe1x0ZXh0e2tyaXRpa2FsfX0gXCk6IEdhZ2FsIG1lbm9sYWsgXCggSF8wIFwpLg0KDQoNCiMjIyA1LiAqKkhpdHVuZyBOaWxhaSBQKioNCkd1bmFrYW4gdGFiZWwgZGlzdHJpYnVzaSBcKCB0IFwpIGF0YXUgcGVyYW5na2F0IGx1bmFrIHN0YXRpc3RpayB1bnR1ayBtZW5lbnR1a2FuIG5pbGFpIFwoIHAgXCkuDQoNCg0KIyMjIENvbnRvaCBQZW55ZWxlc2FpYW4NCk1pc2Fsa2FuIGRhcmkgZGF0YSwgZGlwZXJvbGVoOg0KDQotIFwoIG4gPSAzMDAgXCkNCi0gXCggXGJhcnt4fSA9IDE1MDAgXCksIFwoIFxiYXJ7eX0gPSA4MDAwIFwpDQotIFwoIHNfeCA9IDIwMCBcKSwgXCggc195ID0gMzAwMCBcKQ0KLSBcKCByID0gLTAuMTA4IFwpDQoNCiMjIyMgSGl0dW5nIFwoIHQgXCk6DQpcWw0KdCA9IC0wLjEwOCBcY2RvdCBcc3FydHtcZnJhY3szMDAtMn17MS0oLTAuMTA4KV4yfX0gPSAtMS44NzINClxdDQoNCiMjIyMgQmFuZGluZ2thbiBkZW5nYW4gXCggdF97XHRleHR7a3JpdGlrYWx9fSBcKSAoZGYgPSAyOTgsIFwoIFxhbHBoYSA9IDAuMDUgXCkpOg0KLSBOaWxhaSBrcml0aXMgXCggdCBcKSAodHdvLXRhaWxlZCkgc2VraXRhciAxLjk2OC4NCi0gS2FyZW5hIFwoIHx0fCA9IDEuODcyIDwgMS45NjggXCksIGdhZ2FsIG1lbm9sYWsgXCggSF8wIFwpLg0KDQoNCioqS2VzaW1wdWxhbjoqKiBUaWRhayBhZGEgaHVidW5nYW4gc2lnbmlmaWthbiBhbnRhcmEgKipCaWF5YSBQcm9tb3NpICgkKSoqIGRhbiAqKlBlbmp1YWxhbiAodW5pdCkqKiBwYWRhIHRpbmdrYXQgc2lnbmlmaWthbnNpIDUlLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIE1lbmdpbXBvciBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbg0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoa25pdHIpDQoNCiMgTWVtYmFjYSBkYXRhDQojIEdhbnRpICdQZW5qdWFsYW5fQUJDX0pBQk9ERVRBQkVLLmNzdicgZGVuZ2FuIGxva2FzaSBmaWxlIEFuZGENCmRhdGEgPC0gcmVhZF9jc3YoIlBlbmp1YWxhbl9BQkNfSkFCT0RFVEFCRUsuY3N2IikNCg0KDQoNCiMgTWVuZ2hpdHVuZyBrb3JlbGFzaSBQZWFyc29uDQpjb3JyZWxhdGlvbiA8LSBjb3IudGVzdChkYXRhJGBCaWF5YSBQcm9tb3NpICgkKWAsIGRhdGEkYFBlbmp1YWxhbiAodW5pdClgLCBtZXRob2QgPSAicGVhcnNvbiIpDQoNCiMgTWVtYnVhdCBvdXRwdXQgc2ViYWdhaSB0YWJlbA0Kb3V0cHV0IDwtIGRhdGEuZnJhbWUoDQogIFN0YXRpc3RpayA9IGMoIktvZWZpc2llbiBLb3JlbGFzaSAocikiLCAiTmlsYWkgdCIsICJkZiIsICJQLXZhbHVlIiksDQogIE5pbGFpID0gYyhjb3JyZWxhdGlvbiRlc3RpbWF0ZSwgY29ycmVsYXRpb24kc3RhdGlzdGljLCBjb3JyZWxhdGlvbiRwYXJhbWV0ZXIsIGNvcnJlbGF0aW9uJHAudmFsdWUpDQopDQoNCiMgTWVuYW1waWxrYW4gb3V0cHV0IHNlYmFnYWkgdGFiZWwgcmFwaQ0Ka2FibGUob3V0cHV0LCBjb2wubmFtZXMgPSBjKCJTdGF0aXN0aWsiLCAiTmlsYWkiKSwgY2FwdGlvbiA9ICJIYXNpbCBVamkgS29yZWxhc2kgUGVhcnNvbiIpDQoNCg0KYGBgDQoNCiMjICoqNS4gQW5hbGlzaXMgRGF0YSBLYXRlZ29yaWsqKiANCg0KIyMjIDEuIERpc3RyaWJ1c2kgUGVuanVhbGFuIEJlcmRhc2Fya2FuIEplbmlzIE91dGxldA0KDQpMYW5na2FoIHBlcmhpdHVuZ2FuIG1hbnVhbDoNCjEuICoqSnVtbGFoa2FuIFBlbmp1YWxhbiBCZXJkYXNhcmthbiBKZW5pcyBPdXRsZXQqKjoNCg0KLSBDb250b2ggRGF0YToNCg0KfCBKZW5pcyBPdXRsZXQgICB8IFBlbmp1YWxhbiAodW5pdCkgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBNb2Rlcm4gICAgICAgICB8IDEwLDAwMCAgICAgICAgICB8DQp8IFRyYWRpc2lvbmFsICAgIHwgMTUsMDAwICAgICAgICAgIHwNCnwgTW9kZXJuICAgICAgICAgfCAyMCwwMDAgICAgICAgICAgfA0KfCBUcmFkaXNpb25hbCAgICB8IDI1LDAwMCAgICAgICAgICB8DQogICAgICANCi0gTW9kZXJuOiBcKCAxMCwwMDAgKyAyMCwwMDAgPSAzMCwwMDAgXCkgIA0KICAgICAgVHJhZGlzaW9uYWw6IFwoIDE1LDAwMCArIDI1LDAwMCA9IDQwLDAwMCBcKQ0KDQoyLiAqKkhpdHVuZyBUb3RhbCBQZW5qdWFsYW4qKjoNCiAgICBcWw0KICAgIFx0ZXh0e1RvdGFsIFBlbmp1YWxhbn0gPSAzMCwwMDAgKyA0MCwwMDAgPSA3MCwwMDANCiAgICBcXQ0KDQozLiAqKkhpdHVuZyBEaXN0cmlidXNpIFBlcnNlbnRhc2UqKjoNCiAgICAtIE1vZGVybjogDQogICAgICBcWw0KICAgICAgXGZyYWN7MzAsMDAwfXs3MCwwMDB9IFx0aW1lcyAxMDAgPSA0Mi44NlwlDQogICAgICBcXQ0KICAgIC0gVHJhZGlzaW9uYWw6DQogICAgICBcWw0KICAgICAgXGZyYWN7NDAsMDAwfXs3MCwwMDB9IFx0aW1lcyAxMDAgPSA1Ny4xNFwlDQogICAgICBcXQ0KDQojIyMgSGFzaWwgdW50dWsgRGF0YSBBbmRhOg0KLSAqKk1vZGVybioqOiAxLDU1Myw4MzMgdW5pdCAoNDkuNDclKQ0KLSAqKlRyYWRpc2lvbmFsKio6IDEsNTg2LDgxNiB1bml0ICg1MC41MyUpDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgTG9hZCBsaWJyYXJ5IHVudHVrIHRhYmVsDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGJyb29tKQ0KDQojIFBhc3Rpa2FuIGRhdGEgc3VkYWggYWRhDQojIEdhbnRpIGRlbmdhbiBwYXRoIGZpbGUgQW5kYQ0KZGF0YSA8LSByZWFkLmNzdigiUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQoNCiMgVmFsaWRhc2kga29sb20NCnJlcXVpcmVkX2NvbHVtbnMgPC0gYygiUGVuanVhbGFuLi51bml0LiIsICJLb3RhIiwgIkJpYXlhLlByb21vc2kuLi4uIiwgIkRpc2tvbi4uLi4iLCAiSmVuaXMuT3V0bGV0IikNCmlmICghYWxsKHJlcXVpcmVkX2NvbHVtbnMgJWluJSBjb2xuYW1lcyhkYXRhKSkpIHsNCiAgc3RvcCgiS29sb20geWFuZyBkaXBlcmx1a2FuIHRpZGFrIGRpdGVtdWthbiBkYWxhbSBkYXRhc2V0LiIpDQp9DQoNCiMgUGFzdGlrYW4ga29sb20gUGVuZGFwYXRhbiBhZGENCmhhcmdhX3Blcl91bml0IDwtIDEwDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShQZW5kYXBhdGFuID0gUGVuanVhbGFuLi51bml0LiAqIGhhcmdhX3Blcl91bml0KQ0KDQojIDEuIERhdGEgZGlzdHJpYnVzaSBwZW5qdWFsYW4gYmVyZGFzYXJrYW4gamVuaXMgb3V0bGV0DQpkaXN0cmlidXNpX3Blbmp1YWxhbiA8LSBkYXRhLmZyYW1lKA0KICBKZW5pc19PdXRsZXQgPSBjKCJNb2Rlcm4iLCAiVHJhZGlzaW9uYWwiKSwNCiAgVG90YWxfUGVuanVhbGFuID0gYygxNTUzODMzLCAxNTg2ODE2KSwNCiAgUGVyc2VudGFzZSA9IGMoNDkuNDc0OSwgNTAuNTI1MSkNCikNCg0KIyBUYW1waWxrYW4gZGlzdHJpYnVzaSBwZW5qdWFsYW4gZGFsYW0gZm9ybWF0IHRhYmVsDQpkaXN0cmlidXNpX3Blbmp1YWxhbl90YWJsZSA8LSBkaXN0cmlidXNpX3Blbmp1YWxhbiAlPiUNCiAgZ3QoKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9ICJEaXN0cmlidXNpIFBlbmp1YWxhbiBCZXJkYXNhcmthbiBKZW5pcyBPdXRsZXQiDQogICkgJT4lDQogIGZtdF9udW1iZXIoDQogICAgY29sdW1ucyA9IGMoIlRvdGFsX1Blbmp1YWxhbiIsICJQZXJzZW50YXNlIiksDQogICAgZGVjaW1hbHMgPSAyDQogICkNCg0KIyAyLiBQZW5kYXBhdGFuIHBlciBrb3RhDQpwZW5kYXBhdGFuX3Blcl9rb3RhIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEtvdGEpICU+JQ0KICBzdW1tYXJpc2UoVG90YWxfUGVuZGFwYXRhbiA9IHN1bShQZW5kYXBhdGFuKSkNCg0KIyBUYW1waWxrYW4gdGFiZWwgcGVuZGFwYXRhbiBwZXIga290YQ0KcGVuZGFwYXRhbl9wZXJfa290YV90YWJsZSA8LSBwZW5kYXBhdGFuX3Blcl9rb3RhICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlRvdGFsIFBlbmRhcGF0YW4gcGVyIEtvdGEiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkNCg0KIyAzLiBNb2RlbCByZWdyZXNpIGxpbmVhcg0KIyBUYW1iYWhrYW4gZHVtbXkgdmFyaWFibGUgdW50dWsgSmVuaXMgT3V0bGV0DQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShKZW5pc19PdXRsZXRfRHVtbXkgPSBpZmVsc2UoSmVuaXMuT3V0bGV0ID09ICJNb2Rlcm4iLCAxLCAwKSkNCg0KIyBCdWF0IG1vZGVsIHJlZ3Jlc2kgbGluZWFyDQptb2RlbCA8LSBsbShQZW5kYXBhdGFuIH4gQmlheWEuUHJvbW9zaS4uLi4gKyBEaXNrb24uLi4uICsgSmVuaXNfT3V0bGV0X0R1bW15LCBkYXRhID0gZGF0YSkNCg0KIyBSaW5na2FzYW4gbW9kZWwgcmVncmVzaQ0KbW9kZWxfc3VtbWFyeSA8LSBicm9vbTo6dGlkeShtb2RlbCkNCg0KIyBUYW1waWxrYW4gdGFiZWwgcmluZ2thc2FuIG1vZGVsIHJlZ3Jlc2kNCm1vZGVsX3N1bW1hcnlfdGFibGUgPC0gbW9kZWxfc3VtbWFyeSAlPiUNCiAga2FibGUoY2FwdGlvbiA9ICJSaW5na2FzYW4gTW9kZWwgUmVncmVzaSBMaW5lYXIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkNCg0KIyBDZXRhayB0YWJlbA0KZGlzdHJpYnVzaV9wZW5qdWFsYW5fdGFibGUNCnBlbmRhcGF0YW5fcGVyX2tvdGFfdGFibGUNCm1vZGVsX3N1bW1hcnlfdGFibGUNCg0KYGBgDQoNCg0KIyMjIEthdGVnb3JpIFByb2R1aw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBMb2FkIGRhdGFzZXQNCmZpbGVfcGF0aCA8LSAiUGVuanVhbGFuX0FCQ19KQUJPREVUQUJFSy5jc3YiICAjIFViYWggc2VzdWFpIGxva2FzaSBmaWxlIEFuZGENCmRhdGEgPC0gcmVhZC5jc3YoZmlsZV9wYXRoKQ0KDQojIFRhbXBpbGthbiBkYXRhIGF3YWwNCmhlYWQoZGF0YSkNCg0KIyBDZWsgZGlzdHJpYnVzaSBrYXRlZ29yaSBwcm9kdWsNCnRhYmxlKGRhdGEkS2F0ZWdvcmkuUHJvZHVrKQ0KDQojIFZpc3VhbGlzYXNpIGRhdGEgKGJveHBsb3QpDQpib3hwbG90KFBlbmp1YWxhbi4udW5pdC4gfiBLYXRlZ29yaS5Qcm9kdWssIGRhdGEgPSBkYXRhLA0KICAgICAgICBtYWluID0gIkRpc3RyaWJ1c2kgUGVuanVhbGFuIHBlciBLYXRlZ29yaSBQcm9kdWsiLA0KICAgICAgICB4bGFiID0gIkthdGVnb3JpIFByb2R1ayIsIHlsYWIgPSAiUGVuanVhbGFuICh1bml0KSIsIGNvbCA9ICJsaWdodGJsdWUiKQ0KDQojIFVqaSBBTk9WQQ0KYW5vdmFfcmVzdWx0IDwtIGFvdihQZW5qdWFsYW4uLnVuaXQuIH4gS2F0ZWdvcmkuUHJvZHVrLCBkYXRhID0gZGF0YSkNCnN1bW1hcnkoYW5vdmFfcmVzdWx0KQ0KDQoNCmBgYA0KIyMjIEFuYWxpc2lzIEthdGVnb3JpIHByb2R1aw0KDQpEYXJpIHVqaSBBTk9WQSwgaGFzaWwgbWVudW5qdWtrYW4gYmFod2EgKip0aWRhayBhZGEgcGVyYmVkYWFuIHNpZ25pZmlrYW4gZGFsYW0gcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhcmEga2F0ZWdvcmkgcHJvZHVrKiogKE1ha2FuYW4sIE1pbnVtYW4sIEtlc2VoYXRhbikuIEJlcmlrdXQgYWRhbGFoIGludGVycHJldGFzaW55YToNCg0KMS4gKipTdGF0aXN0aWsgRioqIHlhbmcga2VjaWwgKDEuNDk0KSBtZW5naW5kaWthc2lrYW4gYmFod2EgdmFyaWFzaSBhbnRhciBrYXRlZ29yaSAoYW50YXJhIE1ha2FuYW4sIE1pbnVtYW4sIGRhbiBLZXNlaGF0YW4pIHJlbGF0aWYga2VjaWwgZGliYW5kaW5na2FuIGRlbmdhbiB2YXJpYXNpIGRhbGFtIGthdGVnb3JpIG1hc2luZy1tYXNpbmcuDQoyLiAqKnAtdmFsdWUgc2ViZXNhciAwLjIyNioqIGxlYmloIGJlc2FyIGRhcmkgdGluZ2thdCBzaWduaWZpa2Fuc2kgeWFuZyB1bXVtIGRpZ3VuYWthbiAozrEgPSAwLjA1KS4gSW5pIGJlcmFydGkga2l0YSB0aWRhayBtZW1pbGlraSBjdWt1cCBidWt0aSB1bnR1ayBtZW55aW1wdWxrYW4gYmFod2EgcGVyYmVkYWFuIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXJhIGthdGVnb3JpIHByb2R1ayBhZGFsYWggbnlhdGEgYXRhdSBzaWduaWZpa2FuLg0KDQojIyMgSW1wbGlrYXNpDQoNCi0gKipTdHJhdGVnaSBQZW5qdWFsYW4qKjogS2FyZW5hIHRpZGFrIGFkYSBrYXRlZ29yaSB5YW5nIHNlY2FyYSBzaWduaWZpa2FuIGxlYmloIHVuZ2d1bCBkYWxhbSBwZW5qdWFsYW4gcmF0YS1yYXRhLCBwZXJ1c2FoYWFuIGRhcGF0IG1lbXByaW9yaXRhc2thbiBzZW11YSBrYXRlZ29yaSBzZWNhcmEgc2VpbWJhbmcgZGFsYW0gc3RyYXRlZ2kgcGVtYXNhcmFuLg0KLSAqKlBlbmVsaXRpYW4gTGFuanV0YW4qKjogUGVybHUgYW5hbGlzaXMgdGFtYmFoYW4gdW50dWsgbWVtYWhhbWkgZmFrdG9yIGxhaW4geWFuZyBtdW5na2luIG1lbWVuZ2FydWhpIHBlbmp1YWxhbiwgc2VwZXJ0aSBsb2thc2ksIGplbmlzIG91dGxldCwgYXRhdSBwcm9tb3NpLg0KDQpLZXNpbXB1bGFubnlhLCBkYXJpIHNpc2kgZGF0YSBpbmksIHBlbmp1YWxhbiBzZXRpYXAga2F0ZWdvcmkgcHJvZHVrIG1lbnVuanVra2FuIGtpbmVyamEgeWFuZyByZWxhdGlmIHNlcnVwYS4NCg0KIyMgKio2LiBNb2RlbCBQcmVkaWtzaSBQZW5kYXBhdGFuKioNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YXNldA0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBLb3RhID0gYygiSmFrYXJ0YSIsICJCb2dvciIsICJEZXBvayIsICJUYW5nZXJhbmciLCAiQmVrYXNpIiksDQogIFBlbmp1YWxhbl91bml0ID0gYygxMDM5MiwgMTEzOTQsIDk0MDAsIDQ0NzUsIDcyMTEpLA0KICBCaWF5YV9Qcm9tb3NpID0gYygxNjYwLCA5MzAsIDIwMTUsIDE4ODIsIDEzNjIpLA0KICBEaXNrb24gPSBjKDcuOCwgNS4zLCAxOS45LCAxMS4wLCAxMC43KSwNCiAgSmVuaXNfT3V0bGV0ID0gYygiTW9kZXJuIiwgIlRyYWRpc2lvbmFsIiwgIlRyYWRpc2lvbmFsIiwgIlRyYWRpc2lvbmFsIiwgIk1vZGVybiIpDQopDQoNCiMgMS4gSGl0dW5nIFBlbmRhcGF0YW4NCmhhcmdhX3Blcl91bml0IDwtIDEwDQpkYXRhJFBlbmRhcGF0YW4gPC0gZGF0YSRQZW5qdWFsYW5fdW5pdCAqIGhhcmdhX3Blcl91bml0DQoNCiMgMi4gVG90YWwgUGVuZGFwYXRhbiBwZXIgS290YQ0KdG90YWxfcGVuZGFwYXRhbl9wZXJfa290YSA8LSBhZ2dyZWdhdGUoUGVuZGFwYXRhbiB+IEtvdGEsIGRhdGEgPSBkYXRhLCBzdW0pDQpwcmludCgiVG90YWwgUGVuZGFwYXRhbiBwZXIgS290YToiKQ0KcHJpbnQodG90YWxfcGVuZGFwYXRhbl9wZXJfa290YSkNCg0KIyAzLiBLb252ZXJzaSBKZW5pcyBPdXRsZXQgbWVuamFkaSBEdW1teSBWYXJpYWJsZQ0KZGF0YSRKZW5pc19PdXRsZXRfRHVtbXkgPC0gaWZlbHNlKGRhdGEkSmVuaXNfT3V0bGV0ID09ICJNb2Rlcm4iLCAxLCAwKQ0KDQojIDQuIFJlZ3Jlc2kgTGluZWFyDQptb2RlbCA8LSBsbShQZW5kYXBhdGFuIH4gQmlheWFfUHJvbW9zaSArIERpc2tvbiArIEplbmlzX091dGxldF9EdW1teSwgZGF0YSA9IGRhdGEpDQoNCiMgUmluZ2thc2FuIG1vZGVsDQpwcmludChzdW1tYXJ5KG1vZGVsKSkNCg0KIyA1LiBIaXR1bmcgUi1zcXVhcmVkIHNlY2FyYSBtYW51YWwNCnlfYWN0dWFsIDwtIGRhdGEkUGVuZGFwYXRhbg0KeV9wcmVkIDwtIHByZWRpY3QobW9kZWwpDQpzc190b3RhbCA8LSBzdW0oKHlfYWN0dWFsIC0gbWVhbih5X2FjdHVhbCkpXjIpICAjIFRvdGFsIFN1bSBvZiBTcXVhcmVzDQpzc19yZXNpZHVhbCA8LSBzdW0oKHlfYWN0dWFsIC0geV9wcmVkKV4yKSAgICAgICAjIFJlc2lkdWFsIFN1bSBvZiBTcXVhcmVzDQpyX3NxdWFyZWQgPC0gMSAtIChzc19yZXNpZHVhbCAvIHNzX3RvdGFsKQ0KDQpjYXQoIlxuUi1zcXVhcmVkOiAiLCByb3VuZChyX3NxdWFyZWQsIDQpLCAiICgiLCByb3VuZChyX3NxdWFyZWQgKiAxMDAsIDIpLCAiJSkiLCBzZXAgPSAiIikNCg0KYGBgDQoNCiMjICoqNy4gSW50ZXJwcmV0YXNpIEJpc25pcyoqDQpCZXJpa3V0IGFkYWxhaCByZWtvbWVuZGFzaSBzdHJhdGVnaSBwZW1hc2FyYW4gcGVyIGtvdGEgYmVyZGFzYXJrYW4gYW5hbGlzaXMgZGF0YSBkYW4gZGFtcGFrIGRhcmkgZmFrdG9yLWZha3RvciBwZW1hc2FyYW4geWFuZyB0ZXJzZWRpYToNCg0KIyMjICoqMS4gUmVrb21lbmRhc2kgU3RyYXRlZ2kgUGVtYXNhcmFuIFBlciBLb3RhKioNCkJlcmRhc2Fya2FuIHRvdGFsIHBlbmRhcGF0YW4geWFuZyBkaWhpdHVuZzoNCi0gKipEZXBvayoqIG1lbWlsaWtpIHBlbmRhcGF0YW4gdGVydGluZ2dpLCBkaWlrdXRpIG9sZWggKipKYWthcnRhKiogZGFuICoqVGFuZ2VyYW5nKiouIFN0cmF0ZWdpIHBlbWFzYXJhbiBkaSBrb3RhLWtvdGEgaW5pIGRhcGF0IGRpZm9rdXNrYW4gdW50dWsgbWVtcGVydGFoYW5rYW4ga2V1bmdndWxhbiBwYXNhci4NCi0gKipCb2dvcioqIG1lbWlsaWtpIHBlbmRhcGF0YW4gdGVyZW5kYWguIEluaSBtZW51bmp1a2thbiBwZXJsdW55YSBzdHJhdGVnaSBhZ3Jlc2lmIHVudHVrIG1lbmluZ2thdGthbiBwZW5qdWFsYW4gZGkga290YSBpbmksIHNlcGVydGkgcGVuYXdhcmFuIGRpc2tvbiBraHVzdXMgYXRhdSBwcm9tb3NpIHlhbmcgbGViaWggaW50ZW5zaWYuDQotICoqQmVrYXNpKiogbWVudW5qdWtrYW4gcG90ZW5zaSBwZXJ0dW1idWhhbiB5YW5nIHNpZ25pZmlrYW4uIEZva3VzIHBhZGEgcGVuaW5na2F0YW4gcGVuZXRyYXNpIHBhc2FyIGRlbmdhbiBzdHJhdGVnaSBwcm9tb3NpIHlhbmcgdGVwYXQuDQoNCg0KIyMjICoqMi4gRGFtcGFrIGRhbiBTdHJhdGVnaSB1bnR1ayBGYWt0b3ItRmFrdG9yIFBlbWFzYXJhbioqDQoNCiMjIyMgKiphLiBQZW5nb3B0aW1hbGFuIERpc2tvbioqDQotICoqSGFzaWwgQW5hbGlzaXMqKjoNCiAgRGlza29uIG1lbWlsaWtpIGtvZWZpc2llbiBwb3NpdGlmIGRhbGFtIG1vZGVsIHJlZ3Jlc2ksIHRldGFwaSB0aWRhayBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsuIEluaSBtZW51bmp1a2thbiBiYWh3YSBkaXNrb24gY2VuZGVydW5nIG1lbmluZ2thdGthbiBwZW5kYXBhdGFuLCB0ZXRhcGkgcGVuZ2FydWhueWEgdGlkYWsga3VhdC4NCi0gKipTdHJhdGVnaSoqOg0KICAtIEd1bmFrYW4gZGlza29uIHNlY2FyYSBzZWxla3RpZiB1bnR1ayBwcm9kdWsgZGVuZ2FuIG1hcmdpbiB0aW5nZ2kuDQogIC0gVGVyYXBrYW4gZGlza29uIGJlcmJhc2lzIHZvbHVtZSB1bnR1ayBtZW5kb3JvbmcgcGVtYmVsaWFuIGRhbGFtIGp1bWxhaCBiZXNhci4NCiAgLSBMYWt1a2FuIHVqaSBjb2JhIGRpc2tvbiBkaSBrb3RhIGRlbmdhbiBwZW5kYXBhdGFuIHJlbmRhaCAoc2VwZXJ0aSBCb2dvcikgdW50dWsgbWVsaWhhdCBkYW1wYWtueWEgdGVyaGFkYXAgcGVuanVhbGFuLg0KDQojIyMjICoqYi4gQWxva2FzaSBBbmdnYXJhbiBQcm9tb3NpKioNCi0gKipIYXNpbCBBbmFsaXNpcyoqOg0KICBCaWF5YSBwcm9tb3NpIG1lbWlsaWtpIGtvZWZpc2llbiBuZWdhdGlmIGRhbiBoYW1waXIgc2lnbmlmaWthbi4gSW5pIG1lbnVuanVra2FuIGJhaHdhIHBlbmdlbHVhcmFuIHByb21vc2kgeWFuZyB0aW5nZ2kgdGlkYWsgc2VsYWx1IG1lbmdoYXNpbGthbiBwZW5pbmdrYXRhbiBwZW5kYXBhdGFuLg0KLSAqKlN0cmF0ZWdpKio6DQogIC0gT3B0aW1hbGthbiBwZW5nZWx1YXJhbiBwcm9tb3NpIGRlbmdhbiBmb2t1cyBwYWRhIHNhbHVyYW4geWFuZyBtZW1iZXJpa2FuIGhhc2lsIHRlcmJhaWsgKG1pc2FsbnlhLCBkaWdpdGFsIG1hcmtldGluZyBhdGF1IHByb21vc2kgbG9rYWwpLg0KICAtIEt1cmFuZ2kgcHJvbW9zaSBkaSBrb3RhIGRlbmdhbiBraW5lcmphIGJhaWsgKHNlcGVydGkgRGVwb2spIGRhbiBhbG9rYXNpa2FuIGtlIGtvdGEgZGVuZ2FuIHBvdGVuc2kgcGVydHVtYnVoYW4gKHNlcGVydGkgQm9nb3IgYXRhdSBCZWthc2kpLg0KICAtIEd1bmFrYW4gcHJvbW9zaSBiZXJiYXNpcyBkYXRhIHVudHVrIG1lbmFyZ2V0a2FuIHNlZ21lbiBwZWxhbmdnYW4geWFuZyBsZWJpaCBzcGVzaWZpay4NCg0KIyMjIyAqKmMuIERpc3RyaWJ1c2kgUGVuanVhbGFuIGtlIEplbmlzIE91dGxldCBUZXJ0ZW50dSoqDQotICoqSGFzaWwgQW5hbGlzaXMqKjoNCiAgSmVuaXMgb3V0bGV0IChNb2Rlcm4gdnMuIFRyYWRpc2lvbmFsKSB0aWRhayBtZW1pbGlraSBwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIHBlbmRhcGF0YW4uDQotICoqU3RyYXRlZ2kqKjoNCiAgLSBGb2t1cyBwYWRhIG91dGxldCBtb2Rlcm4gdW50dWsgcHJvZHVrIGRlbmdhbiBtYXJnaW4gdGluZ2dpIGRhbiBrYXRlZ29yaSBwcmVtaXVtLg0KICAtIFRpbmdrYXRrYW4ga2VyamEgc2FtYSBkZW5nYW4gb3V0bGV0IHRyYWRpc2lvbmFsIHVudHVrIG1lbmphbmdrYXUgc2VnbWVuIHBlbGFuZ2dhbiB5YW5nIHNlbnNpdGlmIHRlcmhhZGFwIGhhcmdhLg0KICAtIERpdmVyc2lmaWthc2kgZGlzdHJpYnVzaSBrZSBrZWR1YSBqZW5pcyBvdXRsZXQgdW50dWsgbWVtaW5pbWFsa2FuIHJpc2lrbyBrZXRlcmdhbnR1bmdhbiBwYWRhIHNhdHUgc2FsdXJhbi4NCg0KDQojIyMgKiozLiBSZWtvbWVuZGFzaSBVbXVtKioNCjEuICoqQW5hbGlzaXMgUGVyZm9ybWEgUGVyIEtvdGEqKjoNCiAgIC0gTGFrdWthbiBhbmFsaXNpcyBsZWJpaCBsYW5qdXQgdW50dWsgbWVtYWhhbWkgZmFrdG9yLWZha3RvciBzcGVzaWZpayB5YW5nIG1lbWVuZ2FydWhpIHBlbmp1YWxhbiBkaSBzZXRpYXAga290YSwgc2VwZXJ0aSBwcmVmZXJlbnNpIHBlbGFuZ2dhbiBsb2thbC4NCjIuICoqU2VnbWVudGFzaSBQZWxhbmdnYW4qKjoNCiAgIC0gR3VuYWthbiBkYXRhIHBlbGFuZ2dhbiB1bnR1ayBtZW5jaXB0YWthbiBzdHJhdGVnaSBwZW1hc2FyYW4geWFuZyBsZWJpaCB0ZXJzZWdtZW50YXNpLCBzZXBlcnRpIGthbXBhbnllIGtodXN1cyB1bnR1ayBwZWxhbmdnYW4gbG95YWwuDQozLiAqKkV2YWx1YXNpIFJPSSBQcm9tb3NpKio6DQogICAtIE1vbml0b3IgcGVuZ2VtYmFsaWFuIGludmVzdGFzaSAoUk9JKSBkYXJpIHNldGlhcCBha3Rpdml0YXMgcHJvbW9zaSB1bnR1ayBtZW1hc3Rpa2FuIGVmaXNpZW5zaSBhbmdnYXJhbi4NCjQuICoqS29tYmluYXNpIERpc2tvbiBkYW4gUHJvbW9zaSoqOg0KICAgLSBHYWJ1bmdrYW4gc3RyYXRlZ2kgZGlza29uIGRlbmdhbiBwcm9tb3NpIGtyZWF0aWYgKG1pc2FsbnlhLCBidW5kbGluZyBwcm9kdWspIHVudHVrIG1lbmluZ2thdGthbiBkYXlhIHRhcmlrIHRhbnBhIG1lbmdvcmJhbmthbiBtYXJnaW4ga2V1bnR1bmdhbi4NCg0K