Margin of Error

Teknik Sampling dan Survei

Laporan Studi

1. Pendahuluan

1.1 Tujuan Penelitian

Penelitian ini bertujuan untuk mengevaluasi berbagai metode pengambilan sampel dalam estimasi parameter populasi, khususnya dalam konteks estimasi rata-rata pengeluaran individu dalam suatu populasi. Beberapa metode sampling yang digunakan dalam penelitian ini meliputi Simple Random Sampling (SRS), Stratified Sampling, Systematic Sampling, Cluster Sampling, dan Multi-Stage Sampling.

Selain itu, penelitian ini juga bertujuan untuk menentukan ukuran sampel minimum yang diperlukan untuk mencapai tingkat ketelitian tertentu, yang dinyatakan dalam Margin of Error (MoE). Dengan mengetahui ukuran sampel yang optimal, penelitian ini diharapkan dapat memberikan rekomendasi mengenai metode pengambilan sampel yang efisien dan sesuai dengan kebutuhan analisis statistik.

1.2 Pentingnya Margin of Error (MoE) dalam Pengambilan Sampel

Margin of Error (MoE) merupakan salah satu parameter penting dalam pengambilan sampel karena mencerminkan tingkat ketelitian estimasi terhadap parameter populasi yang sebenarnya. MoE menunjukkan seberapa jauh hasil estimasi dari sampel dapat menyimpang dari nilai populasi yang sesungguhnya dengan tingkat kepercayaan tertentu.

Dalam praktiknya, semakin kecil nilai MoE yang diinginkan, semakin besar ukuran sampel yang dibutuhkan untuk mencapai estimasi yang lebih akurat. Oleh karena itu, pemilihan ukuran sampel yang tepat harus mempertimbangkan keseimbangan antara tingkat ketelitian yang diinginkan dan sumber daya yang tersedia.

Dengan memahami peran MoE dalam pengambilan sampel, penelitian ini akan menganalisis bagaimana variasi metode sampling dan simpangan baku data mempengaruhi ukuran sampel yang diperlukan untuk mencapai tingkat MoE tertentu.


2. Metode Pengambilan Sampel yang Digunakan

Penelitian ini menggunakan dataset simulasi yang terdiri dari 10.000 mahasiswa, mencakup informasi mengenai fakultas, tahun akademik, dan pengeluaran makanan bulanan.

library(dplyr)
library(ggplot2)
library(sampling)
set.seed(123)

n_pop <- 10000
data_mahasiswa <- data.frame(
  id = 1:n_pop,
  fakultas = sample(c("Sains", "Teknik", "Ekonomi", "Sosial"), n_pop, replace = TRUE),
  tahun_akademik = sample(1:4, n_pop, replace = TRUE),
  pengeluaran = round(rnorm(n_pop, mean = 1500000, sd = 500000), 0)
)

Penelitian ini menerapkan metode Probability Sampling dan Non-Probability Sampling berikut:

2.1 Probability Sampling

  1. Simple Random Sampling (SRS)
    • Setiap mahasiswa memiliki peluang yang sama untuk dipilih.
    • Dilakukan dengan menggunakan generator angka acak atau tabel angka acak.
sampel_srs <- data_mahasiswa %>% sample_n(200)
head(sampel_srs)
  1. Stratified Sampling
    • Populasi dibagi menjadi kelompok (strata) berdasarkan karakteristik tertentu, seperti fakultas atau tahun akademik.
    • Sampel dipilih secara acak dari setiap strata secara proporsional.
stratified_sample <- data_mahasiswa %>% group_by(fakultas) %>% sample_n(50)
head(stratified_sample)
  1. Systematic Sampling
    • Setiap mahasiswa ke-k dipilih dari daftar yang diurutkan.
    • Contoh: Jika ada 10.000 mahasiswa dan sampel yang dibutuhkan 200, maka setiap mahasiswa ke-50 akan dipilih.
k <- floor(n_pop / 200)
sampel_systematic <- data_mahasiswa[seq(1, n_pop, by = k), ]
head(sampel_systematic)
  1. Cluster Sampling
    • Populasi dibagi menjadi kelompok (klaster) dan beberapa klaster dipilih secara acak.
    • Semua anggota dalam klaster yang dipilih akan disurvei.
cluster_ids <- sample(unique(data_mahasiswa$tahun_akademik), 2)
sampel_cluster <- data_mahasiswa %>% filter(tahun_akademik %in% cluster_ids)
head(sampel_cluster)
  1. Multi-Stage Sampling
    • Kombinasi beberapa teknik sampling.
    • Contoh:
      • Tahap 1: Pilih fakultas secara acak.
      • Tahap 2: Pilih kelas secara acak di dalam fakultas.
      • Tahap 3: Pilih mahasiswa secara acak dalam kelas tersebut.
fakultas_terpilih <- sample(unique(data_mahasiswa$fakultas), 2)
sampel_multistage <- data_mahasiswa %>%
  filter(fakultas %in% fakultas_terpilih) %>%
  sample_n(50)
head(sampel_multistage)

2.2 Non-Probability Sampling

  1. Convenience Sampling
    • Sampel dipilih berdasarkan kemudahan akses.
    • Contoh: Wawancarai mahasiswa di kafetaria atau perpustakaan.
sampel_convenience <- data_mahasiswa %>% filter(id <= 200)
head(sampel_convenience)
  1. Quota Sampling
    • Sampel diambil sesuai dengan kuota yang telah ditentukan dalam setiap kategori, tanpa pemilihan acak.
    • Contoh: 50 mahasiswa dari setiap fakultas diwawancarai.
sampel_quota <- data_mahasiswa %>% group_by(fakultas) %>% slice_head(n = 50)
head(sampel_quota)
  1. Judgmental (Purposive) Sampling
    • Sampel dipilih berdasarkan penilaian peneliti tentang siapa yang paling representatif.
    • Contoh: Memilih penghuni asrama karena pengeluaran makanannya lebih stabil.
sampel_judgmental <- data_mahasiswa %>% filter(tahun_akademik == 4 & fakultas == "Ekonomi") %>% sample_n(50)
head(sampel_judgmental)
  1. Snowball Sampling
    • Responden awal diminta untuk merekomendasikan individu lain untuk bergabung dalam survei.
    • Contoh: Mahasiswa yang diwawancarai merekomendasikan teman-temannya untuk ikut serta dalam survei.
sampel_snowball <- data_mahasiswa %>% sample_n(5)
for (i in 1:3) {
    tambahan <- data_mahasiswa %>% sample_n(5)
    sampel_snowball <- bind_rows(sampel_snowball, tambahan)
}
head(sampel_snowball)

3. Perhitungan dan Visualisasi MoE untuk Pengambilan Sampel Probabilitas

3.1 Perhitungan MoE untuk Pengambilan Sampel Probabilitas

Margin of Error (MoE) dihitung menggunakan rumus:

\[ MOE = Z \times \frac{\sigma} {\sqrt{n}} \]

Di mana: - $( Z = 1.96 $) (untuk tingkat kepercayaan 95%) - $( $) = Simpangan baku sampel - $( n $) = Ukuran sampel

Hitung MoE untuk setiap metode Probability Sampling:

Z <- 1.96

# Fungsi untuk menghitung MoE
hitung_moe <- function(sample_data) {
  sigma <- sd(sample_data$pengeluaran)
  n <- nrow(sample_data)
  Z * (sigma / sqrt(n))
}

# Perhitungan MoE untuk setiap metode
moe_srs <- hitung_moe(sampel_srs)
moe_stratified <- hitung_moe(stratified_sample)
moe_systematic <- hitung_moe(sampel_systematic)
moe_cluster <- hitung_moe(sampel_cluster)
moe_multistage <- hitung_moe(sampel_multistage)

# Menampilkan hasil dalam tabel
moe_results <- data.frame(
  Metode = c("Simple Random Sampling", "Stratified Sampling", "Systematic Sampling", 
             "Cluster Sampling", "Multi-Stage Sampling"),
  MoE = c(moe_srs, moe_stratified, moe_systematic, moe_cluster, moe_multistage)
)

moe_results

3.2 Visualisasi Perbandingan MoE

Penulis membandingkan hasil MoE dari berbagai metode sampling dengan visualisasi berikut:

library(ggplot2)
library(scales)

ggplot(moe_results, aes(x = reorder(Metode, MoE), y = MoE, fill = Metode)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  scale_y_continuous(labels = comma) +  # Format angka di sumbu y
  theme_minimal() +
  labs(title = "Perbandingan Margin of Error Antar Metode Probability Sampling",
       x = "Metode Sampling", y = "Margin of Error") +
  coord_flip()


4. Analisis Bias dalam Pengambilan Sampel Non-Probabilitas

Dalam metode Non-Probability Sampling, pemilihan sampel tidak dilakukan secara acak, sehingga terdapat kemungkinan bias yang lebih besar dibandingkan dengan Probability Sampling. Bias ini dapat memengaruhi representativitas sampel dan keakuratan hasil survei, yang pada akhirnya dapat menghasilkan estimasi yang tidak valid atau menyesatkan.

Pada bagian ini, kita akan membahas sumber bias dalam masing-masing metode Non-Probability Sampling, bagaimana bias tersebut memengaruhi hasil survei, serta perbandingannya dengan Probability Sampling.


4.1 Sumber Bias dalam Setiap Metode Non-Probability Sampling

Metode Non-Probability Sampling Sumber Bias Penjelasan
Convenience Sampling Bias seleksi Hanya individu yang mudah diakses yang cenderung masuk dalam sampel. Hal ini menyebabkan sampel tidak mencerminkan seluruh populasi.
Quota Sampling Bias pemilihan subyektif Sampel dipilih berdasarkan kuota tertentu tetapi tanpa pemilihan acak. Ada kemungkinan karakteristik tertentu lebih dominan dalam sampel dibandingkan populasi sebenarnya.
Judgmental (Purposive) Sampling Bias subjektif dari peneliti Peneliti memilih individu berdasarkan pertimbangan tertentu, yang sering kali berdasarkan asumsi atau preferensi pribadi tanpa mekanisme acak.
Snowball Sampling Bias jaringan sosial Responden awal merekrut responden berikutnya dalam lingkaran sosial mereka, yang cenderung memiliki karakteristik serupa dan mengurangi keberagaman sampel.

4.2 Dampak Bias terhadap Hasil Survei dan Perbandingan dengan Probability Sampling

1. Ketidakmampuan Menggeneralisasi Hasil

Karena sampel tidak dipilih secara acak, hasil survei tidak dapat digeneralisasi ke seluruh populasi mahasiswa.

  • Contoh pada Convenience Sampling: Jika penelitian dilakukan hanya dengan mewawancarai mahasiswa yang sedang berada di kantin kampus, hasilnya kemungkinan besar lebih mencerminkan kebiasaan makan mahasiswa yang sering makan di luar daripada mereka yang lebih sering memasak sendiri.
    Akibatnya, estimasi rata-rata pengeluaran makanan menjadi bias karena tidak mencakup mahasiswa yang menghabiskan lebih sedikit dengan memasak sendiri.

  • Perbandingan dengan Probability Sampling: Dalam Simple Random Sampling (SRS), setiap mahasiswa memiliki peluang yang sama untuk dipilih, sehingga hasilnya lebih representatif terhadap seluruh populasi mahasiswa.


2. Estimasi yang Tidak Akurat dan Margin of Error yang Tidak Dapat Dihitung

Dalam Probability Sampling, kita dapat menghitung Margin of Error (MoE) untuk mengetahui tingkat ketidakpastian dalam estimasi, tetapi dalam Non-Probability Sampling, MoE sulit dihitung karena sampel tidak dipilih secara acak.

  • Contoh pada Quota Sampling: Misalnya, kita menetapkan kuota sebanyak 50 mahasiswa dari setiap fakultas, tetapi memilih responden pertama yang ditemukan tanpa mekanisme acak.
    Jika responden yang dipilih lebih banyak berasal dari kelas dengan jam kuliah pagi (karena survei dilakukan pada pagi hari), maka mereka yang kuliah di sore/malam hari mungkin kurang terwakili.
    Hal ini menyebabkan bias waktu dan menghasilkan estimasi yang kurang akurat.

  • Perbandingan dengan Probability Sampling: Dalam Stratified Sampling, kuota ditentukan berdasarkan proporsi populasi yang sebenarnya, dan sampel dipilih secara acak dari setiap strata, sehingga hasilnya lebih valid dan memungkinkan perhitungan MoE.


3. Bias dalam Pola Responden

Beberapa metode seperti Snowball Sampling dapat menyebabkan bias homogenitas, di mana responden cenderung berasal dari kelompok sosial yang sama.

  • Contoh pada Snowball Sampling: Jika penelitian tentang pengeluaran makanan dimulai dari mahasiswa yang tinggal di asrama, lalu mereka merekomendasikan teman sekamarnya untuk ikut serta dalam survei, maka sampel akan didominasi oleh mahasiswa asrama.
    Akibatnya, hasil survei tidak mencerminkan mahasiswa yang tinggal di kos atau bersama keluarga, yang mungkin memiliki pola pengeluaran yang berbeda.

  • Perbandingan dengan Probability Sampling: Dalam Cluster Sampling, pemilihan dilakukan secara acak terhadap kelompok (misalnya memilih beberapa kelas secara acak), sehingga ada kemungkinan mahasiswa dengan berbagai latar belakang terwakili dalam survei.


4. Kesalahan dalam Pengambilan Keputusan Berdasarkan Data yang Bias

Ketika data dari Non-Probability Sampling digunakan untuk mengambil keputusan, hasilnya bisa menyesatkan karena kurangnya representasi yang seimbang dari populasi secara keseluruhan.

  • Contoh pada Judgmental Sampling: Jika seorang peneliti hanya memilih mahasiswa jurusan Ekonomi karena mereka dianggap memiliki pemahaman yang lebih baik tentang pengeluaran, maka estimasi rata-rata pengeluaran makanan bisa menjadi lebih rendah dibandingkan kenyataan, karena mahasiswa dari jurusan lain mungkin memiliki kebiasaan belanja yang berbeda.

  • Perbandingan dengan Probability Sampling: Dalam Systematic Sampling, pemilihan dilakukan secara teratur dalam daftar mahasiswa, sehingga mengurangi kemungkinan seleksi subjektif dan meningkatkan representasi populasi yang lebih luas.


4.3 Perbandingan Non-Probability Sampling dan Probability Sampling

Kriteria Probability Sampling Non-Probability Sampling
Metode Pemilihan Acak, setiap elemen memiliki peluang diketahui untuk terpilih Tidak acak, peluang setiap elemen tidak diketahui
Bias Rendah, karena pemilihan dilakukan secara sistematis Tinggi, karena pemilihan sering dilakukan berdasarkan aksesibilitas atau subjektivitas
Kemampuan Menghitung MoE Bisa dihitung secara kuantitatif Sulit atau tidak bisa dihitung
Kemampuan Generalisasi Tinggi, hasil dapat digeneralisasi ke seluruh populasi Rendah, hasil hanya berlaku untuk kelompok yang disurvei
Contoh Metode Simple Random Sampling, Stratified Sampling, Cluster Sampling Convenience Sampling, Quota Sampling, Snowball Sampling
Keuntungan Lebih objektif dan representatif Mudah dilakukan, lebih hemat waktu dan biaya
Kekurangan Bisa lebih mahal dan membutuhkan lebih banyak sumber daya Tidak dapat memastikan bahwa hasilnya akurat atau mewakili populasi

4.4 Kesimpulan

  • Non-Probability Sampling memiliki bias yang lebih besar dibandingkan Probability Sampling, yang dapat menyebabkan hasil survei kurang akurat dan tidak dapat digeneralisasi.
  • Probability Sampling lebih unggul dalam penelitian yang membutuhkan estimasi kuantitatif yang dapat diukur dengan Margin of Error (MoE).
  • Non-Probability Sampling lebih cocok untuk penelitian eksploratif atau saat akses ke populasi terbatas, tetapi harus digunakan dengan hati-hati karena berisiko menghasilkan hasil yang bias.
  • Pemilihan metode sampling tergantung pada tujuan penelitian:
    • Jika tujuan utama adalah memperoleh hasil yang akurat dan representatif, Probability Sampling lebih direkomendasikan.
    • Jika hanya ingin eksplorasi awal dengan keterbatasan sumber daya, Non-Probability Sampling dapat digunakan, tetapi harus diinterpretasikan dengan hati-hati.

5. Perbandingan Semua Metode

5.1 Tabel Perbandingan Probability Sampling dan Non-Probability Sampling

Aspek Pembeda Probability Sampling Non-Probability Sampling
Definisi Teknik pengambilan sampel di mana setiap elemen dalam populasi memiliki peluang yang diketahui dan sama untuk terpilih. Teknik pengambilan sampel di mana tidak semua elemen dalam populasi memiliki peluang yang sama untuk terpilih.
Keacakan (Randomness) Sampel dipilih secara acak untuk menghindari bias. Sampel dipilih berdasarkan aksesibilitas, kemudahan, atau pertimbangan peneliti, sehingga lebih rentan terhadap bias.
Representativitas Cenderung menghasilkan sampel yang lebih representatif terhadap populasi. Kurang representatif karena tidak semua elemen populasi memiliki peluang yang sama untuk terpilih.
Bias Bias lebih kecil karena pemilihan dilakukan secara acak. Bias lebih tinggi karena pemilihan dilakukan secara subjektif atau berdasarkan aksesibilitas.
Generalizability (Generalisasi ke Populasi) Hasil penelitian dapat digeneralisasi ke seluruh populasi dengan tingkat kepercayaan tertentu. Hasil penelitian tidak dapat digeneralisasi dengan baik karena sampel mungkin tidak mewakili seluruh populasi.
Kompleksitas Memerlukan metode yang lebih terstruktur dan seringkali lebih kompleks. Lebih mudah diterapkan karena tidak memerlukan proses pemilihan sampel yang ketat.
Biaya dan Sumber Daya Biasanya lebih mahal karena memerlukan pemilihan sampel yang sistematis dan acak. Lebih murah dan cepat karena pemilihan sampel bisa dilakukan tanpa prosedur yang rumit.
Aplikasi Digunakan dalam penelitian yang membutuhkan akurasi tinggi dan generalisasi, seperti survei nasional atau eksperimen ilmiah. Digunakan dalam penelitian eksploratif atau ketika populasi sulit diakses, seperti studi komunitas tertentu.

5.2 Tabel Perbandingan Metode Probability dan Non-Probability Sampling

Aspek Pembeda Simple Random Sampling Systematic Sampling Stratified Sampling Cluster Sampling Convenience Sampling Purposive Sampling Quota Sampling Snowball Sampling
Keacakan Acak penuh Acak berdasarkan pola sistematis Acak dalam setiap strata Acak dalam klaster Tidak acak Tidak acak Tidak acak Tidak acak
Representativitas Sangat tinggi Tinggi Sangat tinggi Sedang Rendah Tergantung pada keahlian peneliti Sedang Rendah
Bias Sangat rendah Rendah Sangat rendah Sedang Tinggi Tergantung pada subjektivitas peneliti Sedang Tinggi
Kemudahan Penggunaan Sulit karena memerlukan daftar populasi lengkap Lebih mudah dari SRS Kompleks karena perlu identifikasi strata Lebih mudah untuk populasi besar Sangat mudah Mudah Sedang Bergantung pada jaringan sosial
Biaya Tinggi Sedang Tinggi Lebih rendah dari SRS Sangat rendah Rendah Sedang Rendah
Contoh Penggunaan Survei akademik Survei pelanggan perusahaan Studi pendidikan berdasarkan tingkat pendidikan Survei wilayah geografis Studi awal dengan responden yang tersedia Studi tentang pakar tertentu Survei opini publik Studi kelompok tertutup

6. Ukuran Sampel yang Diperlukan untuk MoE = 5

Ukuran sampel dihitung dengan rumus:

\[ n = \left( \frac{Z \times \sigma}{MoE} \right)^2 \]

# Nilai parameter
Z <- 1.96  # Z-score untuk tingkat kepercayaan 95%
MoE <- 5   # Margin of Error

# Fungsi untuk menghitung MoE
hitung_moe <- function(sample_data) {
  sigma <- sd(sample_data$pengeluaran)
  n <- nrow(sample_data)
  Z * (sigma / sqrt(n))
}

# Perhitungan Simpangan baku untuk setiap metode
sd_srs <- sd(sampel_srs$pengeluaran)
sd_stratified <- sd(stratified_sample$pengeluaran)
sd_systematic <- sd(sampel_systematic$pengeluaran)
sd_cluster <- sd(sampel_cluster$pengeluaran)
sd_multistage <- sd(sampel_multistage$pengeluaran)

# Hitung ukuran sampel minimum untuk masing-masing metode
n_simple_random <- ceiling((Z * sd_srs / MoE) ^ 2)
n_stratified <- ceiling((Z * sd_stratified / MoE) ^ 2)
n_systematic <- ceiling((Z * sd_systematic / MoE) ^ 2)
n_cluster <- ceiling((Z * sd_cluster / MoE) ^ 2)
n_multistage <- ceiling((Z * sd_multistage / MoE) ^ 2)

# Tampilkan hasil
cat("Ukuran sampel minimum yang diperlukan:\n")
## Ukuran sampel minimum yang diperlukan:
cat("1. Simple Random Sampling:", n_simple_random, "\n")
## 1. Simple Random Sampling: 41901493932
cat("2. Stratified Sampling:", n_stratified, "\n")
## 2. Stratified Sampling: 34614369148
cat("3. Systematic Sampling:", n_systematic, "\n")
## 3. Systematic Sampling: 33147310812
cat("4. Cluster Sampling:", n_cluster, "\n")
## 4. Cluster Sampling: 39694152227
cat("4. Multi-Stage Sampling:", n_multistage, "\n")
## 4. Multi-Stage Sampling: 38468642277

7. Kesimpulan dan Rekomendasi

Berdasarkan analisis ukuran sampel yang diperlukan untuk Margin of Error (MoE) sebesar 5, ditemukan bahwa jumlah minimum sampel yang dibutuhkan bervariasi tergantung pada metode pengambilan sampel yang digunakan. Metode dengan simpangan baku yang lebih besar memerlukan ukuran sampel yang lebih besar untuk mencapai tingkat presisi yang sama.

7.1 Kesimpulan:

  1. Ukuran sampel yang dihitung menunjukkan bahwa semakin besar variasi data dalam metode tertentu, semakin besar pula sampel yang diperlukan agar hasil estimasi lebih akurat.
  2. Jika sumber daya terbatas, metode pengambilan sampel dengan simpangan baku lebih kecil lebih disarankan karena membutuhkan ukuran sampel lebih kecil untuk mencapai MoE yang diinginkan.
  3. Metode sampling yang dipilih harus mempertimbangkan efisiensi dalam pengumpulan data serta representativitas sampel terhadap populasi yang diteliti.

7.2 Rekomendasi:

  1. Memilih metode dengan simpangan baku lebih kecil apabila keterbatasan waktu dan sumber daya menjadi faktor utama dalam penelitian.
  2. Menyesuaikan jumlah sampel berdasarkan kebutuhan akurasi, terutama jika penelitian menuntut Margin of Error yang lebih kecil dari 5.
  3. Menggunakan teknik pengambilan sampel yang lebih sistematis, seperti stratified sampling atau systematic sampling, untuk meningkatkan efisiensi tanpa harus meningkatkan jumlah sampel secara signifikan.
  4. Memastikan representasi sampel yang baik dengan memperhitungkan karakteristik populasi, sehingga hasil penelitian dapat digeneralisasi dengan lebih baik.

Dengan menerapkan rekomendasi ini, diharapkan penelitian dapat memperoleh hasil yang lebih valid dan dapat digunakan untuk pengambilan keputusan yang lebih tepat.

LS0tDQp0aXRsZTogIk1hcmdpbiBvZiBFcnJvciINCnN1YnRpdGxlOiAiVGVrbmlrIFNhbXBsaW5nIGRhbiBTdXJ2ZWkiDQphdXRob3I6ICJKT0FOUyBIRU5LWSBTRVJWQVRJVVMgU0lNQU5VTExBTkciDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUgMS5jc3MiDQotLS0NCjxpbWcgc3JjPSJmb3RvLmpwZWciIHN0eWxlPSJkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyB3aWR0aDogMzYwcHg7IGhlaWdodDogNDgwcHg7IiBhbHQ9IiI+DQoNCiMgTGFwb3JhbiBTdHVkaQ0KDQojIyAxLiBQZW5kYWh1bHVhbg0KDQojIyMgMS4xIFR1anVhbiBQZW5lbGl0aWFuDQpQZW5lbGl0aWFuIGluaSBiZXJ0dWp1YW4gdW50dWsgbWVuZ2V2YWx1YXNpIGJlcmJhZ2FpIG1ldG9kZSBwZW5nYW1iaWxhbiBzYW1wZWwgZGFsYW0gZXN0aW1hc2kgcGFyYW1ldGVyIHBvcHVsYXNpLCBraHVzdXNueWEgZGFsYW0ga29udGVrcyBlc3RpbWFzaSByYXRhLXJhdGEgcGVuZ2VsdWFyYW4gaW5kaXZpZHUgZGFsYW0gc3VhdHUgcG9wdWxhc2kuIEJlYmVyYXBhIG1ldG9kZSBzYW1wbGluZyB5YW5nIGRpZ3VuYWthbiBkYWxhbSBwZW5lbGl0aWFuIGluaSBtZWxpcHV0aSBTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIChTUlMpLCBTdHJhdGlmaWVkIFNhbXBsaW5nLCBTeXN0ZW1hdGljIFNhbXBsaW5nLCBDbHVzdGVyIFNhbXBsaW5nLCBkYW4gTXVsdGktU3RhZ2UgU2FtcGxpbmcuDQoNClNlbGFpbiBpdHUsIHBlbmVsaXRpYW4gaW5pIGp1Z2EgYmVydHVqdWFuIHVudHVrIG1lbmVudHVrYW4gdWt1cmFuIHNhbXBlbCBtaW5pbXVtIHlhbmcgZGlwZXJsdWthbiB1bnR1ayBtZW5jYXBhaSB0aW5na2F0IGtldGVsaXRpYW4gdGVydGVudHUsIHlhbmcgZGlueWF0YWthbiBkYWxhbSBNYXJnaW4gb2YgRXJyb3IgKE1vRSkuIERlbmdhbiBtZW5nZXRhaHVpIHVrdXJhbiBzYW1wZWwgeWFuZyBvcHRpbWFsLCBwZW5lbGl0aWFuIGluaSBkaWhhcmFwa2FuIGRhcGF0IG1lbWJlcmlrYW4gcmVrb21lbmRhc2kgbWVuZ2VuYWkgbWV0b2RlIHBlbmdhbWJpbGFuIHNhbXBlbCB5YW5nIGVmaXNpZW4gZGFuIHNlc3VhaSBkZW5nYW4ga2VidXR1aGFuIGFuYWxpc2lzIHN0YXRpc3Rpay4NCg0KIyMjIDEuMiBQZW50aW5nbnlhIE1hcmdpbiBvZiBFcnJvciAoTW9FKSBkYWxhbSBQZW5nYW1iaWxhbiBTYW1wZWwNCk1hcmdpbiBvZiBFcnJvciAoTW9FKSBtZXJ1cGFrYW4gc2FsYWggc2F0dSBwYXJhbWV0ZXIgcGVudGluZyBkYWxhbSBwZW5nYW1iaWxhbiBzYW1wZWwga2FyZW5hIG1lbmNlcm1pbmthbiB0aW5na2F0IGtldGVsaXRpYW4gZXN0aW1hc2kgdGVyaGFkYXAgcGFyYW1ldGVyIHBvcHVsYXNpIHlhbmcgc2ViZW5hcm55YS4gTW9FIG1lbnVuanVra2FuIHNlYmVyYXBhIGphdWggaGFzaWwgZXN0aW1hc2kgZGFyaSBzYW1wZWwgZGFwYXQgbWVueWltcGFuZyBkYXJpIG5pbGFpIHBvcHVsYXNpIHlhbmcgc2VzdW5nZ3VobnlhIGRlbmdhbiB0aW5na2F0IGtlcGVyY2F5YWFuIHRlcnRlbnR1Lg0KDQpEYWxhbSBwcmFrdGlrbnlhLCBzZW1ha2luIGtlY2lsIG5pbGFpIE1vRSB5YW5nIGRpaW5naW5rYW4sIHNlbWFraW4gYmVzYXIgdWt1cmFuIHNhbXBlbCB5YW5nIGRpYnV0dWhrYW4gdW50dWsgbWVuY2FwYWkgZXN0aW1hc2kgeWFuZyBsZWJpaCBha3VyYXQuIE9sZWgga2FyZW5hIGl0dSwgcGVtaWxpaGFuIHVrdXJhbiBzYW1wZWwgeWFuZyB0ZXBhdCBoYXJ1cyBtZW1wZXJ0aW1iYW5na2FuIGtlc2VpbWJhbmdhbiBhbnRhcmEgdGluZ2thdCBrZXRlbGl0aWFuIHlhbmcgZGlpbmdpbmthbiBkYW4gc3VtYmVyIGRheWEgeWFuZyB0ZXJzZWRpYS4NCg0KRGVuZ2FuIG1lbWFoYW1pIHBlcmFuIE1vRSBkYWxhbSBwZW5nYW1iaWxhbiBzYW1wZWwsIHBlbmVsaXRpYW4gaW5pIGFrYW4gbWVuZ2FuYWxpc2lzIGJhZ2FpbWFuYSB2YXJpYXNpIG1ldG9kZSBzYW1wbGluZyBkYW4gc2ltcGFuZ2FuIGJha3UgZGF0YSBtZW1wZW5nYXJ1aGkgdWt1cmFuIHNhbXBlbCB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuY2FwYWkgdGluZ2thdCBNb0UgdGVydGVudHUuDQoNCi0tLQ0KDQojIyAyLiBNZXRvZGUgUGVuZ2FtYmlsYW4gU2FtcGVsIHlhbmcgRGlndW5ha2FuDQoNClBlbmVsaXRpYW4gaW5pIG1lbmdndW5ha2FuIGRhdGFzZXQgc2ltdWxhc2kgeWFuZyB0ZXJkaXJpIGRhcmkgMTAuMDAwIG1haGFzaXN3YSwgbWVuY2FrdXAgaW5mb3JtYXNpIG1lbmdlbmFpIGZha3VsdGFzLCB0YWh1biBha2FkZW1paywgZGFuIHBlbmdlbHVhcmFuIG1ha2FuYW4gYnVsYW5hbi4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzYW1wbGluZykNCnNldC5zZWVkKDEyMykNCg0Kbl9wb3AgPC0gMTAwMDANCmRhdGFfbWFoYXNpc3dhIDwtIGRhdGEuZnJhbWUoDQogIGlkID0gMTpuX3BvcCwNCiAgZmFrdWx0YXMgPSBzYW1wbGUoYygiU2FpbnMiLCAiVGVrbmlrIiwgIkVrb25vbWkiLCAiU29zaWFsIiksIG5fcG9wLCByZXBsYWNlID0gVFJVRSksDQogIHRhaHVuX2FrYWRlbWlrID0gc2FtcGxlKDE6NCwgbl9wb3AsIHJlcGxhY2UgPSBUUlVFKSwNCiAgcGVuZ2VsdWFyYW4gPSByb3VuZChybm9ybShuX3BvcCwgbWVhbiA9IDE1MDAwMDAsIHNkID0gNTAwMDAwKSwgMCkNCikNCmBgYA0KDQpQZW5lbGl0aWFuIGluaSBtZW5lcmFwa2FuIG1ldG9kZSBQcm9iYWJpbGl0eSBTYW1wbGluZyBkYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nIGJlcmlrdXQ6DQoNCiMjIyAyLjEgUHJvYmFiaWxpdHkgU2FtcGxpbmcNCg0KMS4gKipTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIChTUlMpKioNCiAgIC0gU2V0aWFwIG1haGFzaXN3YSBtZW1pbGlraSBwZWx1YW5nIHlhbmcgc2FtYSB1bnR1ayBkaXBpbGloLg0KICAgLSBEaWxha3VrYW4gZGVuZ2FuIG1lbmdndW5ha2FuIGdlbmVyYXRvciBhbmdrYSBhY2FrIGF0YXUgdGFiZWwgYW5na2EgYWNhay4NCiAgIA0KYGBge3J9DQpzYW1wZWxfc3JzIDwtIGRhdGFfbWFoYXNpc3dhICU+JSBzYW1wbGVfbigyMDApDQpoZWFkKHNhbXBlbF9zcnMpDQpgYGANCg0KMi4gKipTdHJhdGlmaWVkIFNhbXBsaW5nKioNCiAgIC0gUG9wdWxhc2kgZGliYWdpIG1lbmphZGkga2Vsb21wb2sgKHN0cmF0YSkgYmVyZGFzYXJrYW4ga2FyYWt0ZXJpc3RpayB0ZXJ0ZW50dSwgc2VwZXJ0aSBmYWt1bHRhcyBhdGF1IHRhaHVuIGFrYWRlbWlrLg0KICAgLSBTYW1wZWwgZGlwaWxpaCBzZWNhcmEgYWNhayBkYXJpIHNldGlhcCBzdHJhdGEgc2VjYXJhIHByb3BvcnNpb25hbC4NCiAgIA0KYGBge3J9DQpzdHJhdGlmaWVkX3NhbXBsZSA8LSBkYXRhX21haGFzaXN3YSAlPiUgZ3JvdXBfYnkoZmFrdWx0YXMpICU+JSBzYW1wbGVfbig1MCkNCmhlYWQoc3RyYXRpZmllZF9zYW1wbGUpDQpgYGANCg0KMy4gKipTeXN0ZW1hdGljIFNhbXBsaW5nKioNCiAgIC0gU2V0aWFwIG1haGFzaXN3YSBrZS1rIGRpcGlsaWggZGFyaSBkYWZ0YXIgeWFuZyBkaXVydXRrYW4uDQogICAtIENvbnRvaDogSmlrYSBhZGEgMTAuMDAwIG1haGFzaXN3YSBkYW4gc2FtcGVsIHlhbmcgZGlidXR1aGthbiAyMDAsIG1ha2Egc2V0aWFwIG1haGFzaXN3YSBrZS01MCBha2FuIGRpcGlsaWguDQoNCmBgYHtyfQ0KayA8LSBmbG9vcihuX3BvcCAvIDIwMCkNCnNhbXBlbF9zeXN0ZW1hdGljIDwtIGRhdGFfbWFoYXNpc3dhW3NlcSgxLCBuX3BvcCwgYnkgPSBrKSwgXQ0KaGVhZChzYW1wZWxfc3lzdGVtYXRpYykNCmBgYA0KICAgDQo0LiAqKkNsdXN0ZXIgU2FtcGxpbmcqKg0KICAgLSBQb3B1bGFzaSBkaWJhZ2kgbWVuamFkaSBrZWxvbXBvayAoa2xhc3RlcikgZGFuIGJlYmVyYXBhIGtsYXN0ZXIgZGlwaWxpaCBzZWNhcmEgYWNhay4NCiAgIC0gU2VtdWEgYW5nZ290YSBkYWxhbSBrbGFzdGVyIHlhbmcgZGlwaWxpaCBha2FuIGRpc3VydmVpLg0KICAgDQpgYGB7cn0NCmNsdXN0ZXJfaWRzIDwtIHNhbXBsZSh1bmlxdWUoZGF0YV9tYWhhc2lzd2EkdGFodW5fYWthZGVtaWspLCAyKQ0Kc2FtcGVsX2NsdXN0ZXIgPC0gZGF0YV9tYWhhc2lzd2EgJT4lIGZpbHRlcih0YWh1bl9ha2FkZW1payAlaW4lIGNsdXN0ZXJfaWRzKQ0KaGVhZChzYW1wZWxfY2x1c3RlcikNCmBgYA0KDQo1LiAqKk11bHRpLVN0YWdlIFNhbXBsaW5nKioNCiAgIC0gS29tYmluYXNpIGJlYmVyYXBhIHRla25payBzYW1wbGluZy4NCiAgIC0gQ29udG9oOg0KICAgICAtIFRhaGFwIDE6IFBpbGloIGZha3VsdGFzIHNlY2FyYSBhY2FrLg0KICAgICAtIFRhaGFwIDI6IFBpbGloIGtlbGFzIHNlY2FyYSBhY2FrIGRpIGRhbGFtIGZha3VsdGFzLg0KICAgICAtIFRhaGFwIDM6IFBpbGloIG1haGFzaXN3YSBzZWNhcmEgYWNhayBkYWxhbSBrZWxhcyB0ZXJzZWJ1dC4NCg0KYGBge3J9DQpmYWt1bHRhc190ZXJwaWxpaCA8LSBzYW1wbGUodW5pcXVlKGRhdGFfbWFoYXNpc3dhJGZha3VsdGFzKSwgMikNCnNhbXBlbF9tdWx0aXN0YWdlIDwtIGRhdGFfbWFoYXNpc3dhICU+JQ0KICBmaWx0ZXIoZmFrdWx0YXMgJWluJSBmYWt1bHRhc190ZXJwaWxpaCkgJT4lDQogIHNhbXBsZV9uKDUwKQ0KaGVhZChzYW1wZWxfbXVsdGlzdGFnZSkNCmBgYA0KDQojIyMgMi4yIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZw0KDQoxLiAqKkNvbnZlbmllbmNlIFNhbXBsaW5nKioNCiAgIC0gU2FtcGVsIGRpcGlsaWggYmVyZGFzYXJrYW4ga2VtdWRhaGFuIGFrc2VzLg0KICAgLSBDb250b2g6IFdhd2FuY2FyYWkgbWFoYXNpc3dhIGRpIGthZmV0YXJpYSBhdGF1IHBlcnB1c3Rha2Fhbi4NCg0KYGBge3J9DQpzYW1wZWxfY29udmVuaWVuY2UgPC0gZGF0YV9tYWhhc2lzd2EgJT4lIGZpbHRlcihpZCA8PSAyMDApDQpoZWFkKHNhbXBlbF9jb252ZW5pZW5jZSkNCmBgYA0KDQoyLiAqKlF1b3RhIFNhbXBsaW5nKioNCiAgIC0gU2FtcGVsIGRpYW1iaWwgc2VzdWFpIGRlbmdhbiBrdW90YSB5YW5nIHRlbGFoIGRpdGVudHVrYW4gZGFsYW0gc2V0aWFwIGthdGVnb3JpLCB0YW5wYSBwZW1pbGloYW4gYWNhay4NCiAgIC0gQ29udG9oOiA1MCBtYWhhc2lzd2EgZGFyaSBzZXRpYXAgZmFrdWx0YXMgZGl3YXdhbmNhcmFpLg0KDQpgYGB7cn0NCnNhbXBlbF9xdW90YSA8LSBkYXRhX21haGFzaXN3YSAlPiUgZ3JvdXBfYnkoZmFrdWx0YXMpICU+JSBzbGljZV9oZWFkKG4gPSA1MCkNCmhlYWQoc2FtcGVsX3F1b3RhKQ0KYGBgDQogICANCjMuICoqSnVkZ21lbnRhbCAoUHVycG9zaXZlKSBTYW1wbGluZyoqDQogICAtIFNhbXBlbCBkaXBpbGloIGJlcmRhc2Fya2FuIHBlbmlsYWlhbiBwZW5lbGl0aSB0ZW50YW5nIHNpYXBhIHlhbmcgcGFsaW5nIHJlcHJlc2VudGF0aWYuDQogICAtIENvbnRvaDogTWVtaWxpaCBwZW5naHVuaSBhc3JhbWEga2FyZW5hIHBlbmdlbHVhcmFuIG1ha2FuYW5ueWEgbGViaWggc3RhYmlsLg0KDQpgYGB7cn0NCnNhbXBlbF9qdWRnbWVudGFsIDwtIGRhdGFfbWFoYXNpc3dhICU+JSBmaWx0ZXIodGFodW5fYWthZGVtaWsgPT0gNCAmIGZha3VsdGFzID09ICJFa29ub21pIikgJT4lIHNhbXBsZV9uKDUwKQ0KaGVhZChzYW1wZWxfanVkZ21lbnRhbCkNCmBgYA0KDQo0LiAqKlNub3diYWxsIFNhbXBsaW5nKioNCiAgIC0gUmVzcG9uZGVuIGF3YWwgZGltaW50YSB1bnR1ayBtZXJla29tZW5kYXNpa2FuIGluZGl2aWR1IGxhaW4gdW50dWsgYmVyZ2FidW5nIGRhbGFtIHN1cnZlaS4NCiAgIC0gQ29udG9oOiBNYWhhc2lzd2EgeWFuZyBkaXdhd2FuY2FyYWkgbWVyZWtvbWVuZGFzaWthbiB0ZW1hbi10ZW1hbm55YSB1bnR1ayBpa3V0IHNlcnRhIGRhbGFtIHN1cnZlaS4NCiAgIA0KYGBge3J9DQpzYW1wZWxfc25vd2JhbGwgPC0gZGF0YV9tYWhhc2lzd2EgJT4lIHNhbXBsZV9uKDUpDQpmb3IgKGkgaW4gMTozKSB7DQogICAgdGFtYmFoYW4gPC0gZGF0YV9tYWhhc2lzd2EgJT4lIHNhbXBsZV9uKDUpDQogICAgc2FtcGVsX3Nub3diYWxsIDwtIGJpbmRfcm93cyhzYW1wZWxfc25vd2JhbGwsIHRhbWJhaGFuKQ0KfQ0KaGVhZChzYW1wZWxfc25vd2JhbGwpDQpgYGANCg0KLS0tDQoNCiMjIDMuIFBlcmhpdHVuZ2FuIGRhbiBWaXN1YWxpc2FzaSBNb0UgdW50dWsgUGVuZ2FtYmlsYW4gU2FtcGVsIFByb2JhYmlsaXRhcw0KDQojIyMgMy4xIFBlcmhpdHVuZ2FuIE1vRSB1bnR1ayBQZW5nYW1iaWxhbiBTYW1wZWwgUHJvYmFiaWxpdGFzDQoNCk1hcmdpbiBvZiBFcnJvciAoTW9FKSBkaWhpdHVuZyBtZW5nZ3VuYWthbiBydW11czoNCg0KJCQgTU9FID0gWiBcdGltZXMgXGZyYWN7XHNpZ21hfSB7XHNxcnR7bn19ICQkDQoNCkRpIG1hbmE6DQotICQoIFogPSAxLjk2ICQpICh1bnR1ayB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JSkNCi0gJCggXHNpZ21hICQpID0gU2ltcGFuZ2FuIGJha3Ugc2FtcGVsDQotICQoIG4gJCkgPSBVa3VyYW4gc2FtcGVsDQoNCkhpdHVuZyBNb0UgdW50dWsgc2V0aWFwIG1ldG9kZSBQcm9iYWJpbGl0eSBTYW1wbGluZzoNCg0KYGBge3J9DQpaIDwtIDEuOTYNCg0KIyBGdW5nc2kgdW50dWsgbWVuZ2hpdHVuZyBNb0UNCmhpdHVuZ19tb2UgPC0gZnVuY3Rpb24oc2FtcGxlX2RhdGEpIHsNCiAgc2lnbWEgPC0gc2Qoc2FtcGxlX2RhdGEkcGVuZ2VsdWFyYW4pDQogIG4gPC0gbnJvdyhzYW1wbGVfZGF0YSkNCiAgWiAqIChzaWdtYSAvIHNxcnQobikpDQp9DQoNCiMgUGVyaGl0dW5nYW4gTW9FIHVudHVrIHNldGlhcCBtZXRvZGUNCm1vZV9zcnMgPC0gaGl0dW5nX21vZShzYW1wZWxfc3JzKQ0KbW9lX3N0cmF0aWZpZWQgPC0gaGl0dW5nX21vZShzdHJhdGlmaWVkX3NhbXBsZSkNCm1vZV9zeXN0ZW1hdGljIDwtIGhpdHVuZ19tb2Uoc2FtcGVsX3N5c3RlbWF0aWMpDQptb2VfY2x1c3RlciA8LSBoaXR1bmdfbW9lKHNhbXBlbF9jbHVzdGVyKQ0KbW9lX211bHRpc3RhZ2UgPC0gaGl0dW5nX21vZShzYW1wZWxfbXVsdGlzdGFnZSkNCg0KIyBNZW5hbXBpbGthbiBoYXNpbCBkYWxhbSB0YWJlbA0KbW9lX3Jlc3VsdHMgPC0gZGF0YS5mcmFtZSgNCiAgTWV0b2RlID0gYygiU2ltcGxlIFJhbmRvbSBTYW1wbGluZyIsICJTdHJhdGlmaWVkIFNhbXBsaW5nIiwgIlN5c3RlbWF0aWMgU2FtcGxpbmciLCANCiAgICAgICAgICAgICAiQ2x1c3RlciBTYW1wbGluZyIsICJNdWx0aS1TdGFnZSBTYW1wbGluZyIpLA0KICBNb0UgPSBjKG1vZV9zcnMsIG1vZV9zdHJhdGlmaWVkLCBtb2Vfc3lzdGVtYXRpYywgbW9lX2NsdXN0ZXIsIG1vZV9tdWx0aXN0YWdlKQ0KKQ0KDQptb2VfcmVzdWx0cw0KYGBgDQoNCiMjIyAzLjIgVmlzdWFsaXNhc2kgUGVyYmFuZGluZ2FuIE1vRQ0KUGVudWxpcyBtZW1iYW5kaW5na2FuIGhhc2lsIE1vRSBkYXJpIGJlcmJhZ2FpIG1ldG9kZSBzYW1wbGluZyBkZW5nYW4gdmlzdWFsaXNhc2kgYmVyaWt1dDoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCg0KZ2dwbG90KG1vZV9yZXN1bHRzLCBhZXMoeCA9IHJlb3JkZXIoTWV0b2RlLCBNb0UpLCB5ID0gTW9FLCBmaWxsID0gTWV0b2RlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgICMgRm9ybWF0IGFuZ2thIGRpIHN1bWJ1IHkNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJQZXJiYW5kaW5nYW4gTWFyZ2luIG9mIEVycm9yIEFudGFyIE1ldG9kZSBQcm9iYWJpbGl0eSBTYW1wbGluZyIsDQogICAgICAgeCA9ICJNZXRvZGUgU2FtcGxpbmciLCB5ID0gIk1hcmdpbiBvZiBFcnJvciIpICsNCiAgY29vcmRfZmxpcCgpDQoNCmBgYA0KDQotLS0NCg0KIyMgNC4gQW5hbGlzaXMgQmlhcyBkYWxhbSBQZW5nYW1iaWxhbiBTYW1wZWwgTm9uLVByb2JhYmlsaXRhcw0KDQpEYWxhbSBtZXRvZGUgKk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyosIHBlbWlsaWhhbiBzYW1wZWwgdGlkYWsgZGlsYWt1a2FuIHNlY2FyYSBhY2FrLCBzZWhpbmdnYSB0ZXJkYXBhdCBrZW11bmdraW5hbiBiaWFzIHlhbmcgbGViaWggYmVzYXIgZGliYW5kaW5na2FuIGRlbmdhbiAqUHJvYmFiaWxpdHkgU2FtcGxpbmcqLiBCaWFzIGluaSBkYXBhdCBtZW1lbmdhcnVoaSByZXByZXNlbnRhdGl2aXRhcyBzYW1wZWwgZGFuIGtlYWt1cmF0YW4gaGFzaWwgc3VydmVpLCB5YW5nIHBhZGEgYWtoaXJueWEgZGFwYXQgbWVuZ2hhc2lsa2FuIGVzdGltYXNpIHlhbmcgdGlkYWsgdmFsaWQgYXRhdSBtZW55ZXNhdGthbi4NCg0KUGFkYSBiYWdpYW4gaW5pLCBraXRhIGFrYW4gbWVtYmFoYXMgc3VtYmVyIGJpYXMgZGFsYW0gbWFzaW5nLW1hc2luZyBtZXRvZGUgKk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyosIGJhZ2FpbWFuYSBiaWFzIHRlcnNlYnV0IG1lbWVuZ2FydWhpIGhhc2lsIHN1cnZlaSwgc2VydGEgcGVyYmFuZGluZ2FubnlhIGRlbmdhbiAqUHJvYmFiaWxpdHkgU2FtcGxpbmcqLg0KDQotLS0NCg0KIyMjIDQuMSBTdW1iZXIgQmlhcyBkYWxhbSBTZXRpYXAgTWV0b2RlIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZw0KDQp8ICoqTWV0b2RlIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyoqIHwgKipTdW1iZXIgQmlhcyoqIHwgKipQZW5qZWxhc2FuKiogfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfA0KfCAqQ29udmVuaWVuY2UgU2FtcGxpbmcqIHwgQmlhcyBzZWxla3NpIHwgSGFueWEgaW5kaXZpZHUgeWFuZyBtdWRhaCBkaWFrc2VzIHlhbmcgY2VuZGVydW5nIG1hc3VrIGRhbGFtIHNhbXBlbC4gSGFsIGluaSBtZW55ZWJhYmthbiBzYW1wZWwgdGlkYWsgbWVuY2VybWlua2FuIHNlbHVydWggcG9wdWxhc2kuIHwNCnwgKlF1b3RhIFNhbXBsaW5nKiB8IEJpYXMgcGVtaWxpaGFuIHN1Ynlla3RpZiB8IFNhbXBlbCBkaXBpbGloIGJlcmRhc2Fya2FuIGt1b3RhIHRlcnRlbnR1IHRldGFwaSB0YW5wYSBwZW1pbGloYW4gYWNhay4gQWRhIGtlbXVuZ2tpbmFuIGthcmFrdGVyaXN0aWsgdGVydGVudHUgbGViaWggZG9taW5hbiBkYWxhbSBzYW1wZWwgZGliYW5kaW5na2FuIHBvcHVsYXNpIHNlYmVuYXJueWEuIHwNCnwgKkp1ZGdtZW50YWwgKFB1cnBvc2l2ZSkgU2FtcGxpbmcqIHwgQmlhcyBzdWJqZWt0aWYgZGFyaSBwZW5lbGl0aSB8IFBlbmVsaXRpIG1lbWlsaWggaW5kaXZpZHUgYmVyZGFzYXJrYW4gcGVydGltYmFuZ2FuIHRlcnRlbnR1LCB5YW5nIHNlcmluZyBrYWxpIGJlcmRhc2Fya2FuIGFzdW1zaSBhdGF1IHByZWZlcmVuc2kgcHJpYmFkaSB0YW5wYSBtZWthbmlzbWUgYWNhay4gfA0KfCAqU25vd2JhbGwgU2FtcGxpbmcqIHwgQmlhcyBqYXJpbmdhbiBzb3NpYWwgfCBSZXNwb25kZW4gYXdhbCBtZXJla3J1dCByZXNwb25kZW4gYmVyaWt1dG55YSBkYWxhbSBsaW5na2FyYW4gc29zaWFsIG1lcmVrYSwgeWFuZyBjZW5kZXJ1bmcgbWVtaWxpa2kga2FyYWt0ZXJpc3RpayBzZXJ1cGEgZGFuIG1lbmd1cmFuZ2kga2ViZXJhZ2FtYW4gc2FtcGVsLiB8DQoNCi0tLQ0KDQojIyMgNC4yIERhbXBhayBCaWFzIHRlcmhhZGFwIEhhc2lsIFN1cnZlaSBkYW4gUGVyYmFuZGluZ2FuIGRlbmdhbiBQcm9iYWJpbGl0eSBTYW1wbGluZw0KDQojIyMjIDEuIEtldGlkYWttYW1wdWFuIE1lbmdnZW5lcmFsaXNhc2kgSGFzaWwNCkthcmVuYSBzYW1wZWwgdGlkYWsgZGlwaWxpaCBzZWNhcmEgYWNhaywgaGFzaWwgc3VydmVpIHRpZGFrIGRhcGF0IGRpZ2VuZXJhbGlzYXNpIGtlIHNlbHVydWggcG9wdWxhc2kgbWFoYXNpc3dhLg0KDQotICoqQ29udG9oIHBhZGEgQ29udmVuaWVuY2UgU2FtcGxpbmc6KioNCkppa2EgcGVuZWxpdGlhbiBkaWxha3VrYW4gaGFueWEgZGVuZ2FuIG1ld2F3YW5jYXJhaSBtYWhhc2lzd2EgeWFuZyBzZWRhbmcgYmVyYWRhIGRpIGthbnRpbiBrYW1wdXMsIGhhc2lsbnlhIGtlbXVuZ2tpbmFuIGJlc2FyIGxlYmloIG1lbmNlcm1pbmthbiBrZWJpYXNhYW4gbWFrYW4gbWFoYXNpc3dhIHlhbmcgc2VyaW5nIG1ha2FuIGRpIGx1YXIgZGFyaXBhZGEgbWVyZWthIHlhbmcgbGViaWggc2VyaW5nIG1lbWFzYWsgc2VuZGlyaS4gIA0KQWtpYmF0bnlhLCBlc3RpbWFzaSByYXRhLXJhdGEgcGVuZ2VsdWFyYW4gbWFrYW5hbiBtZW5qYWRpIGJpYXMga2FyZW5hIHRpZGFrIG1lbmNha3VwIG1haGFzaXN3YSB5YW5nIG1lbmdoYWJpc2thbiBsZWJpaCBzZWRpa2l0IGRlbmdhbiBtZW1hc2FrIHNlbmRpcmkuDQoNCi0gKipQZXJiYW5kaW5nYW4gZGVuZ2FuIFByb2JhYmlsaXR5IFNhbXBsaW5nOioqDQpEYWxhbSAqU2ltcGxlIFJhbmRvbSBTYW1wbGluZyAoU1JTKSosIHNldGlhcCBtYWhhc2lzd2EgbWVtaWxpa2kgcGVsdWFuZyB5YW5nIHNhbWEgdW50dWsgZGlwaWxpaCwgc2VoaW5nZ2EgaGFzaWxueWEgbGViaWggcmVwcmVzZW50YXRpZiB0ZXJoYWRhcCBzZWx1cnVoIHBvcHVsYXNpIG1haGFzaXN3YS4NCg0KLS0tDQoNCiMjIyMgMi4gRXN0aW1hc2kgeWFuZyBUaWRhayBBa3VyYXQgZGFuIE1hcmdpbiBvZiBFcnJvciB5YW5nIFRpZGFrIERhcGF0IERpaGl0dW5nDQpEYWxhbSAqUHJvYmFiaWxpdHkgU2FtcGxpbmcqLCBraXRhIGRhcGF0IG1lbmdoaXR1bmcgKk1hcmdpbiBvZiBFcnJvciogKCpNb0UqKSB1bnR1ayBtZW5nZXRhaHVpIHRpbmdrYXQga2V0aWRha3Bhc3RpYW4gZGFsYW0gZXN0aW1hc2ksIHRldGFwaSBkYWxhbSAqTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKiwgKk1vRSogc3VsaXQgZGloaXR1bmcga2FyZW5hIHNhbXBlbCB0aWRhayBkaXBpbGloIHNlY2FyYSBhY2FrLg0KDQotICoqQ29udG9oIHBhZGEgUXVvdGEgU2FtcGxpbmc6KioNCk1pc2FsbnlhLCBraXRhIG1lbmV0YXBrYW4ga3VvdGEgc2ViYW55YWsgNTAgbWFoYXNpc3dhIGRhcmkgc2V0aWFwIGZha3VsdGFzLCB0ZXRhcGkgbWVtaWxpaCByZXNwb25kZW4gcGVydGFtYSB5YW5nIGRpdGVtdWthbiB0YW5wYSBtZWthbmlzbWUgYWNhay4gIA0KSmlrYSByZXNwb25kZW4geWFuZyBkaXBpbGloIGxlYmloIGJhbnlhayBiZXJhc2FsIGRhcmkga2VsYXMgZGVuZ2FuIGphbSBrdWxpYWggcGFnaSAoa2FyZW5hIHN1cnZlaSBkaWxha3VrYW4gcGFkYSBwYWdpIGhhcmkpLCBtYWthIG1lcmVrYSB5YW5nIGt1bGlhaCBkaSBzb3JlL21hbGFtIGhhcmkgbXVuZ2tpbiBrdXJhbmcgdGVyd2FraWxpLiAgDQpIYWwgaW5pIG1lbnllYmFia2FuICpiaWFzIHdha3R1KiBkYW4gbWVuZ2hhc2lsa2FuIGVzdGltYXNpIHlhbmcga3VyYW5nIGFrdXJhdC4NCg0KLSAqKlBlcmJhbmRpbmdhbiBkZW5nYW4gUHJvYmFiaWxpdHkgU2FtcGxpbmc6KioNCkRhbGFtICpTdHJhdGlmaWVkIFNhbXBsaW5nKiwga3VvdGEgZGl0ZW50dWthbiBiZXJkYXNhcmthbiBwcm9wb3JzaSBwb3B1bGFzaSB5YW5nIHNlYmVuYXJueWEsIGRhbiBzYW1wZWwgZGlwaWxpaCBzZWNhcmEgYWNhayBkYXJpIHNldGlhcCBzdHJhdGEsIHNlaGluZ2dhIGhhc2lsbnlhIGxlYmloIHZhbGlkIGRhbiBtZW11bmdraW5rYW4gcGVyaGl0dW5nYW4gKk1vRSouDQoNCi0tLQ0KDQojIyMjIDMuIEJpYXMgZGFsYW0gUG9sYSBSZXNwb25kZW4NCkJlYmVyYXBhIG1ldG9kZSBzZXBlcnRpICpTbm93YmFsbCBTYW1wbGluZyogZGFwYXQgbWVueWViYWJrYW4gKmJpYXMgaG9tb2dlbml0YXMqLCBkaSBtYW5hIHJlc3BvbmRlbiBjZW5kZXJ1bmcgYmVyYXNhbCBkYXJpIGtlbG9tcG9rIHNvc2lhbCB5YW5nIHNhbWEuDQoNCi0gKipDb250b2ggcGFkYSBTbm93YmFsbCBTYW1wbGluZzoqKg0KSmlrYSBwZW5lbGl0aWFuIHRlbnRhbmcgcGVuZ2VsdWFyYW4gbWFrYW5hbiBkaW11bGFpIGRhcmkgbWFoYXNpc3dhIHlhbmcgdGluZ2dhbCBkaSBhc3JhbWEsIGxhbHUgbWVyZWthIG1lcmVrb21lbmRhc2lrYW4gdGVtYW4gc2VrYW1hcm55YSB1bnR1ayBpa3V0IHNlcnRhIGRhbGFtIHN1cnZlaSwgbWFrYSBzYW1wZWwgYWthbiBkaWRvbWluYXNpIG9sZWggbWFoYXNpc3dhIGFzcmFtYS4gIA0KQWtpYmF0bnlhLCBoYXNpbCBzdXJ2ZWkgdGlkYWsgbWVuY2VybWlua2FuIG1haGFzaXN3YSB5YW5nIHRpbmdnYWwgZGkga29zIGF0YXUgYmVyc2FtYSBrZWx1YXJnYSwgeWFuZyBtdW5na2luIG1lbWlsaWtpIHBvbGEgcGVuZ2VsdWFyYW4geWFuZyBiZXJiZWRhLg0KDQotICoqUGVyYmFuZGluZ2FuIGRlbmdhbiBQcm9iYWJpbGl0eSBTYW1wbGluZzoqKg0KRGFsYW0gKkNsdXN0ZXIgU2FtcGxpbmcqLCBwZW1pbGloYW4gZGlsYWt1a2FuIHNlY2FyYSBhY2FrIHRlcmhhZGFwIGtlbG9tcG9rIChtaXNhbG55YSBtZW1pbGloIGJlYmVyYXBhIGtlbGFzIHNlY2FyYSBhY2FrKSwgc2VoaW5nZ2EgYWRhIGtlbXVuZ2tpbmFuIG1haGFzaXN3YSBkZW5nYW4gYmVyYmFnYWkgbGF0YXIgYmVsYWthbmcgdGVyd2FraWxpIGRhbGFtIHN1cnZlaS4NCg0KLS0tDQoNCiMjIyMgNC4gS2VzYWxhaGFuIGRhbGFtIFBlbmdhbWJpbGFuIEtlcHV0dXNhbiBCZXJkYXNhcmthbiBEYXRhIHlhbmcgQmlhcw0KS2V0aWthIGRhdGEgZGFyaSAqTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKiBkaWd1bmFrYW4gdW50dWsgbWVuZ2FtYmlsIGtlcHV0dXNhbiwgaGFzaWxueWEgYmlzYSBtZW55ZXNhdGthbiBrYXJlbmEga3VyYW5nbnlhIHJlcHJlc2VudGFzaSB5YW5nIHNlaW1iYW5nIGRhcmkgcG9wdWxhc2kgc2VjYXJhIGtlc2VsdXJ1aGFuLg0KDQotICoqQ29udG9oIHBhZGEgSnVkZ21lbnRhbCBTYW1wbGluZzoqKg0KSmlrYSBzZW9yYW5nIHBlbmVsaXRpIGhhbnlhIG1lbWlsaWggbWFoYXNpc3dhIGp1cnVzYW4gRWtvbm9taSBrYXJlbmEgbWVyZWthIGRpYW5nZ2FwIG1lbWlsaWtpIHBlbWFoYW1hbiB5YW5nIGxlYmloIGJhaWsgdGVudGFuZyBwZW5nZWx1YXJhbiwgbWFrYSBlc3RpbWFzaSByYXRhLXJhdGEgcGVuZ2VsdWFyYW4gbWFrYW5hbiBiaXNhIG1lbmphZGkgbGViaWggcmVuZGFoIGRpYmFuZGluZ2thbiBrZW55YXRhYW4sIGthcmVuYSBtYWhhc2lzd2EgZGFyaSBqdXJ1c2FuIGxhaW4gbXVuZ2tpbiBtZW1pbGlraSBrZWJpYXNhYW4gYmVsYW5qYSB5YW5nIGJlcmJlZGEuDQoNCi0gKipQZXJiYW5kaW5nYW4gZGVuZ2FuIFByb2JhYmlsaXR5IFNhbXBsaW5nOioqDQpEYWxhbSAqU3lzdGVtYXRpYyBTYW1wbGluZyosIHBlbWlsaWhhbiBkaWxha3VrYW4gc2VjYXJhIHRlcmF0dXIgZGFsYW0gZGFmdGFyIG1haGFzaXN3YSwgc2VoaW5nZ2EgbWVuZ3VyYW5naSBrZW11bmdraW5hbiBzZWxla3NpIHN1Ympla3RpZiBkYW4gbWVuaW5na2F0a2FuIHJlcHJlc2VudGFzaSBwb3B1bGFzaSB5YW5nIGxlYmloIGx1YXMuDQoNCi0tLQ0KDQojIyMgNC4zIFBlcmJhbmRpbmdhbiBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgZGFuIFByb2JhYmlsaXR5IFNhbXBsaW5nDQoNCnwgKipLcml0ZXJpYSoqIHwgKipQcm9iYWJpbGl0eSBTYW1wbGluZyoqIHwgKipOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcqKiB8DQp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqTWV0b2RlIFBlbWlsaWhhbioqIHwgQWNhaywgc2V0aWFwIGVsZW1lbiBtZW1pbGlraSBwZWx1YW5nIGRpa2V0YWh1aSB1bnR1ayB0ZXJwaWxpaCB8IFRpZGFrIGFjYWssIHBlbHVhbmcgc2V0aWFwIGVsZW1lbiB0aWRhayBkaWtldGFodWkgfA0KfCAqKkJpYXMqKiB8IFJlbmRhaCwga2FyZW5hIHBlbWlsaWhhbiBkaWxha3VrYW4gc2VjYXJhIHNpc3RlbWF0aXMgfCBUaW5nZ2ksIGthcmVuYSBwZW1pbGloYW4gc2VyaW5nIGRpbGFrdWthbiBiZXJkYXNhcmthbiBha3Nlc2liaWxpdGFzIGF0YXUgc3ViamVrdGl2aXRhcyB8DQp8ICoqS2VtYW1wdWFuIE1lbmdoaXR1bmcgTW9FKiogfCBCaXNhIGRpaGl0dW5nIHNlY2FyYSBrdWFudGl0YXRpZiB8IFN1bGl0IGF0YXUgdGlkYWsgYmlzYSBkaWhpdHVuZyB8DQp8ICoqS2VtYW1wdWFuIEdlbmVyYWxpc2FzaSoqIHwgVGluZ2dpLCBoYXNpbCBkYXBhdCBkaWdlbmVyYWxpc2FzaSBrZSBzZWx1cnVoIHBvcHVsYXNpIHwgUmVuZGFoLCBoYXNpbCBoYW55YSBiZXJsYWt1IHVudHVrIGtlbG9tcG9rIHlhbmcgZGlzdXJ2ZWkgfA0KfCAqKkNvbnRvaCBNZXRvZGUqKiB8ICpTaW1wbGUgUmFuZG9tIFNhbXBsaW5nLCBTdHJhdGlmaWVkIFNhbXBsaW5nLCBDbHVzdGVyIFNhbXBsaW5nKiB8ICpDb252ZW5pZW5jZSBTYW1wbGluZywgUXVvdGEgU2FtcGxpbmcsIFNub3diYWxsIFNhbXBsaW5nKiB8DQp8ICoqS2V1bnR1bmdhbioqIHwgTGViaWggb2JqZWt0aWYgZGFuIHJlcHJlc2VudGF0aWYgfCBNdWRhaCBkaWxha3VrYW4sIGxlYmloIGhlbWF0IHdha3R1IGRhbiBiaWF5YSB8DQp8ICoqS2VrdXJhbmdhbioqIHwgQmlzYSBsZWJpaCBtYWhhbCBkYW4gbWVtYnV0dWhrYW4gbGViaWggYmFueWFrIHN1bWJlciBkYXlhIHwgVGlkYWsgZGFwYXQgbWVtYXN0aWthbiBiYWh3YSBoYXNpbG55YSBha3VyYXQgYXRhdSBtZXdha2lsaSBwb3B1bGFzaSB8DQoNCi0tLQ0KDQojIyMgNC40IEtlc2ltcHVsYW4NCi0gKk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyogbWVtaWxpa2kgYmlhcyB5YW5nIGxlYmloIGJlc2FyIGRpYmFuZGluZ2thbiAqUHJvYmFiaWxpdHkgU2FtcGxpbmcqLCB5YW5nIGRhcGF0IG1lbnllYmFia2FuIGhhc2lsIHN1cnZlaSBrdXJhbmcgYWt1cmF0IGRhbiB0aWRhayBkYXBhdCBkaWdlbmVyYWxpc2FzaS4NCi0gKlByb2JhYmlsaXR5IFNhbXBsaW5nKiBsZWJpaCB1bmdndWwgZGFsYW0gcGVuZWxpdGlhbiB5YW5nIG1lbWJ1dHVoa2FuIGVzdGltYXNpIGt1YW50aXRhdGlmIHlhbmcgZGFwYXQgZGl1a3VyIGRlbmdhbiAqTWFyZ2luIG9mIEVycm9yKiAoKk1vRSopLg0KLSAqTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKiBsZWJpaCBjb2NvayB1bnR1ayBwZW5lbGl0aWFuIGVrc3Bsb3JhdGlmIGF0YXUgc2FhdCBha3NlcyBrZSBwb3B1bGFzaSB0ZXJiYXRhcywgdGV0YXBpIGhhcnVzIGRpZ3VuYWthbiBkZW5nYW4gaGF0aS1oYXRpIGthcmVuYSBiZXJpc2lrbyBtZW5naGFzaWxrYW4gaGFzaWwgeWFuZyBiaWFzLg0KLSAqKlBlbWlsaWhhbiBtZXRvZGUgc2FtcGxpbmcgdGVyZ2FudHVuZyBwYWRhIHR1anVhbiBwZW5lbGl0aWFuKio6DQogIC0gSmlrYSB0dWp1YW4gdXRhbWEgYWRhbGFoIG1lbXBlcm9sZWggaGFzaWwgeWFuZyBha3VyYXQgZGFuIHJlcHJlc2VudGF0aWYsICpQcm9iYWJpbGl0eSBTYW1wbGluZyogbGViaWggZGlyZWtvbWVuZGFzaWthbi4NCiAgLSBKaWthIGhhbnlhIGluZ2luIGVrc3Bsb3Jhc2kgYXdhbCBkZW5nYW4ga2V0ZXJiYXRhc2FuIHN1bWJlciBkYXlhLCAqTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKiBkYXBhdCBkaWd1bmFrYW4sIHRldGFwaSBoYXJ1cyBkaWludGVycHJldGFzaWthbiBkZW5nYW4gaGF0aS1oYXRpLg0KDQotLS0NCg0KIyMgNS4gUGVyYmFuZGluZ2FuIFNlbXVhIE1ldG9kZQ0KDQojIyMgNS4xIFRhYmVsIFBlcmJhbmRpbmdhbiBQcm9iYWJpbGl0eSBTYW1wbGluZyBkYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nDQoNCnwgQXNwZWsgUGVtYmVkYSB8IFByb2JhYmlsaXR5IFNhbXBsaW5nIHwgTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBEZWZpbmlzaSAgICAgICAgICB8IFRla25payBwZW5nYW1iaWxhbiBzYW1wZWwgZGkgbWFuYSBzZXRpYXAgZWxlbWVuIGRhbGFtIHBvcHVsYXNpIG1lbWlsaWtpIHBlbHVhbmcgeWFuZyBkaWtldGFodWkgZGFuIHNhbWEgdW50dWsgdGVycGlsaWguIHwgVGVrbmlrIHBlbmdhbWJpbGFuIHNhbXBlbCBkaSBtYW5hIHRpZGFrIHNlbXVhIGVsZW1lbiBkYWxhbSBwb3B1bGFzaSBtZW1pbGlraSBwZWx1YW5nIHlhbmcgc2FtYSB1bnR1ayB0ZXJwaWxpaC4gfA0KfCBLZWFjYWthbiAoUmFuZG9tbmVzcykgfCBTYW1wZWwgZGlwaWxpaCBzZWNhcmEgYWNhayB1bnR1ayBtZW5naGluZGFyaSBiaWFzLiB8IFNhbXBlbCBkaXBpbGloIGJlcmRhc2Fya2FuIGFrc2VzaWJpbGl0YXMsIGtlbXVkYWhhbiwgYXRhdSBwZXJ0aW1iYW5nYW4gcGVuZWxpdGksIHNlaGluZ2dhIGxlYmloIHJlbnRhbiB0ZXJoYWRhcCBiaWFzLiB8DQp8IFJlcHJlc2VudGF0aXZpdGFzIHwgQ2VuZGVydW5nIG1lbmdoYXNpbGthbiBzYW1wZWwgeWFuZyBsZWJpaCByZXByZXNlbnRhdGlmIHRlcmhhZGFwIHBvcHVsYXNpLiB8IEt1cmFuZyByZXByZXNlbnRhdGlmIGthcmVuYSB0aWRhayBzZW11YSBlbGVtZW4gcG9wdWxhc2kgbWVtaWxpa2kgcGVsdWFuZyB5YW5nIHNhbWEgdW50dWsgdGVycGlsaWguIHwNCnwgQmlhcyB8IEJpYXMgbGViaWgga2VjaWwga2FyZW5hIHBlbWlsaWhhbiBkaWxha3VrYW4gc2VjYXJhIGFjYWsuIHwgQmlhcyBsZWJpaCB0aW5nZ2kga2FyZW5hIHBlbWlsaWhhbiBkaWxha3VrYW4gc2VjYXJhIHN1Ympla3RpZiBhdGF1IGJlcmRhc2Fya2FuIGFrc2VzaWJpbGl0YXMuIHwNCnwgR2VuZXJhbGl6YWJpbGl0eSAoR2VuZXJhbGlzYXNpIGtlIFBvcHVsYXNpKSB8IEhhc2lsIHBlbmVsaXRpYW4gZGFwYXQgZGlnZW5lcmFsaXNhc2kga2Ugc2VsdXJ1aCBwb3B1bGFzaSBkZW5nYW4gdGluZ2thdCBrZXBlcmNheWFhbiB0ZXJ0ZW50dS4gfCBIYXNpbCBwZW5lbGl0aWFuIHRpZGFrIGRhcGF0IGRpZ2VuZXJhbGlzYXNpIGRlbmdhbiBiYWlrIGthcmVuYSBzYW1wZWwgbXVuZ2tpbiB0aWRhayBtZXdha2lsaSBzZWx1cnVoIHBvcHVsYXNpLiB8DQp8IEtvbXBsZWtzaXRhcyB8IE1lbWVybHVrYW4gbWV0b2RlIHlhbmcgbGViaWggdGVyc3RydWt0dXIgZGFuIHNlcmluZ2thbGkgbGViaWgga29tcGxla3MuIHwgTGViaWggbXVkYWggZGl0ZXJhcGthbiBrYXJlbmEgdGlkYWsgbWVtZXJsdWthbiBwcm9zZXMgcGVtaWxpaGFuIHNhbXBlbCB5YW5nIGtldGF0LiB8DQp8IEJpYXlhIGRhbiBTdW1iZXIgRGF5YSB8IEJpYXNhbnlhIGxlYmloIG1haGFsIGthcmVuYSBtZW1lcmx1a2FuIHBlbWlsaWhhbiBzYW1wZWwgeWFuZyBzaXN0ZW1hdGlzIGRhbiBhY2FrLiB8IExlYmloIG11cmFoIGRhbiBjZXBhdCBrYXJlbmEgcGVtaWxpaGFuIHNhbXBlbCBiaXNhIGRpbGFrdWthbiB0YW5wYSBwcm9zZWR1ciB5YW5nIHJ1bWl0LiB8DQp8IEFwbGlrYXNpIHwgRGlndW5ha2FuIGRhbGFtIHBlbmVsaXRpYW4geWFuZyBtZW1idXR1aGthbiBha3VyYXNpIHRpbmdnaSBkYW4gZ2VuZXJhbGlzYXNpLCBzZXBlcnRpIHN1cnZlaSBuYXNpb25hbCBhdGF1IGVrc3BlcmltZW4gaWxtaWFoLiB8IERpZ3VuYWthbiBkYWxhbSBwZW5lbGl0aWFuIGVrc3Bsb3JhdGlmIGF0YXUga2V0aWthIHBvcHVsYXNpIHN1bGl0IGRpYWtzZXMsIHNlcGVydGkgc3R1ZGkga29tdW5pdGFzIHRlcnRlbnR1LiB8DQoNCiMjIyA1LjIgVGFiZWwgUGVyYmFuZGluZ2FuIE1ldG9kZSBQcm9iYWJpbGl0eSBkYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nDQoNCnwgQXNwZWsgUGVtYmVkYSAgICAgICAgfCBTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIHwgU3lzdGVtYXRpYyBTYW1wbGluZyB8IFN0cmF0aWZpZWQgU2FtcGxpbmcgfCBDbHVzdGVyIFNhbXBsaW5nIHwgQ29udmVuaWVuY2UgU2FtcGxpbmcgfCBQdXJwb3NpdmUgU2FtcGxpbmcgfCBRdW90YSBTYW1wbGluZyB8IFNub3diYWxsIFNhbXBsaW5nIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwNCnwgS2VhY2FrYW4gICAgICAgICAgICB8IEFjYWsgcGVudWggICAgICAgICAgIHwgQWNhayBiZXJkYXNhcmthbiBwb2xhIHNpc3RlbWF0aXMgfCBBY2FrIGRhbGFtIHNldGlhcCBzdHJhdGEgfCBBY2FrIGRhbGFtIGtsYXN0ZXIgfCBUaWRhayBhY2FrICAgICAgfCBUaWRhayBhY2FrICAgfCBUaWRhayBhY2FrICAgIHwgVGlkYWsgYWNhayAgICAgfA0KfCBSZXByZXNlbnRhdGl2aXRhcyAgIHwgU2FuZ2F0IHRpbmdnaSAgICAgICAgfCBUaW5nZ2kgICAgICAgICAgICB8IFNhbmdhdCB0aW5nZ2kgICAgICB8IFNlZGFuZyAgICAgICAgICB8IFJlbmRhaCAgICAgICAgICAgfCBUZXJnYW50dW5nIHBhZGEga2VhaGxpYW4gcGVuZWxpdGkgfCBTZWRhbmcgfCBSZW5kYWggICAgICAgICB8DQp8IEJpYXMgICAgICAgICAgICAgICB8IFNhbmdhdCByZW5kYWggICAgICAgIHwgUmVuZGFoICAgICAgICAgICAgfCBTYW5nYXQgcmVuZGFoICAgICAgfCBTZWRhbmcgICAgICAgICAgfCBUaW5nZ2kgICAgICAgICAgIHwgVGVyZ2FudHVuZyBwYWRhIHN1Ympla3Rpdml0YXMgcGVuZWxpdGkgfCBTZWRhbmcgfCBUaW5nZ2kgICAgICAgICB8DQp8IEtlbXVkYWhhbiBQZW5nZ3VuYWFuIHwgU3VsaXQga2FyZW5hIG1lbWVybHVrYW4gZGFmdGFyIHBvcHVsYXNpIGxlbmdrYXAgfCBMZWJpaCBtdWRhaCBkYXJpIFNSUyB8IEtvbXBsZWtzIGthcmVuYSBwZXJsdSBpZGVudGlmaWthc2kgc3RyYXRhIHwgTGViaWggbXVkYWggdW50dWsgcG9wdWxhc2kgYmVzYXIgfCBTYW5nYXQgbXVkYWggfCBNdWRhaCB8IFNlZGFuZyB8IEJlcmdhbnR1bmcgcGFkYSBqYXJpbmdhbiBzb3NpYWwgfA0KfCBCaWF5YSAgICAgICAgICAgICAgfCBUaW5nZ2kgICAgICAgICAgICAgICB8IFNlZGFuZyAgICAgICAgICAgIHwgVGluZ2dpICAgICAgICAgICAgIHwgTGViaWggcmVuZGFoIGRhcmkgU1JTIHwgU2FuZ2F0IHJlbmRhaCAgIHwgUmVuZGFoIHwgU2VkYW5nIHwgUmVuZGFoICAgICAgICAgfA0KfCBDb250b2ggUGVuZ2d1bmFhbiAgfCBTdXJ2ZWkgYWthZGVtaWsgICAgICB8IFN1cnZlaSBwZWxhbmdnYW4gcGVydXNhaGFhbiB8IFN0dWRpIHBlbmRpZGlrYW4gYmVyZGFzYXJrYW4gdGluZ2thdCBwZW5kaWRpa2FuIHwgU3VydmVpIHdpbGF5YWggZ2VvZ3JhZmlzIHwgU3R1ZGkgYXdhbCBkZW5nYW4gcmVzcG9uZGVuIHlhbmcgdGVyc2VkaWEgfCBTdHVkaSB0ZW50YW5nIHBha2FyIHRlcnRlbnR1IHwgU3VydmVpIG9waW5pIHB1YmxpayB8IFN0dWRpIGtlbG9tcG9rIHRlcnR1dHVwIHwNCg0KLS0tDQoNCiMjIDYuIFVrdXJhbiBTYW1wZWwgeWFuZyBEaXBlcmx1a2FuIHVudHVrIE1vRSA9IDUNCg0KVWt1cmFuIHNhbXBlbCBkaWhpdHVuZyBkZW5nYW4gcnVtdXM6DQoNCiQkIG4gPSBcbGVmdCggXGZyYWN7WiBcdGltZXMgXHNpZ21hfXtNb0V9IFxyaWdodCleMiAkJA0KDQpgYGB7cn0NCiMgTmlsYWkgcGFyYW1ldGVyDQpaIDwtIDEuOTYgICMgWi1zY29yZSB1bnR1ayB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JQ0KTW9FIDwtIDUgICAjIE1hcmdpbiBvZiBFcnJvcg0KDQojIEZ1bmdzaSB1bnR1ayBtZW5naGl0dW5nIE1vRQ0KaGl0dW5nX21vZSA8LSBmdW5jdGlvbihzYW1wbGVfZGF0YSkgew0KICBzaWdtYSA8LSBzZChzYW1wbGVfZGF0YSRwZW5nZWx1YXJhbikNCiAgbiA8LSBucm93KHNhbXBsZV9kYXRhKQ0KICBaICogKHNpZ21hIC8gc3FydChuKSkNCn0NCg0KIyBQZXJoaXR1bmdhbiBTaW1wYW5nYW4gYmFrdSB1bnR1ayBzZXRpYXAgbWV0b2RlDQpzZF9zcnMgPC0gc2Qoc2FtcGVsX3NycyRwZW5nZWx1YXJhbikNCnNkX3N0cmF0aWZpZWQgPC0gc2Qoc3RyYXRpZmllZF9zYW1wbGUkcGVuZ2VsdWFyYW4pDQpzZF9zeXN0ZW1hdGljIDwtIHNkKHNhbXBlbF9zeXN0ZW1hdGljJHBlbmdlbHVhcmFuKQ0Kc2RfY2x1c3RlciA8LSBzZChzYW1wZWxfY2x1c3RlciRwZW5nZWx1YXJhbikNCnNkX211bHRpc3RhZ2UgPC0gc2Qoc2FtcGVsX211bHRpc3RhZ2UkcGVuZ2VsdWFyYW4pDQoNCiMgSGl0dW5nIHVrdXJhbiBzYW1wZWwgbWluaW11bSB1bnR1ayBtYXNpbmctbWFzaW5nIG1ldG9kZQ0Kbl9zaW1wbGVfcmFuZG9tIDwtIGNlaWxpbmcoKFogKiBzZF9zcnMgLyBNb0UpIF4gMikNCm5fc3RyYXRpZmllZCA8LSBjZWlsaW5nKChaICogc2Rfc3RyYXRpZmllZCAvIE1vRSkgXiAyKQ0Kbl9zeXN0ZW1hdGljIDwtIGNlaWxpbmcoKFogKiBzZF9zeXN0ZW1hdGljIC8gTW9FKSBeIDIpDQpuX2NsdXN0ZXIgPC0gY2VpbGluZygoWiAqIHNkX2NsdXN0ZXIgLyBNb0UpIF4gMikNCm5fbXVsdGlzdGFnZSA8LSBjZWlsaW5nKChaICogc2RfbXVsdGlzdGFnZSAvIE1vRSkgXiAyKQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KY2F0KCJVa3VyYW4gc2FtcGVsIG1pbmltdW0geWFuZyBkaXBlcmx1a2FuOlxuIikNCmNhdCgiMS4gU2ltcGxlIFJhbmRvbSBTYW1wbGluZzoiLCBuX3NpbXBsZV9yYW5kb20sICJcbiIpDQpjYXQoIjIuIFN0cmF0aWZpZWQgU2FtcGxpbmc6Iiwgbl9zdHJhdGlmaWVkLCAiXG4iKQ0KY2F0KCIzLiBTeXN0ZW1hdGljIFNhbXBsaW5nOiIsIG5fc3lzdGVtYXRpYywgIlxuIikNCmNhdCgiNC4gQ2x1c3RlciBTYW1wbGluZzoiLCBuX2NsdXN0ZXIsICJcbiIpDQpjYXQoIjQuIE11bHRpLVN0YWdlIFNhbXBsaW5nOiIsIG5fbXVsdGlzdGFnZSwgIlxuIikNCmBgYA0KDQotLS0NCg0KIyMgNy4gS2VzaW1wdWxhbiBkYW4gUmVrb21lbmRhc2kNCg0KQmVyZGFzYXJrYW4gYW5hbGlzaXMgdWt1cmFuIHNhbXBlbCB5YW5nIGRpcGVybHVrYW4gdW50dWsgTWFyZ2luIG9mIEVycm9yIChNb0UpIHNlYmVzYXIgNSwgZGl0ZW11a2FuIGJhaHdhIGp1bWxhaCBtaW5pbXVtIHNhbXBlbCB5YW5nIGRpYnV0dWhrYW4gYmVydmFyaWFzaSB0ZXJnYW50dW5nIHBhZGEgbWV0b2RlIHBlbmdhbWJpbGFuIHNhbXBlbCB5YW5nIGRpZ3VuYWthbi4gTWV0b2RlIGRlbmdhbiBzaW1wYW5nYW4gYmFrdSB5YW5nIGxlYmloIGJlc2FyIG1lbWVybHVrYW4gdWt1cmFuIHNhbXBlbCB5YW5nIGxlYmloIGJlc2FyIHVudHVrIG1lbmNhcGFpIHRpbmdrYXQgcHJlc2lzaSB5YW5nIHNhbWEuDQoNCiMjIyA3LjEgS2VzaW1wdWxhbjoNCg0KMS4gVWt1cmFuIHNhbXBlbCB5YW5nIGRpaGl0dW5nIG1lbnVuanVra2FuIGJhaHdhIHNlbWFraW4gYmVzYXIgdmFyaWFzaSBkYXRhIGRhbGFtIG1ldG9kZSB0ZXJ0ZW50dSwgc2VtYWtpbiBiZXNhciBwdWxhIHNhbXBlbCB5YW5nIGRpcGVybHVrYW4gYWdhciBoYXNpbCBlc3RpbWFzaSBsZWJpaCBha3VyYXQuDQoyLiBKaWthIHN1bWJlciBkYXlhIHRlcmJhdGFzLCBtZXRvZGUgcGVuZ2FtYmlsYW4gc2FtcGVsIGRlbmdhbiBzaW1wYW5nYW4gYmFrdSBsZWJpaCBrZWNpbCBsZWJpaCBkaXNhcmFua2FuIGthcmVuYSBtZW1idXR1aGthbiB1a3VyYW4gc2FtcGVsIGxlYmloIGtlY2lsIHVudHVrIG1lbmNhcGFpIE1vRSB5YW5nIGRpaW5naW5rYW4uDQozLiBNZXRvZGUgc2FtcGxpbmcgeWFuZyBkaXBpbGloIGhhcnVzIG1lbXBlcnRpbWJhbmdrYW4gZWZpc2llbnNpIGRhbGFtIHBlbmd1bXB1bGFuIGRhdGEgc2VydGEgcmVwcmVzZW50YXRpdml0YXMgc2FtcGVsIHRlcmhhZGFwIHBvcHVsYXNpIHlhbmcgZGl0ZWxpdGkuDQoNCiMjIyA3LjIgUmVrb21lbmRhc2k6DQoNCjEuIE1lbWlsaWggbWV0b2RlIGRlbmdhbiBzaW1wYW5nYW4gYmFrdSBsZWJpaCBrZWNpbCBhcGFiaWxhIGtldGVyYmF0YXNhbiB3YWt0dSBkYW4gc3VtYmVyIGRheWEgbWVuamFkaSBmYWt0b3IgdXRhbWEgZGFsYW0gcGVuZWxpdGlhbi4NCjIuIE1lbnllc3VhaWthbiBqdW1sYWggc2FtcGVsIGJlcmRhc2Fya2FuIGtlYnV0dWhhbiBha3VyYXNpLCB0ZXJ1dGFtYSBqaWthIHBlbmVsaXRpYW4gbWVudW50dXQgTWFyZ2luIG9mIEVycm9yIHlhbmcgbGViaWgga2VjaWwgZGFyaSA1Lg0KMy4gTWVuZ2d1bmFrYW4gdGVrbmlrIHBlbmdhbWJpbGFuIHNhbXBlbCB5YW5nIGxlYmloIHNpc3RlbWF0aXMsIHNlcGVydGkgc3RyYXRpZmllZCBzYW1wbGluZyBhdGF1IHN5c3RlbWF0aWMgc2FtcGxpbmcsIHVudHVrIG1lbmluZ2thdGthbiBlZmlzaWVuc2kgdGFucGEgaGFydXMgbWVuaW5na2F0a2FuIGp1bWxhaCBzYW1wZWwgc2VjYXJhIHNpZ25pZmlrYW4uDQo0LiBNZW1hc3Rpa2FuIHJlcHJlc2VudGFzaSBzYW1wZWwgeWFuZyBiYWlrIGRlbmdhbiBtZW1wZXJoaXR1bmdrYW4ga2FyYWt0ZXJpc3RpayBwb3B1bGFzaSwgc2VoaW5nZ2EgaGFzaWwgcGVuZWxpdGlhbiBkYXBhdCBkaWdlbmVyYWxpc2FzaSBkZW5nYW4gbGViaWggYmFpay4NCg0KRGVuZ2FuIG1lbmVyYXBrYW4gcmVrb21lbmRhc2kgaW5pLCBkaWhhcmFwa2FuIHBlbmVsaXRpYW4gZGFwYXQgbWVtcGVyb2xlaCBoYXNpbCB5YW5nIGxlYmloIHZhbGlkIGRhbiBkYXBhdCBkaWd1bmFrYW4gdW50dWsgcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHlhbmcgbGViaWggdGVwYXQuDQoNCiMjIFJlZmVyZW5zaQ0KaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL3NhbXBsaW5nX2FuZF9zdXJ2ZXlfdGVjaG5pcXVlcy9kb2NzLzA0LU1hcmdpbi1vZi1FcnJvci5odG1sI3JlYWwtd29ybGQtZXhhbXBsZXMNCg0KLS0t