Tugas Individu

LAPORAN PRAKTIKUM: ANALISIS SAMPLING DAN MARGIN OF ERROR - Teknik Sampling and Survey

Foto Diri

1. Pendahuluan

1.1 Latar Belakang

Dalam penelitian statistik, pengambilan sampel menjadi teknik yang penting karena sering kali tidak memungkinkan untuk mengumpulkan data dari seluruh populasi akibat keterbatasan waktu, biaya, dan sumber daya. Oleh karena itu, metode Probability Sampling dan Non-Probability Sampling digunakan untuk memperoleh sampel yang dapat mewakili populasi secara keseluruhan.

Dalam studi ini, fokus penelitian adalah mengestimasi rata-rata pengeluaran makan mahasiswa setiap bulan. Setiap mahasiswa memiliki pola pengeluaran yang berbeda, tergantung pada faktor seperti lokasi tempat tinggal, kebiasaan makan, serta latar belakang ekonomi. Dengan memahami pola ini, hasil penelitian dapat digunakan untuk berbagai tujuan, seperti membantu mahasiswa mengelola keuangan pribadi, memberikan gambaran tentang biaya hidup mahasiswa, serta menjadi referensi bagi institusi pendidikan dalam merancang kebijakan terkait kesejahteraan mahasiswa.

Selain itu, penelitian ini akan mengevaluasi bagaimana Margin of Error (MoE)—sebagai ukuran keakuratan estimasi dari sampel terhadap populasi—dipengaruhi oleh metode sampling yang digunakan. Dengan membandingkan berbagai metode Probability Sampling dan Non-Probability Sampling, penelitian ini bertujuan untuk menentukan metode yang paling efektif dalam memperoleh estimasi pengeluaran makan mahasiswa yang akurat dan representatif.

1.2 Tujuan Praktikum

1.2.1 Mempelajari berbagai metode pengambilan sampel

Menjelajahi Probability Sampling (Simple Random, Stratified, Systematic, Cluster dan Multi-Stage Sampling) dan Non-Probability Sampling (Convenience, Purposive, Snowball, Quota) untuk memahami karakteristik, kelebihan, dan kekurangan masing-masing metode.

1.2.2 Menghitung Margin of Error (MoE) pada Probability Sampling

Menghitung MoE untuk menilai seberapa akurat hasil sampel dalam merepresentasikan pengeluaran makan mahasiswa.

1.2.3 Menganalisis bias pada Non-Probability Sampling

Meneliti potensi bias dalam metode Non-Probability Sampling, di mana tidak semua individu memiliki peluang yang sama untuk terpilih, sehingga dapat menyebabkan hasil kurang representatif.

1.2.4 Membandingkan hasil dari berbagai metode sampling

Menganalisis perbedaan hasil rata-rata pengeluaran makan mahasiswa, MoE, dan bias antara Probability Sampling dan Non-Probability Sampling untuk menentukan metode yang paling akurat dan representatif.

1.2.5 Menentukan ukuran sampel untuk MoE ≤ 5%

Menganalisis seberapa besar pengaruh ukuran sampel terhadap keakuratan hasil penelitian dan menentukan ukuran sampel optimal agar MoE tetap di bawah 5%.

Secara keseluruhan, praktikum ini bertujuan untuk memahami metode sampling, menghitung MoE, dan mengevaluasi metode terbaik dalam memperoleh estimasi pengeluaran makan mahasiswa yang paling akurat dan representatif.


2. Metode Sampling yang Digunakan

Data-set yang disajikan:

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS001 Laki-laki Teknik 8 914639
MHS002 Perempuan Teknik 8 1100644
MHS003 Laki-laki Ekonomi 3 691923
MHS004 Laki-laki Ilmu Komputer 4 1654622
MHS005 Laki-laki Kedokteran 8 816439
MHS006 Perempuan Psikologi 4 1342778

Dalam penelitian ini, pengambilan sampel dilakukan untuk memahami pola pengeluaran mahasiswa. Dengan populasi sebanyak 300 mahasiswa, metode sampling yang diterapkan mencakup teknik probability sampling dan non-probability sampling. Penggunaan metode ini bertujuan agar data yang diperoleh dapat merepresentasikan pola pengeluaran mahasiswa secara lebih akurat.

Pengambilan sampel dilakukan(dibantu) dengan menggunakan bahasa pemrograman R, yang memungkinkan kita untuk melakukan seleksi data secara sistematis dan acak.

2.1 Probability Sampling (Sampling Acak)

Pada metode probability sampling, setiap mahasiswa dalam populasi memiliki peluang yang sama untuk dipilih. Salah satu teknik yang digunakan adalah Simple Random Sampling (SRS), di mana pemilihan sampel dilakukan secara acak tanpa memperhatikan faktor lain. Dalam penelitian ini, sebanyak 100 mahasiswa dipilih secara acak dari total 300 mahasiswa menggunakan fungsi acak dalam R. Dengan cara ini, sampel yang terpilih diharapkan bisa mencerminkan pengeluaran mahasiswa secara umum.

2.1.1. Simple Random Sampling (SRS)

Simple Random Sampling (SRS) adalah metode di mana setiap individu dalam populasi memiliki peluang yang sama untuk dipilih tanpa memperhatikan karakteristik tertentu.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Waktu.Tidur..Jam.
MHS179 Laki-laki Hukum 1 4
MHS014 Laki-laki Ilmu Komputer 3 6
MHS195 Laki-laki Teknik 7 1
MHS118 Perempuan Ilmu Komputer 5 7
MHS229 Laki-laki Ekonomi 8 6
MHS244 Laki-laki Kedokteran 1 7

Metode:

  • Mengumpulkan daftar seluruh 300 mahasiswa dalam dataset.

  • Dari daftar tersebut, menggunakan fungsi sample_n() dalam R, kami secara acak memilih 100 mahasiswa tanpa mempertimbangkan fakultas atau karakteristik lainnya.

  • Nama-nama mahasiswa yang terpilih dicatat sebagai sampel penelitian.

2.1.2. Stratified Random Sampling

Stratified Sampling membagi populasi menjadi beberapa kelompok berdasarkan karakteristik tertentu (misalnya fakultas) sebelum pengambilan sampel dilakukan.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS152 Laki-laki Ekonomi 1 1407405
MHS066 Perempuan Ekonomi 3 702328
MHS065 Laki-laki Ekonomi 8 684042
MHS012 Laki-laki Ekonomi 5 1000454
MHS194 Laki-laki Ekonomi 3 1839176
MHS257 Laki-laki Ekonomi 8 1102028

Metode:

  • Seluruh mahasiswa dikelompokkan berdasarkan fakultas mereka (misalnya, Fakultas Teknik, Ekonomi, dan Sains).

  • Jumlah mahasiswa dalam setiap fakultas dihitung, lalu proporsi sampel dari setiap fakultas ditentukan agar perwakilannya seimbang.

  • Dengan menggunakan fungsi group_by() dalam R, kami mengambil sampel secara acak dari setiap fakultas sesuai dengan proporsi yang telah ditentukan.

  • Mahasiswa yang terpilih dalam setiap fakultas dicatat sebagai sampel akhir.

2.1.3. Systematic Sampling

Systematic Sampling memilih sampel dengan pola sistematis, misalnya setiap mahasiswa ke-3 dalam daftar.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
1 MHS001 Laki-laki Teknik 8 914639
4 MHS004 Laki-laki Ilmu Komputer 4 1654622
7 MHS007 Laki-laki Hukum 2 1822539
10 MHS010 Perempuan Hukum 1 945060
13 MHS013 Laki-laki Teknik 3 1594169
16 MHS016 Laki-laki Hukum 4 731484

Metode:

  • Seluruh mahasiswa dalam dataset diurutkan berdasarkan nomor ID atau alfabet nama mereka.

  • Dengan total populasi 300 mahasiswa dan jumlah sampel yang dibutuhkan 100, interval sistematis ditentukan dengan rumus k = 300/100 = 3, artinya setiap mahasiswa ke-3 akan dipilih.

  • Mahasiswa pertama dalam daftar dipilih secara acak sebagai titik awal, lalu mahasiswa ke-3 berikutnya terus dipilih hingga mencapai 100 sampel.

  • Daftar mahasiswa yang terpilih dicatat sebagai sampel penelitian.

2.1.4. Cluster Sampling

Cluster Sampling membagi populasi menjadi kelompok-kelompok kecil (cluster), lalu beberapa cluster dipilih untuk dijadikan sampel.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS152 Laki-laki Ekonomi 1 1407405
MHS066 Perempuan Ekonomi 3 702328
MHS065 Laki-laki Ekonomi 8 684042
MHS012 Laki-laki Ekonomi 5 1000454
MHS194 Laki-laki Ekonomi 3 1839176
MHS257 Laki-laki Ekonomi 8 1102028

Metode:

  • Populasi mahasiswa dibagi menjadi beberapa cluster berdasarkan fakultas.

  • Dari daftar fakultas, dua atau tiga fakultas dipilih secara acak menggunakan fungsi sample_n().

  • Semua mahasiswa dalam fakultas yang terpilih secara otomatis dimasukkan ke dalam sampel.

  • Nama-nama mahasiswa dari fakultas yang terpilih dicatat sebagai sampel akhir.

2.1.5. Multi-Stage Sampling

Multi-stage sampling adalah metode pengambilan sampel bertahap dengan membagi populasi ke dalam kelompok, memilih sub-kelompok secara acak, lalu mengambil sampel akhir. Teknik ini efisien untuk populasi besar tetapi lebih kompleks dan berisiko bias.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS260 Laki-laki Ekonomi 3 1702411
MHS194 Laki-laki Ekonomi 3 1839176
MHS065 Laki-laki Ekonomi 8 684042
MHS114 Perempuan Ekonomi 2 632537
MHS115 Laki-laki Ekonomi 7 1019669
MHS125 Laki-laki Ekonomi 4 1391557

Metode:

  • Pada tahap pertama, tiga fakultas dipilih secara acak dari total fakultas yang ada dalam dataset.

  • Setelah itu, dalam setiap fakultas yang terpilih, kami memilih sejumlah mahasiswa secara acak menggunakan fungsi sample_n().

  • Sampel akhir terdiri dari mahasiswa yang terpilih dari fakultas-fakultas yang sudah diseleksi sebelumnya.

  • Data mahasiswa yang masuk dalam sampel dicatat dan digunakan untuk analisis lebih lanjut.

2.2 Non-Probability Sampling (Sampling Tidak Acak)

Di sisi lain, metode non-probability sampling diterapkan untuk melihat bagaimana pola pengeluaran mahasiswa dengan cara yang lebih praktis, meskipun tidak semua mahasiswa memiliki peluang yang sama untuk terpilih.

2.2.1. Convenience Sampling

Convenience Sampling memilih sampel berdasarkan kemudahan akses, misalnya mahasiswa yang tersedia lebih dulu.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS001 Laki-laki Teknik 8 914639
MHS002 Perempuan Teknik 8 1100644
MHS003 Laki-laki Ekonomi 3 691923
MHS004 Laki-laki Ilmu Komputer 4 1654622
MHS005 Laki-laki Kedokteran 8 816439
MHS006 Perempuan Psikologi 4 1342778

Metode:

  • Dataset mahasiswa diurutkan berdasarkan urutan entri data.

  • Lalu, langsung mengambil 100 mahasiswa pertama yang paling gampang di akses dalam daftar tanpa mempertimbangkan fakultas atau karakteristik lainnya.

  • Daftar mahasiswa yang diambil dicatat sebagai sampel penelitian.

2.2.2. Purposive Sampling

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS001 Laki-laki Teknik 8 914639
MHS003 Laki-laki Ekonomi 3 691923
MHS005 Laki-laki Kedokteran 8 816439
MHS010 Perempuan Hukum 1 945060
MHS015 Perempuan Psikologi 5 534234
MHS016 Laki-laki Hukum 4 731484

Metode:

  • Kami menetapkan kriteria khusus, yaitu mahasiswa dengan pengeluaran kurang dari Rp1.000.000 per bulan.

  • Dataset mahasiswa difilter berdasarkan pengeluaran mereka menggunakan fungsi filter() dalam R.

  • Dari hasil penyaringan tersebut, sebanyak 100 mahasiswa yang memenuhi kriteria dipilih sebagai sampel.

2.2.3. Snowball Sampling

Snowball Sampling digunakan ketika populasi sulit dijangkau. Sampel pertama dipilih, lalu mereka membantu merekrut sampel berikutnya.

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS001 Laki-laki Teknik 8 914639
MHS002 Perempuan Teknik 8 1100644
MHS003 Laki-laki Ekonomi 3 691923
MHS004 Laki-laki Ilmu Komputer 4 1654622
MHS005 Laki-laki Kedokteran 8 816439
MHS006 Perempuan Psikologi 4 1342778

Metode:

  • Seorang mahasiswa dipilih secara acak sebagai responden awal.

  • Mahasiswa tersebut diminta merekomendasikan teman-temannya yang memiliki pola pengeluaran serupa.

  • Setiap mahasiswa yang direkomendasikan kemudian diminta merekomendasikan mahasiswa lain hingga jumlah sampel mencapai 100 orang.

  • Data mahasiswa yang didapatkan dicatat sebagai sampel penelitian.

2.2.4. Quota Sampling

Sampel dipilih hingga kuota tertentu terpenuhi berdasarkan kategori tertentu (misalnya jumlah mahasiswa per fakultas).

ID.Mahasiswa Jenis.Kelamin Fakultas Semester Pengeluaran..Rupiah.
MHS152 Laki-laki Ekonomi 1 1407405
MHS066 Perempuan Ekonomi 3 702328
MHS065 Laki-laki Ekonomi 8 684042
MHS012 Laki-laki Ekonomi 5 1000454
MHS194 Laki-laki Ekonomi 3 1839176
MHS257 Laki-laki Ekonomi 8 1102028

Metode:

  • Langkah awalnya menetapkan kuota, misalnya setiap fakultas harus menyumbang 20 mahasiswa dalam sampel.

  • Data mahasiswa dikelompokkan berdasarkan fakultas.

  • Dari masing-masing fakultas, mahasiswa dipilih secara berurutan hingga kuota 20 mahasiswa per fakultas terpenuhi.

  • Jika dalam suatu fakultas jumlah mahasiswa yang tersedia tidak mencukupi, maka data yang ada tetap digunakan tanpa tambahan dari fakultas lain.

  • Mahasiswa yang terpilih dalam setiap fakultas dicatat sebagai sampel akhir.


3. Perhitungan Margin of Error (MoE) dalam Probability Sampling

Secara umum, MoE dihitung dengan rumus:

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

Dimana:

  • \(Z = 1.96\) (untuk tingkat kepercayaan 95%)

  • \(n = 100\) (jumlah sampel)

  • \(\sigma\) = Simpangan baku sampel

Simpangan baku (\(\sigma\)) dihitung dengan rumus:

\[ \sigma = \sqrt{\frac{\sum (X_i - \bar{X})^2}{n-1}} \]

Dimana:

  • \(X_i\) = Pengeluaran mahasiswa ke-\(i\) dalam sampel

  • \(\bar{X}\) = Rata-rata waktu tidur mahasiswa

  • \(n\) = Ukuran sampel

3.1 Simple Random Sampling (SRS)

Diketahui:

## [1] "Simpangan Baku (SRS): 357655.35 Rupiah"

Simpangan Baku (SRS): 357655.35 Rupiah

\[ MoE = 1.96 \times \frac{357655.35}{\sqrt{100}} \]

\[ MoE = 1.96 \times \frac{357655.35}{10} \]

\[ MoE = 1.96 \times 35765.54 \]

\[ MoE = 70099.47 \]

Jadi, MoE = 70,099.47 Rupiah.

Pada metode Simple Random Sampling (SRS), setiap mahasiswa memiliki peluang yang sama untuk terpilih dalam sampel. Dengan MoE sebesar 70,099.47 Rupiah, metode ini cukup akurat dalam menggambarkan populasi, tetapi tidak mempertimbangkan variasi yang mungkin ada di antara kelompok mahasiswa, seperti perbedaan pola pengeluaran antar fakultas.

3.2 Stratified Random Sampling

Diketahui:

## [1] "Simpangan Baku (Stratified): 395300.87 Rupiah"

Simpangan Baku (Stratified): 395300.87 Rupiah

\[ MoE = 1.96 \times \frac{395300.87}{\sqrt{100}} \]

\[ MoE = 1.96 \times \frac{395300.87}{10} \]

\[ MoE = 1.96 \times 39530.09 \]

\[ MoE = 77478.98 \]

Jadi, MoE = 77,478.98 Rupiah.

Pada metode Stratified Random Sampling, mahasiswa dibagi ke dalam kelompok berdasarkan fakultas sebelum sampel diambil. Dengan cara ini, setiap fakultas mendapatkan representasi yang proporsional dalam sampel. MoE yang dihasilkan adalah 77,478.98 Rupiah, yang merupakan nilai yang relatif kecil dibandingkan metode lainnya. Ini menunjukkan bahwa metode ini mampu memberikan estimasi yang lebih akurat karena mempertimbangkan variasi dalam populasi.

3.3 Systematic Sampling

Diketahui:

## [1] "Simpangan Baku (Systematic): 372320.23 Rupiah"

Simpangan Baku (Systematic): 372320.23 Rupiah

\[ MoE = 1.96 \times \frac{372320.23}{\sqrt{100}} \]

\[ MoE = 1.96 \times \frac{372320.23}{10} \]

\[ MoE = 1.96 \times 37232.02 \]

\[ MoE = 72974.75 \]

Jadi, MoE = 72,974.75 Rupiah.

Pada metode Systematic Sampling, mahasiswa dipilih dengan interval tertentu dari daftar populasi. MoE yang dihasilkan adalah 72,974.75 Rupiah, yang hampir setara dengan metode stratifikasi. Namun, metode ini memiliki potensi bias jika terdapat pola berulang dalam daftar mahasiswa yang digunakan untuk pemilihan sampel.

3.4 Cluster Sampling

Diketahui:

## [1] "Simpangan Baku (Cluster): 419055.4 Rupiah"

Simpangan Baku (Cluster): 419055.4 Rupiah

\[ MoE = 1.96 \times \frac{419055.4}{\sqrt{100}} \]

\[ MoE = 1.96 \times \frac{419055.4}{10} \]

\[ MoE = 1.96 \times 41905.54 \]

\[ MoE = 82131.86 \]

Jadi, MoE = 82,131.86 Rupiah.

Pada metode Cluster Sampling, sampel dipilih berdasarkan fakultas yang dipilih secara acak, lalu seluruh mahasiswa dalam fakultas tersebut dijadikan sampel. MoE untuk metode ini adalah 82,131.86 Rupiah, yang merupakan nilai tertinggi dibandingkan metode lainnya. Hal ini menunjukkan bahwa Cluster Sampling cenderung menghasilkan estimasi yang kurang akurat dibandingkan metode lain, terutama jika fakultas yang terpilih memiliki pola pengeluaran yang berbeda dari fakultas lainnya.

3.5 Multi-Stage Sampling

Diketahui:

## [1] "Simpangan Baku (Multistage Sampling): 425902.4 Rupiah"

Simpangan Baku (Multistage Sampling): 425902.4 Rupiah

\[ MoE = 1.96 \times \frac{425902.4}{\sqrt{100}} \]

\[ MoE = 1.96 \times \frac{425902.4}{10} \]

\[ MoE = 1.96 \times 42590.24 \]

\[ MoE = 83476.87 \]

Jadi, MoE = 83,476.87 Rupiah.

Pada metode Multi-Stage Sampling, sampel dipilih dalam beberapa tahap, misalnya:
1. Memilih fakultas secara acak.
2. Memilih mahasiswa dari fakultas yang terpilih.

Metode ini lebih efisien dibandingkan Cluster Sampling, karena memungkinkan representasi yang lebih baik dengan membagi proses pemilihan menjadi beberapa tahap.

Dengan MoE sebesar 83,476.87 Rupiah, metode ini memiliki tingkat ketepatan yang lebih tinggi dibandingkan Cluster Sampling tetapi masih lebih besar dibandingkan Stratified Sampling. Artinya, hasil estimasi menggunakan metode ini cukup baik, tetapi masih memiliki tingkat kesalahan yang lebih tinggi dibandingkan metode stratifikasi.


4. Analisis Bias dalam Non-Probability Sampling

Non-Probability Sampling adalah metode pemilihan sampel yang tidak memberikan peluang yang sama bagi setiap individu dalam populasi untuk terpilih. Hal ini menyebabkan bias, yaitu perbedaan antara hasil sampel dan keadaan sebenarnya dalam populasi. Dalam studi ini, kami menggunakan berbagai metode Non-Probability Sampling untuk mengestimasi pengeluaran makan mahasiswa. Berikut adalah analisis bias dalam setiap metode:

4.1 Convenience Sampling

Metode:

Convenience Sampling dilakukan dengan mengambil sampel berdasarkan kemudahan akses. Dalam studi ini, metode ini dilakukan dengan mengambil 100 mahasiswa pertama yang bersedia mengisi survei tanpa mempertimbangkan faktor lain seperti fakultas atau tingkat ekonomi.

Keunggulan:

  • Cepat dan mudah karena tidak memerlukan proses seleksi yang rumit.

  • Biaya rendah karena tidak memerlukan usaha ekstra untuk mencari responden.

  • Berguna untuk eksplorasi awal sebelum penelitian yang lebih mendalam dilakukan.

Kelemahan:

  • Sangat bias, karena hanya mahasiswa yang mudah diakses yang masuk dalam sampel.

  • Tidak representatif, karena bisa jadi hanya mahasiswa dari fakultas tertentu yang lebih banyak terlibat.

  • Tidak cocok untuk analisis statistik, karena hasilnya tidak mencerminkan populasi mahasiswa secara keseluruhan.

Contoh Bias dalam Studi Ini:

Jika kita mengambil 100 mahasiswa pertama yang mengisi survei di kantin kampus, kemungkinan besar mereka adalah mahasiswa yang sering makan di kantin. Mahasiswa yang lebih sering memasak sendiri di kos atau mencari makanan di luar kampus tidak terwakili dalam sampel ini. Akibatnya, rata-rata pengeluaran yang diperoleh dari sampel mungkin lebih tinggi daripada rata-rata sebenarnya di populasi.

4.2 Purposive Sampling

Metode:

Purposive Sampling memilih responden berdasarkan kriteria tertentu yang dianggap relevan dengan penelitian. Dalam studi ini, kita memilih mahasiswa yang menghabiskan lebih dari Rp2.000.000 per bulan untuk makan.

Keunggulan:

  • Fokus pada kelompok tertentu, misalnya mahasiswa yang memiliki kebiasaan makan mahal.

  • Bisa memberikan wawasan lebih dalam, terutama jika penelitian ingin meneliti pola pengeluaran kelompok tertentu.

  • Berguna untuk studi khusus, seperti penelitian tentang mahasiswa yang sering makan di restoran mahal.

Kelemahan:

  • Tidak representatif, karena hanya meneliti kelompok tertentu, bukan seluruh mahasiswa.

  • Rentan bias seleksi, karena peneliti menentukan sampel berdasarkan asumsi tertentu.

  • Tidak bisa digunakan untuk generalisasi, karena hasilnya hanya berlaku untuk kelompok yang dipilih.

Contoh Bias dalam Studi Ini:

Jika kita hanya memilih mahasiswa yang menghabiskan lebih dari Rp2.000.000 per bulan untuk makan, maka rata-rata pengeluaran yang kita dapatkan pasti jauh lebih tinggi daripada rata-rata sebenarnya. Hal ini akan memberikan gambaran yang keliru tentang kebiasaan makan mahasiswa secara umum.

4.3 Snowball Sampling

Metode:

Snowball Sampling dilakukan dengan meminta responden awal merekomendasikan teman mereka yang memiliki karakteristik serupa. Dalam studi ini, kami meminta mahasiswa yang sering makan di restoran mahal untuk merekomendasikan teman-teman mereka yang juga memiliki kebiasaan serupa.

Keunggulan:

  • Bermanfaat untuk menjangkau kelompok tertentu, misalnya mahasiswa dari keluarga kaya.

  • Efektif dalam penelitian kualitatif, karena memberikan wawasan tentang kelompok yang sulit diidentifikasi melalui metode lain.

  • Menghemat waktu dan sumber daya, karena responden membantu merekrut sampel tambahan.

Kelemahan:

  • Bias sosial tinggi, karena sampel cenderung berasal dari kelompok dengan karakteristik serupa.

  • Tidak representatif, karena hanya mencerminkan jaringan sosial tertentu.

  • Sulit dikontrol, karena peneliti tidak memiliki kendali penuh atas siapa yang direkomendasikan.

Contoh Bias dalam Studi Ini:

Jika seorang mahasiswa yang sering makan di restoran mahal merekomendasikan teman-temannya yang juga memiliki kebiasaan makan mahal, maka rata-rata pengeluaran yang diperoleh dalam studi ini akan lebih tinggi dari kenyataan. Hal ini menciptakan ilusi bahwa sebagian besar mahasiswa menghabiskan uang dalam jumlah besar untuk makan, padahal tidak demikian.

4.4 Quota Sampling

Metode:

Quota Sampling dilakukan dengan menetapkan kuota untuk kelompok tertentu, misalnya memilih 50 mahasiswa dari Fakultas Ekonomi dan 50 mahasiswa dari Fakultas Teknik. Namun, dalam pemilihan individu dalam setiap kelompok, tidak ada pemilihan acak.

Keunggulan:

  • Lebih representatif dibandingkan metode Non-Probability lainnya, karena memastikan setiap kelompok mendapatkan perwakilan.

  • Cepat dan efisien, karena tidak memerlukan pemilihan acak dalam setiap kuota.

  • Cocok untuk situasi di mana data populasi terbatas, karena tidak membutuhkan daftar lengkap seluruh mahasiswa.

Kelemahan:

  • Bias seleksi masih bisa terjadi, karena mahasiswa dalam setiap kuota dipilih berdasarkan kemudahan akses.

  • Tidak sepenuhnya acak, sehingga hasil tetap tidak bisa digeneralisasi secara sempurna.

  • Kurang akurat dibandingkan Stratified Sampling, yang menggunakan pemilihan acak dalam setiap kelompok.

Contoh Bias dalam Studi Ini:

Misalnya, kita menetapkan kuota 50 mahasiswa dari Fakultas Ekonomi dan 50 dari Fakultas Teknik, tetapi hanya memilih mahasiswa yang makan di kantin kampus. Hasilnya bisa menunjukkan bahwa rata-rata pengeluaran mahasiswa Teknik dan Ekonomi hampir sama. Padahal, jika kita mempertimbangkan mahasiswa yang makan di luar kampus atau memasak sendiri, bisa jadi ada perbedaan pengeluaran yang signifikan antara kedua fakultas.


5. Perbandingan Hasil dari Berbagai Metode Sampling

Dalam penelitian ini, kami telah menggunakan berbagai metode sampling, baik Probability Sampling maupun Non-Probability Sampling, untuk menganalisis pengeluaran makan mahasiswa. Masing-masing metode memiliki karakteristik, keunggulan, kelemahan, serta tingkat bias dan margin of error yang berbeda. Untuk memahami efektivitas masing-masing metode, dilakukan analisis mendalam berdasarkan margin of error, bias, dan tingkat representativitas terhadap populasi mahasiswa.

5.1 Perbandingan Probability Sampling vs Non-Probability Sampling

Sampel yang diambil menggunakan Probability Sampling memiliki peluang lebih tinggi untuk menghasilkan data yang representatif mengenai pengeluaran makan mahasiswa dibandingkan dengan Non-Probability Sampling. Hal ini karena Probability Sampling memungkinkan setiap mahasiswa dalam populasi memiliki peluang yang sama untuk dipilih, sedangkan Non-Probability Sampling cenderung bergantung pada faktor kemudahan dan subjektivitas dalam pemilihan sampel.

Aspek Probability Sampling Non-Probability Sampling
Definisi Metode sampling yang memastikan setiap elemen dalam populasi memiliki peluang yang sama untuk dipilih. Metode sampling yang tidak memberikan setiap elemen peluang yang sama untuk dipilih.
Contoh Metode Simple Random, Stratified, Systematic, Cluster, Multi-Stage Convenience, Purposive, Snowball, Quota
Keacakan Pemilihan sampel dilakukan secara acak Pemilihan sampel sering berdasarkan aksesibilitas atau karakteristik tertentu
Margin of Error (MoE) Dapat dihitung dengan presisi dan cenderung lebih kecil Sulit dihitung karena tidak ada aturan pengambilan sampel yang sistematis
Bias Relatif rendah Tinggi, karena pemilihan tidak dilakukan secara acak
Kemudahan Pelaksanaan Memerlukan perencanaan lebih matang dan sumber daya lebih besar Lebih mudah, cepat, dan murah dilakukan
Representasi Populasi Hasil lebih representatif dan dapat digeneralisasi Kurang representatif karena tidak semua individu memiliki kesempatan yang sama untuk dipilih

Dari tabel ini, dapat disimpulkan bahwa Probability Sampling lebih unggul dalam hal akurasi dan representativitas dalam konteks pengeluaran makan mahasiswa. Namun, Non-Probability Sampling lebih mudah dan cepat digunakan, terutama dalam kondisi di mana sumber daya terbatas.

5.2 Perbandingan Hasil dari Berbagai Metode Probability Sampling

Untuk mengetahui metode Probability Sampling mana yang paling akurat dalam mengestimasi pengeluaran makan mahasiswa, dilakukan perhitungan margin of error (MoE) untuk setiap metode. Berikut adalah hasil perbandingan dari masing-masing metode:

Metode Sampling Cara Kerja Margin of Error (MoE) Keunggulan Kelemahan
Simple Random Sampling (SRS) Memilih sampel secara acak dari seluruh populasi mahasiswa 70,099.47 Rupiah Tidak ada bias dalam pemilihan Tidak mempertimbangkan perbedaan pola pengeluaran antar kelompok mahasiswa
Stratified Sampling Populasi mahasiswa dibagi dalam kelompok berdasarkan fakultas, lalu diambil sampel secara proporsional 77,478.98 Rupiah Representasi lebih baik untuk semua fakultas Memerlukan informasi tambahan tentang populasi
Systematic Sampling Memilih sampel berdasarkan pola sistematis (misal setiap mahasiswa ke-3) 72,974.75 Rupiah Distribusi sampel lebih merata Bisa bias jika ada pola dalam data populasi
Cluster Sampling Memilih beberapa fakultas, lalu mengambil semua anggota dalam fakultas tersebut 82,131.86 Rupiah Lebih efisien jika populasi mahasiswa luas dan tersebar Bisa menyebabkan bias jika fakultas yang dipilih tidak mewakili populasi secara keseluruhan
Multi-Stage Sampling Memilih beberapa fakultas secara acak, lalu mengambil sampel dari mahasiswa dalam fakultas yang terpilih 83,476.87 Rup iah Efisien untuk populasi besar dan tersebar Memerlukan beberapa tahap pemilihan, bisa menambah kompleksitas

Analisis

  1. Simple Random Sampling (SRS) memiliki margin of error terkecil (70,099.47 Rupiah), menjadikannya metode yang paling akurat dalam menggambarkan pengeluaran makan mahasiswa. Dengan pemilihan acak, metode ini mampu memberikan estimasi yang representatif tanpa bias yang signifikan.
  2. Systematic Sampling menunjukkan margin of error yang sedikit lebih besar (72,974.75 Rupiah), tetapi tetap memberikan hasil yang baik jika populasi diurutkan dengan cara yang tidak bias.
  3. Stratified Sampling memiliki margin of error (77,478.98 Rupiah) yang lebih besar dibandingkan SRS, meskipun metode ini efektif dalam menangkap variasi antar kelompok.
  4. Cluster Sampling dan Multi-Stage Sampling memiliki margin of error yang lebih tinggi (82,131.86 Rupiah dan 83,476.87 Rupiah), menunjukkan bahwa metode ini lebih rentan terhadap bias jika fakultas yang dipilih tidak representatif.

5.3 Perbandingan Hasil dari Berbagai Metode Non-Probability Sampling

Non-Probability Sampling lebih banyak digunakan dalam penelitian eksploratif atau ketika Probability Sampling tidak dapat diterapkan karena keterbatasan waktu, biaya, atau akses ke populasi mahasiswa. Namun, metode ini cenderung memiliki tingkat bias yang lebih tinggi.

Metode Sampling Cara Kerja Bias Keunggulan Kelemahan
Convenience Sampling Memilih sampel yang paling mudah diakses Tinggi Cepat dan mudah dilakukan Tidak representatif, hanya mewakili kelompok tertentu
Purposive Sampling Memilih sampel berdasarkan karakteristik tertentu Tinggi Bisa fokus pada kelompok spesifik Tidak bisa digeneralisasi ke populasi luas
Snowball Sampling Responden pertama merekrut responden lain Sangat Tinggi Berguna untuk populasi yang sulit ditemukan Bias tinggi karena responden saling merekomendasikan teman dengan karakteristik yang sama
Quota Sampling Memilih sampel hingga kuota tertentu terpenuhi Tinggi Memastikan representasi proporsional Tidak acak, bisa menyebabkan bias dalam seleksi

Analisis

  1. Snowball Sampling memiliki tingkat bias tertinggi karena responden cenderung merekrut individu yang memiliki karakteristik serupa, sehingga tidak mencerminkan variasi pengeluaran makan mahasiswa secara keseluruhan.
  2. Convenience Sampling juga sangat bias karena hanya mengandalkan individu yang mudah diakses, seperti mahasiswa yang sering berada di kantin, sehingga tidak mencerminkan populasi mahasiswa secara keseluruhan.
  3. Quota Sampling memiliki bias yang lebih rendah dibandingkan Convenience dan Snowball Sampling, tetapi tetap tidak seakurat Probability Sampling dalam memberikan gambaran pengeluaran makan mahasiswa.

5.4 Kesimpulan dari Perbandingan Metode Sampling

Berdasarkan hasil perbandingan di atas, dapat disimpulkan bahwa:

  1. Probability Sampling lebih akurat dibandingkan Non-Probability Sampling karena memiliki margin of error yang lebih kecil dan bias yang lebih rendah dalam mengestimasi pengeluaran makan mahasiswa.
  2. Simple Random Sampling (SRS) adalah metode terbaik dalam Probability Sampling, karena memiliki margin of error terkecil (70,099.47 Rupiah). Metode ini sangat efektif dalam memberikan estimasi yang akurat.
  3. Cluster Sampling dan Multi-Stage Sampling memiliki margin of error yang lebih tinggi, menunjukkan bahwa metode ini lebih rentan terhadap bias jika tidak dilakukan dengan hati-hati.
  4. Jika memungkinkan, penelitian sebaiknya menggunakan Probability Sampling agar hasilnya lebih akurat dan dapat digeneralisasi ke populasi yang lebih luas.

Dengan demikian, Simple Random Sampling adalah metode yang paling direkomendasikan untuk penelitian ini karena memberikan keseimbangan terbaik antara akurasi, margin of error yang rendah, dan representativitas populasi mahasiswa. Penggunaan metode ini diharapkan dapat memberikan gambaran yang lebih akurat mengenai pengeluaran makan mahasiswa, yang sangat penting untuk perencanaan dan pengambilan keputusan terkait kesejahteraan mahasiswa.


6. Ukuran Sampel yang Diperlukan untuk MoE = 5%

Dalam penelitian ini, ingin menentukan berapa banyak mahasiswa yang harus disurvei agar estimasi pengeluaran makan mereka tidak meleset lebih dari 5%. Dengan menggunakan data yang telah dikumpulkan, kita akan menghitung ukuran sampel yang diperlukan untuk mencapai Margin of Error (MoE) yang diinginkan.

6.1 Data yang Diketahui

  • Total mahasiswa: 300 orang

  • Rata-rata pengeluaran makan: Misalkan rata-rata pengeluaran makan mahasiswa adalah Rp 1.500.000 per bulan.

  • Simpangan baku (\(\sigma\)): Misalkan simpangan baku pengeluaran makan mahasiswa adalah Rp 500.000.

  • Batas kesalahan maksimal (Margin of Error / MoE): 5% dari rata-rata pengeluaran, yaitu:

    \[ MoE = 0.05 \times 1,500,000 = 75,000 \text{ Rupiah} \]

6.2 Langkah Perhitungan

6.2.1 Rumus untuk Menghitung Ukuran Sampel

Kita akan menggunakan rumus untuk menghitung ukuran sampel yang diperlukan agar MoE tidak lebih dari Rp 75,000:

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

Dimana: - \(Z = 1.96\) (angka standar untuk tingkat kepercayaan 95%) - \(\sigma = 500,000\) (simpangan baku) - \(n\) = ukuran sampel yang dicari

6.2.2 Menghitung Ukuran Sampel

Kita dapat menyusun ulang rumus untuk mencari \(n\):

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

Substitusi nilai yang diketahui:

\[ n = \left( \frac{1.96 \times 500,000}{75,000} \right)^2 \]

6.2.3 Menghitung Nilai

Mari kita hitung nilai \(n\) secara manual:

  1. Hitung \(Z \times \sigma\):

    \[ Z \times \sigma = 1.96 \times 500,000 = 980,000 \]

  2. Hitung \(\frac{Z \times \sigma}{MoE}\):

    \[ \frac{Z \times \sigma}{MoE} = \frac{980,000}{75,000} \approx 13.0667 \]

  3. Hitung \(n\):

    \[ n = (13.0667)^2 \approx 171.75 \]

  4. Membulatkan ke atas untuk mendapatkan ukuran sampel bulat:

    \[ n = \lceil 171.75 \rceil = 172 \]

Jadi, kita memerlukan n = 172 mahasiswa untuk mencapai MoE tidak lebih dari Rp 75,000.

6.2.4 Kode R untuk bantu Menghitung Ukuran Sampel

Berikut adalah kode R untuk menghitung ukuran sampel:

## [1] 171

jawaban dari sistem ini di bulatkan ke bawah

6.3 Kenapa Harus 172?

  • Jika kita mengambil kurang dari 172 orang, hasilnya bisa lebih meleset dan kurang akurat.
  • Jika kita mengambil lebih dari 172 orang, hasilnya akan lebih akurat, tetapi akan memerlukan lebih banyak waktu dan biaya untuk melakukan survei.

Jadi, agar hasil penelitian ini cukup akurat dan tidak meleset lebih dari 5%, kita harus survei minimal 172 mahasiswa. Dengan perhitungan ini, kita dapat memastikan bahwa ukuran sampel yang diambil cukup untuk memberikan estimasi yang akurat mengenai pengeluaran makan mahasiswa, yang sangat penting untuk analisis lebih lanjut dan pengambilan keputusan terkait kebijakan kesejahteraan mahasiswa.

7. Kesimpulan dan Rekomendasi

Dalam laporan praktikum ini, kami telah melakukan analisis mendalam mengenai metode sampling dan margin of error (MoE) dalam penelitian statistik, khususnya dalam konteks pengeluaran makan mahasiswa di sebuah universitas dengan populasi 300 mahasiswa. Berikut adalah kesimpulan dan rekomendasi berdasarkan hasil analisis yang telah dilakukan:

7.1 Kesimpulan

  1. Latar Belakang dan Tujuan: Penelitian ini dilatarbelakangi oleh keterbatasan dalam mengumpulkan data dari seluruh populasi, sehingga metode sampling menjadi penting untuk mendapatkan data yang representatif. Tujuan praktikum ini adalah untuk mempelajari berbagai metode pengambilan sampel, menghitung MoE, menganalisis bias, dan menentukan ukuran sampel yang diperlukan.

  2. Metode Sampling: Kami telah mengeksplorasi dua kategori utama metode sampling:

    • Probability Sampling (Simple Random, Stratified, Systematic, Cluster, Multi-Stage) yang memberikan peluang yang sama bagi setiap individu untuk terpilih, dan
    • Non-Probability Sampling (Convenience, Purposive, Snowball, Quota) yang tidak memberikan peluang yang sama, sehingga berpotensi menghasilkan bias.
  3. Margin of Error (MoE): Perhitungan MoE menunjukkan bahwa metode Simple Random Sampling (SRS) memiliki MoE terkecil (70,099.47 Rupiah), menjadikannya metode yang paling akurat dalam menggambarkan populasi. Sebaliknya, Multi-Stage Sampling memiliki MoE terbesar (83,476.87 Rupiah), menunjukkan potensi bias yang lebih tinggi.

  4. Analisis Bias: Non-Probability Sampling cenderung memiliki bias yang lebih tinggi dibandingkan Probability Sampling. Metode seperti Convenience Sampling dan Snowball Sampling sangat rentan terhadap bias, yang dapat mengakibatkan hasil yang tidak representatif.

  5. Ukuran Sampel untuk MoE ≤ 5%: Untuk mencapai MoE tidak lebih dari 5%, diperlukan minimal 172 mahasiswa dalam survei ini. Ini menunjukkan pentingnya ukuran sampel yang memadai untuk memastikan akurasi hasil penelitian.

7.2 Rekomendasi

  1. Penggunaan Probability Sampling: Disarankan untuk menggunakan metode Probability Sampling, khususnya Simple Random Sampling, dalam penelitian yang memerlukan representativitas tinggi. Metode ini mampu memberikan estimasi yang lebih akurat dengan MoE yang lebih kecil.

  2. Hindari Non-Probability Sampling: Jika memungkinkan, hindari penggunaan Non-Probability Sampling, terutama dalam penelitian yang memerlukan generalisasi hasil. Jika harus digunakan, pilihlah metode seperti Quota Sampling yang lebih baik dalam hal representativitas dibandingkan metode non-acak lainnya.

  3. Perencanaan Ukuran Sampel: Dalam perencanaan penelitian, penting untuk menghitung ukuran sampel yang diperlukan untuk mencapai MoE yang diinginkan. Pastikan untuk mempertimbangkan variabilitas dalam populasi saat menentukan ukuran sampel.

  4. Evaluasi dan Validasi: Lakukan evaluasi dan validasi terhadap hasil penelitian untuk memastikan bahwa data yang diperoleh dapat digeneralisasi ke populasi yang lebih luas. Ini dapat dilakukan dengan membandingkan hasil dari berbagai metode sampling.

  5. Penerapan Hasil Penelitian: Hasil penelitian ini dapat digunakan oleh institusi pendidikan untuk merancang kebijakan terkait kesejahteraan mahasiswa, serta membantu mahasiswa dalam mengelola keuangan pribadi mereka.

Dengan mengikuti rekomendasi ini, diharapkan penelitian di masa mendatang dapat menghasilkan data yang lebih akurat dan representatif, serta memberikan wawasan yang lebih baik mengenai fenomena yang diteliti.

8.Referensi

  1. Siregar, B. (n.d.). Margin of Error. dari https://bookdown.org/dsciencelabs/sampling_and_survey_techniques/docs/04-Margin-of-Error.html#real-world-examples

  2. Accurate.ID. (n.d.). Margin of Error: Pengertian, Fungsi, dan Cara Menghitungnya. dari https://accurate.id/marketing-manajemen/margin-of-error/

  3. SurveyMonkey. (n.d.). Margin of Error Calculator. dari https://www.surveymonkey.com/mp/margin-of-error-calculator/

  4. Lembaga Penelitian dan Pengabdian kepada Masyarakat (LP2M) UMA. (2022, January 27). Apa Itu Margin Error? Pengertian, Perhitungan, dengan Contoh. dari https://lp2m.uma.ac.id/2022/01/27/apa-itu-margin-error-pengertian-perhitungan-dengan-contoh/

LS0tCnRpdGxlOiAiVHVnYXMgSW5kaXZpZHUgIgpzdWJ0aXRsZTogIkxBUE9SQU4gUFJBS1RJS1VNOiBBTkFMSVNJUyBTQU1QTElORyBEQU4gTUFSR0lOIE9GIEVSUk9SCiAtIFRla25payBTYW1wbGluZyBhbmQgU3VydmV5IgphdXRob3I6ICJPbGl2aWEgTWVpbGluZGEgRGF2dGluIFBlc2lyZXJvbiIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6CiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGh1bWJuYWlsczogdHJ1ZQogICAgbGlnaHRib3g6IHRydWUKICAgIGdhbGxlcnk6IHRydWUKICAgIGxpYl9kaXI6IGxpYnMKICAgIGRmX3ByaW50OiAicGFnZWQiCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IgogICAgY29kZV9kb3dubG9hZDogeWVzIAogICAgY3NzOiAic3R5bGUuY3NzIgotLS0KCjxpbWcgc3JjPSJJTUctMjAyNTAyMTItV0EwMDA2LmpwZyIgd2lkdGg9IjMwMCIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87IiBhbHQ9IkZvdG8gRGlyaSI+Ci0tLQoKCiMgMS4gUGVuZGFodWx1YW4KCiMjIDEuMSBMYXRhciBCZWxha2FuZwoKRGFsYW0gcGVuZWxpdGlhbiBzdGF0aXN0aWssIHBlbmdhbWJpbGFuIHNhbXBlbCBtZW5qYWRpIHRla25payB5YW5nIHBlbnRpbmcga2FyZW5hIHNlcmluZyBrYWxpIHRpZGFrIG1lbXVuZ2tpbmthbiB1bnR1ayBtZW5ndW1wdWxrYW4gZGF0YSBkYXJpIHNlbHVydWggcG9wdWxhc2kgYWtpYmF0IGtldGVyYmF0YXNhbiB3YWt0dSwgYmlheWEsIGRhbiBzdW1iZXIgZGF5YS4gT2xlaCBrYXJlbmEgaXR1LCBtZXRvZGUgUHJvYmFiaWxpdHkgU2FtcGxpbmcgZGFuIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyBkaWd1bmFrYW4gdW50dWsgbWVtcGVyb2xlaCBzYW1wZWwgeWFuZyBkYXBhdCBtZXdha2lsaSBwb3B1bGFzaSBzZWNhcmEga2VzZWx1cnVoYW4uCgpEYWxhbSBzdHVkaSBpbmksIGZva3VzIHBlbmVsaXRpYW4gYWRhbGFoIG1lbmdlc3RpbWFzaSByYXRhLXJhdGEgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhIHNldGlhcCBidWxhbi4gU2V0aWFwIG1haGFzaXN3YSBtZW1pbGlraSBwb2xhIHBlbmdlbHVhcmFuIHlhbmcgYmVyYmVkYSwgdGVyZ2FudHVuZyBwYWRhIGZha3RvciBzZXBlcnRpIGxva2FzaSB0ZW1wYXQgdGluZ2dhbCwga2ViaWFzYWFuIG1ha2FuLCBzZXJ0YSBsYXRhciBiZWxha2FuZyBla29ub21pLiBEZW5nYW4gbWVtYWhhbWkgcG9sYSBpbmksIGhhc2lsIHBlbmVsaXRpYW4gZGFwYXQgZGlndW5ha2FuIHVudHVrIGJlcmJhZ2FpIHR1anVhbiwgc2VwZXJ0aSBtZW1iYW50dSBtYWhhc2lzd2EgbWVuZ2Vsb2xhIGtldWFuZ2FuIHByaWJhZGksIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdGVudGFuZyBiaWF5YSBoaWR1cCBtYWhhc2lzd2EsIHNlcnRhIG1lbmphZGkgcmVmZXJlbnNpIGJhZ2kgaW5zdGl0dXNpIHBlbmRpZGlrYW4gZGFsYW0gbWVyYW5jYW5nIGtlYmlqYWthbiB0ZXJrYWl0IGtlc2VqYWh0ZXJhYW4gbWFoYXNpc3dhLgoKU2VsYWluIGl0dSwgcGVuZWxpdGlhbiBpbmkgYWthbiBtZW5nZXZhbHVhc2kgYmFnYWltYW5hIE1hcmdpbiBvZiBFcnJvciAoTW9FKeKAlHNlYmFnYWkgdWt1cmFuIGtlYWt1cmF0YW4gZXN0aW1hc2kgZGFyaSBzYW1wZWwgdGVyaGFkYXAgcG9wdWxhc2nigJRkaXBlbmdhcnVoaSBvbGVoIG1ldG9kZSBzYW1wbGluZyB5YW5nIGRpZ3VuYWthbi4gRGVuZ2FuIG1lbWJhbmRpbmdrYW4gYmVyYmFnYWkgbWV0b2RlIFByb2JhYmlsaXR5IFNhbXBsaW5nIGRhbiBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcsIHBlbmVsaXRpYW4gaW5pIGJlcnR1anVhbiB1bnR1ayBtZW5lbnR1a2FuIG1ldG9kZSB5YW5nIHBhbGluZyBlZmVrdGlmIGRhbGFtIG1lbXBlcm9sZWggZXN0aW1hc2kgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhIHlhbmcgYWt1cmF0IGRhbiByZXByZXNlbnRhdGlmLgoKCgojIyAxLjIgVHVqdWFuIFByYWt0aWt1bQoKIyMjIDEuMi4xIE1lbXBlbGFqYXJpIGJlcmJhZ2FpIG1ldG9kZSBwZW5nYW1iaWxhbiBzYW1wZWwKCk1lbmplbGFqYWhpIFByb2JhYmlsaXR5IFNhbXBsaW5nIChTaW1wbGUgUmFuZG9tLCBTdHJhdGlmaWVkLCBTeXN0ZW1hdGljLCBDbHVzdGVyIGRhbiBNdWx0aS1TdGFnZSBTYW1wbGluZykgZGFuIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyAoQ29udmVuaWVuY2UsIFB1cnBvc2l2ZSwgU25vd2JhbGwsIFF1b3RhKSB1bnR1ayBtZW1haGFtaSBrYXJha3RlcmlzdGlrLCBrZWxlYmloYW4sIGRhbiBrZWt1cmFuZ2FuIG1hc2luZy1tYXNpbmcgbWV0b2RlLgoKIyMjIDEuMi4yIE1lbmdoaXR1bmcgTWFyZ2luIG9mIEVycm9yIChNb0UpIHBhZGEgUHJvYmFiaWxpdHkgU2FtcGxpbmcKCk1lbmdoaXR1bmcgTW9FIHVudHVrIG1lbmlsYWkgc2ViZXJhcGEgYWt1cmF0IGhhc2lsIHNhbXBlbCBkYWxhbSBtZXJlcHJlc2VudGFzaWthbiBwZW5nZWx1YXJhbiBtYWthbiBtYWhhc2lzd2EuCgojIyMgMS4yLjMgTWVuZ2FuYWxpc2lzIGJpYXMgcGFkYSBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcKCk1lbmVsaXRpIHBvdGVuc2kgYmlhcyBkYWxhbSBtZXRvZGUgTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nLCBkaSBtYW5hIHRpZGFrIHNlbXVhIGluZGl2aWR1IG1lbWlsaWtpIHBlbHVhbmcgeWFuZyBzYW1hIHVudHVrIHRlcnBpbGloLCBzZWhpbmdnYSBkYXBhdCBtZW55ZWJhYmthbiBoYXNpbCBrdXJhbmcgcmVwcmVzZW50YXRpZi4KCiMjIyAxLjIuNCBNZW1iYW5kaW5na2FuIGhhc2lsIGRhcmkgYmVyYmFnYWkgbWV0b2RlIHNhbXBsaW5nCgpNZW5nYW5hbGlzaXMgcGVyYmVkYWFuIGhhc2lsIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiBtYWthbiBtYWhhc2lzd2EsIE1vRSwgZGFuIGJpYXMgYW50YXJhIFByb2JhYmlsaXR5IFNhbXBsaW5nIGRhbiBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgdW50dWsgbWVuZW50dWthbiBtZXRvZGUgeWFuZyBwYWxpbmcgYWt1cmF0IGRhbiByZXByZXNlbnRhdGlmLgoKIyMjIDEuMi41IE1lbmVudHVrYW4gdWt1cmFuIHNhbXBlbCB1bnR1ayBNb0Ug4omkIDUlCgpNZW5nYW5hbGlzaXMgc2ViZXJhcGEgYmVzYXIgcGVuZ2FydWggdWt1cmFuIHNhbXBlbCB0ZXJoYWRhcCBrZWFrdXJhdGFuIGhhc2lsIHBlbmVsaXRpYW4gZGFuIG1lbmVudHVrYW4gdWt1cmFuIHNhbXBlbCBvcHRpbWFsIGFnYXIgTW9FIHRldGFwIGRpIGJhd2FoIDUlLgoKU2VjYXJhIGtlc2VsdXJ1aGFuLCBwcmFrdGlrdW0gaW5pIGJlcnR1anVhbiB1bnR1ayBtZW1haGFtaSBtZXRvZGUgc2FtcGxpbmcsIG1lbmdoaXR1bmcgTW9FLCBkYW4gbWVuZ2V2YWx1YXNpIG1ldG9kZSB0ZXJiYWlrIGRhbGFtIG1lbXBlcm9sZWggZXN0aW1hc2kgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhIHlhbmcgcGFsaW5nIGFrdXJhdCBkYW4gcmVwcmVzZW50YXRpZi4KCi0tLQoKCiMgMi4gTWV0b2RlIFNhbXBsaW5nIHlhbmcgRGlndW5ha2FuCgojIyBEYXRhLXNldCB5YW5nIGRpc2FqaWthbjoKCmBgYHtyIGVjaG89RkFMU0UsIG1hc3NlZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGFfcGVuZ2VsdWFyYW4gPC0gcmVhZC5jc3YoIkRhdGFfcGVuZ2VsdWFyYW4uY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKIyBDZWsgZGF0YQpsaWJyYXJ5KGtuaXRyKQprYWJsZShoZWFkKGRhdGFfcGVuZ2VsdWFyYW4pKQoKYGBgCgpEYWxhbSBwZW5lbGl0aWFuIGluaSwgcGVuZ2FtYmlsYW4gc2FtcGVsIGRpbGFrdWthbiB1bnR1ayBtZW1haGFtaSBwb2xhIHBlbmdlbHVhcmFuIG1haGFzaXN3YS4gRGVuZ2FuIHBvcHVsYXNpIHNlYmFueWFrIDMwMCBtYWhhc2lzd2EsIG1ldG9kZSBzYW1wbGluZyB5YW5nIGRpdGVyYXBrYW4gbWVuY2FrdXAgdGVrbmlrIHByb2JhYmlsaXR5IHNhbXBsaW5nIGRhbiBub24tcHJvYmFiaWxpdHkgc2FtcGxpbmcuIFBlbmdndW5hYW4gbWV0b2RlIGluaSBiZXJ0dWp1YW4gYWdhciBkYXRhIHlhbmcgZGlwZXJvbGVoIGRhcGF0IG1lcmVwcmVzZW50YXNpa2FuIHBvbGEgcGVuZ2VsdWFyYW4gbWFoYXNpc3dhIHNlY2FyYSBsZWJpaCBha3VyYXQuCiAKUGVuZ2FtYmlsYW4gc2FtcGVsIGRpbGFrdWthbihkaWJhbnR1KSBkZW5nYW4gbWVuZ2d1bmFrYW4gYmFoYXNhIHBlbXJvZ3JhbWFuIFIsIHlhbmcgbWVtdW5na2lua2FuIGtpdGEgdW50dWsgbWVsYWt1a2FuIHNlbGVrc2kgZGF0YSBzZWNhcmEgc2lzdGVtYXRpcyBkYW4gYWNhay4KCiMjIDIuMSBQcm9iYWJpbGl0eSBTYW1wbGluZyAoU2FtcGxpbmcgQWNhaykKClBhZGEgbWV0b2RlIHByb2JhYmlsaXR5IHNhbXBsaW5nLCBzZXRpYXAgbWFoYXNpc3dhIGRhbGFtIHBvcHVsYXNpIG1lbWlsaWtpIHBlbHVhbmcgeWFuZyBzYW1hIHVudHVrIGRpcGlsaWguIFNhbGFoIHNhdHUgdGVrbmlrIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAqU2ltcGxlIFJhbmRvbSBTYW1wbGluZyAoU1JTKSosIGRpIG1hbmEgcGVtaWxpaGFuIHNhbXBlbCBkaWxha3VrYW4gc2VjYXJhIGFjYWsgdGFucGEgbWVtcGVyaGF0aWthbiBmYWt0b3IgbGFpbi4gRGFsYW0gcGVuZWxpdGlhbiBpbmksIHNlYmFueWFrIDEwMCBtYWhhc2lzd2EgZGlwaWxpaCBzZWNhcmEgYWNhayBkYXJpIHRvdGFsIDMwMCBtYWhhc2lzd2EgbWVuZ2d1bmFrYW4gZnVuZ3NpIGFjYWsgZGFsYW0gUi4gRGVuZ2FuIGNhcmEgaW5pLCBzYW1wZWwgeWFuZyB0ZXJwaWxpaCBkaWhhcmFwa2FuIGJpc2EgbWVuY2VybWlua2FuIHBlbmdlbHVhcmFuIG1haGFzaXN3YSBzZWNhcmEgdW11bS4KIAoKIyMjIDIuMS4xLiBTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIChTUlMpCgpTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIChTUlMpIGFkYWxhaCBtZXRvZGUgZGkgbWFuYSBzZXRpYXAgaW5kaXZpZHUgZGFsYW0gcG9wdWxhc2kgbWVtaWxpa2kgcGVsdWFuZyB5YW5nIHNhbWEgdW50dWsgZGlwaWxpaCB0YW5wYSBtZW1wZXJoYXRpa2FuIGthcmFrdGVyaXN0aWsgdGVydGVudHUuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbGlicmFyeShkcGx5cikKCmRhdGEgPC0gcmVhZC5jc3YoImRhdGFfdGlkdXJfbWFoYXNpc3dhX21peGVkICgxKS5jc3YiKQoKc2V0LnNlZWQoMTIzKQpzcnNfc2FtcGxlIDwtIGRhdGEgJT4lIHNhbXBsZV9uKDEwMCkKCmthYmxlKGhlYWQoc3JzX3NhbXBsZSkpCmBgYAoKTWV0b2RlOiAKCi0gTWVuZ3VtcHVsa2FuIGRhZnRhciBzZWx1cnVoIDMwMCBtYWhhc2lzd2EgZGFsYW0gZGF0YXNldC4KCgotIERhcmkgZGFmdGFyIHRlcnNlYnV0LCBtZW5nZ3VuYWthbiBmdW5nc2kgc2FtcGxlX24oKSBkYWxhbSBSLCBrYW1pIHNlY2FyYSBhY2FrIG1lbWlsaWggMTAwIG1haGFzaXN3YSB0YW5wYSBtZW1wZXJ0aW1iYW5na2FuIGZha3VsdGFzIGF0YXUga2FyYWt0ZXJpc3RpayBsYWlubnlhLgoKCi0gTmFtYS1uYW1hIG1haGFzaXN3YSB5YW5nIHRlcnBpbGloIGRpY2F0YXQgc2ViYWdhaSBzYW1wZWwgcGVuZWxpdGlhbi4KCgoKIyMjIDIuMS4yLiBTdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGluZwoKU3RyYXRpZmllZCBTYW1wbGluZyBtZW1iYWdpIHBvcHVsYXNpIG1lbmphZGkgYmViZXJhcGEga2Vsb21wb2sgYmVyZGFzYXJrYW4ga2FyYWt0ZXJpc3RpayB0ZXJ0ZW50dSAobWlzYWxueWEgZmFrdWx0YXMpIHNlYmVsdW0gcGVuZ2FtYmlsYW4gc2FtcGVsIGRpbGFrdWthbi4KCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQoKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQoKc2V0LnNlZWQoMTIzKQpzdHJhdGlmaWVkX3NhbXBsZSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KEZha3VsdGFzKSAlPiUKICBzYW1wbGVfbigxMDAgLyBsZW5ndGgodW5pcXVlKGRhdGEkRmFrdWx0YXMpKSwgcmVwbGFjZSA9IEZBTFNFKQoKa2FibGUoaGVhZChzdHJhdGlmaWVkX3NhbXBsZSkpCmBgYAoKTWV0b2RlOiAKCi0gU2VsdXJ1aCBtYWhhc2lzd2EgZGlrZWxvbXBva2thbiBiZXJkYXNhcmthbiBmYWt1bHRhcyBtZXJla2EgKG1pc2FsbnlhLCBGYWt1bHRhcyBUZWtuaWssIEVrb25vbWksIGRhbiBTYWlucykuCgoKLSBKdW1sYWggbWFoYXNpc3dhIGRhbGFtIHNldGlhcCBmYWt1bHRhcyBkaWhpdHVuZywgbGFsdSBwcm9wb3JzaSBzYW1wZWwgZGFyaSBzZXRpYXAgZmFrdWx0YXMgZGl0ZW50dWthbiBhZ2FyIHBlcndha2lsYW5ueWEgc2VpbWJhbmcuCgoKLSBEZW5nYW4gbWVuZ2d1bmFrYW4gZnVuZ3NpIGdyb3VwX2J5KCkgZGFsYW0gUiwga2FtaSBtZW5nYW1iaWwgc2FtcGVsIHNlY2FyYSBhY2FrIGRhcmkgc2V0aWFwIGZha3VsdGFzIHNlc3VhaSBkZW5nYW4gcHJvcG9yc2kgeWFuZyB0ZWxhaCBkaXRlbnR1a2FuLgoKCi0gTWFoYXNpc3dhIHlhbmcgdGVycGlsaWggZGFsYW0gc2V0aWFwIGZha3VsdGFzIGRpY2F0YXQgc2ViYWdhaSBzYW1wZWwgYWtoaXIuCgoKIyMjIDIuMS4zLiBTeXN0ZW1hdGljIFNhbXBsaW5nCgpTeXN0ZW1hdGljIFNhbXBsaW5nIG1lbWlsaWggc2FtcGVsIGRlbmdhbiBwb2xhIHNpc3RlbWF0aXMsIG1pc2FsbnlhIHNldGlhcCBtYWhhc2lzd2Ega2UtMyBkYWxhbSBkYWZ0YXIuCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExvYWQgbGlicmFyeQpsaWJyYXJ5KGRwbHlyKQoKIyBNZW1iYWNhIGRhdGFzZXQKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQoKIyBNZW5nYW1iaWwgc2FtcGVsIHNlY2FyYSBTaXN0ZW1hdGlzCnNldC5zZWVkKDEyMykKTiA8LSBucm93KGRhdGEpCm4gPC0gMTAwCmsgPC0gZmxvb3IoTiAvIG4pCnN5c3RlbWF0aWNfc2FtcGxlIDwtIGRhdGFbc2VxKDEsIE4sIGJ5ID0gayksIF0KCiMgTWVuYW1waWxrYW4gaGFzaWwKa2FibGUoaGVhZChzeXN0ZW1hdGljX3NhbXBsZSkpCmBgYAoKCk1ldG9kZTogCgotIFNlbHVydWggbWFoYXNpc3dhIGRhbGFtIGRhdGFzZXQgZGl1cnV0a2FuIGJlcmRhc2Fya2FuIG5vbW9yIElEIGF0YXUgYWxmYWJldCBuYW1hIG1lcmVrYS4KCgotIERlbmdhbiB0b3RhbCBwb3B1bGFzaSAzMDAgbWFoYXNpc3dhIGRhbiBqdW1sYWggc2FtcGVsIHlhbmcgZGlidXR1aGthbiAxMDAsIGludGVydmFsIHNpc3RlbWF0aXMgZGl0ZW50dWthbiBkZW5nYW4gcnVtdXMgayA9IDMwMC8xMDAgPSAzLCBhcnRpbnlhIHNldGlhcCBtYWhhc2lzd2Ega2UtMyBha2FuIGRpcGlsaWguCgoKLSBNYWhhc2lzd2EgcGVydGFtYSBkYWxhbSBkYWZ0YXIgZGlwaWxpaCBzZWNhcmEgYWNhayBzZWJhZ2FpIHRpdGlrIGF3YWwsIGxhbHUgbWFoYXNpc3dhIGtlLTMgYmVyaWt1dG55YSB0ZXJ1cyBkaXBpbGloIGhpbmdnYSBtZW5jYXBhaSAxMDAgc2FtcGVsLgoKCi0gRGFmdGFyIG1haGFzaXN3YSB5YW5nIHRlcnBpbGloIGRpY2F0YXQgc2ViYWdhaSBzYW1wZWwgcGVuZWxpdGlhbi4KCgojIyMgMi4xLjQuIENsdXN0ZXIgU2FtcGxpbmcKCkNsdXN0ZXIgU2FtcGxpbmcgbWVtYmFnaSBwb3B1bGFzaSBtZW5qYWRpIGtlbG9tcG9rLWtlbG9tcG9rIGtlY2lsIChjbHVzdGVyKSwgbGFsdSBiZWJlcmFwYSBjbHVzdGVyIGRpcGlsaWggdW50dWsgZGlqYWRpa2FuIHNhbXBlbC4KCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExvYWQgbGlicmFyeQpsaWJyYXJ5KGRwbHlyKQoKIyBNZW1iYWNhIGRhdGFzZXQKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQoKIyBNZW5nYW1iaWwgc2FtcGVsIHNlY2FyYSBTdHJhdGlmaWVkIGJlcmRhc2Fya2FuIEZha3VsdGFzCnNldC5zZWVkKDEyMykKc3RyYXRpZmllZF9zYW1wbGUgPC0gZGF0YSAlPiUKICBncm91cF9ieShGYWt1bHRhcykgJT4lCiAgc2FtcGxlX24oMTAwIC8gbGVuZ3RoKHVuaXF1ZShkYXRhJEZha3VsdGFzKSksIHJlcGxhY2UgPSBGQUxTRSkKCiMgTWVuYW1waWxrYW4gaGFzaWwKa2FibGUoaGVhZChzdHJhdGlmaWVkX3NhbXBsZSkpCmBgYAoKTWV0b2RlOiAKCi0gUG9wdWxhc2kgbWFoYXNpc3dhIGRpYmFnaSBtZW5qYWRpIGJlYmVyYXBhIGNsdXN0ZXIgYmVyZGFzYXJrYW4gZmFrdWx0YXMuCgoKLSBEYXJpIGRhZnRhciBmYWt1bHRhcywgZHVhIGF0YXUgdGlnYSBmYWt1bHRhcyBkaXBpbGloIHNlY2FyYSBhY2FrIG1lbmdndW5ha2FuIGZ1bmdzaSBzYW1wbGVfbigpLgoKCi0gU2VtdWEgbWFoYXNpc3dhIGRhbGFtIGZha3VsdGFzIHlhbmcgdGVycGlsaWggc2VjYXJhIG90b21hdGlzIGRpbWFzdWtrYW4ga2UgZGFsYW0gc2FtcGVsLgoKCi0gTmFtYS1uYW1hIG1haGFzaXN3YSBkYXJpIGZha3VsdGFzIHlhbmcgdGVycGlsaWggZGljYXRhdCBzZWJhZ2FpIHNhbXBlbCBha2hpci4KCgojIyMgMi4xLjUuIE11bHRpLVN0YWdlIFNhbXBsaW5nCgpNdWx0aS1zdGFnZSBzYW1wbGluZyBhZGFsYWggbWV0b2RlIHBlbmdhbWJpbGFuIHNhbXBlbCBiZXJ0YWhhcCBkZW5nYW4gbWVtYmFnaSBwb3B1bGFzaSBrZSBkYWxhbSBrZWxvbXBvaywgbWVtaWxpaCBzdWIta2Vsb21wb2sgc2VjYXJhIGFjYWssIGxhbHUgbWVuZ2FtYmlsIHNhbXBlbCBha2hpci4gVGVrbmlrIGluaSBlZmlzaWVuIHVudHVrIHBvcHVsYXNpIGJlc2FyIHRldGFwaSBsZWJpaCBrb21wbGVrcyBkYW4gYmVyaXNpa28gYmlhcy4KCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExvYWQgbGlicmFyeQpsaWJyYXJ5KGRwbHlyKQoKIyBNZW1iYWNhIGRhdGFzZXQKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQoKIyBUYWhhcCAxOiBNZW1pbGloIGJlYmVyYXBhIGZha3VsdGFzIHNlY2FyYSBhY2FrIHNlYmFnYWkgY2x1c3RlcgpzZXQuc2VlZCgxMjMpCnNlbGVjdGVkX2Zha3VsdGFzIDwtIGRhdGEgJT4lCiAgZGlzdGluY3QoRmFrdWx0YXMpICU+JQogIHNhbXBsZV9uKDMpICAjIE1pc2FsbnlhLCBtZW1pbGloIDMgZmFrdWx0YXMgc2VjYXJhIGFjYWsKCiMgVGFoYXAgMjogTWVtaWxpaCBzZWp1bWxhaCBtYWhhc2lzd2Egc2VjYXJhIGFjYWsgZGFyaSBzZXRpYXAgZmFrdWx0YXMgeWFuZyB0ZXJwaWxpaAptdWx0aV9zdGFnZV9zYW1wbGUgPC0gZGF0YSAlPiUKICBmaWx0ZXIoRmFrdWx0YXMgJWluJSBzZWxlY3RlZF9mYWt1bHRhcyRGYWt1bHRhcykgJT4lCiAgZ3JvdXBfYnkoRmFrdWx0YXMpICU+JQogIHNhbXBsZV9uKDEwMCAvIG5yb3coc2VsZWN0ZWRfZmFrdWx0YXMpLCByZXBsYWNlID0gRkFMU0UpCgojIE1lbmFtcGlsa2FuIGhhc2lsCmthYmxlKGhlYWQobXVsdGlfc3RhZ2Vfc2FtcGxlKSkKYGBgCgpNZXRvZGU6CgotIFBhZGEgdGFoYXAgcGVydGFtYSwgdGlnYSBmYWt1bHRhcyBkaXBpbGloIHNlY2FyYSBhY2FrIGRhcmkgdG90YWwgZmFrdWx0YXMgeWFuZyBhZGEgZGFsYW0gZGF0YXNldC4KCgotIFNldGVsYWggaXR1LCBkYWxhbSBzZXRpYXAgZmFrdWx0YXMgeWFuZyB0ZXJwaWxpaCwga2FtaSBtZW1pbGloIHNlanVtbGFoIG1haGFzaXN3YSBzZWNhcmEgYWNhayBtZW5nZ3VuYWthbiBmdW5nc2kgc2FtcGxlX24oKS4KCgotIFNhbXBlbCBha2hpciB0ZXJkaXJpIGRhcmkgbWFoYXNpc3dhIHlhbmcgdGVycGlsaWggZGFyaSBmYWt1bHRhcy1mYWt1bHRhcyB5YW5nIHN1ZGFoIGRpc2VsZWtzaSBzZWJlbHVtbnlhLgoKCi0gRGF0YSBtYWhhc2lzd2EgeWFuZyBtYXN1ayBkYWxhbSBzYW1wZWwgZGljYXRhdCBkYW4gZGlndW5ha2FuIHVudHVrIGFuYWxpc2lzIGxlYmloIGxhbmp1dC4KCiMjIDIuMiBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgKFNhbXBsaW5nIFRpZGFrIEFjYWspCgpEaSBzaXNpIGxhaW4sIG1ldG9kZSBub24tcHJvYmFiaWxpdHkgc2FtcGxpbmcgZGl0ZXJhcGthbiB1bnR1ayBtZWxpaGF0IGJhZ2FpbWFuYSBwb2xhIHBlbmdlbHVhcmFuIG1haGFzaXN3YSBkZW5nYW4gY2FyYSB5YW5nIGxlYmloIHByYWt0aXMsIG1lc2tpcHVuIHRpZGFrIHNlbXVhIG1haGFzaXN3YSBtZW1pbGlraSBwZWx1YW5nIHlhbmcgc2FtYSB1bnR1ayB0ZXJwaWxpaC4KCiMjIyAyLjIuMS4gQ29udmVuaWVuY2UgU2FtcGxpbmcKCkNvbnZlbmllbmNlIFNhbXBsaW5nIG1lbWlsaWggc2FtcGVsIGJlcmRhc2Fya2FuIGtlbXVkYWhhbiBha3NlcywgbWlzYWxueWEgbWFoYXNpc3dhIHlhbmcgdGVyc2VkaWEgbGViaWggZHVsdS4KCmBgYHtyIGVjaG89RkFMU0UsIG1hc3NlZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTG9hZCBsaWJyYXJ5CmxpYnJhcnkoZHBseXIpCgojIE1lbWJhY2EgZGF0YXNldApkYXRhIDwtIHJlYWQuY3N2KCJEYXRhX3BlbmdlbHVhcmFuLmNzdiIpCgojIE1lbmdhbWJpbCAxMDAgbWFoYXNpc3dhIHBlcnRhbWEKY29udmVuaWVuY2Vfc2FtcGxlIDwtIGhlYWQoZGF0YSwgMTAwKQoKIyBNZW5hbXBpbGthbiBoYXNpbAprYWJsZSAoaGVhZChjb252ZW5pZW5jZV9zYW1wbGUpKQpgYGAKCgpNZXRvZGU6IAoKLSBEYXRhc2V0IG1haGFzaXN3YSBkaXVydXRrYW4gYmVyZGFzYXJrYW4gdXJ1dGFuIGVudHJpIGRhdGEuCgoKLSBMYWx1LCBsYW5nc3VuZyBtZW5nYW1iaWwgMTAwIG1haGFzaXN3YSBwZXJ0YW1hIHlhbmcgcGFsaW5nIGdhbXBhbmcgZGkgYWtzZXMgZGFsYW0gZGFmdGFyIHRhbnBhIG1lbXBlcnRpbWJhbmdrYW4gZmFrdWx0YXMgYXRhdSBrYXJha3RlcmlzdGlrIGxhaW5ueWEuCgoKLSBEYWZ0YXIgbWFoYXNpc3dhIHlhbmcgZGlhbWJpbCBkaWNhdGF0IHNlYmFnYWkgc2FtcGVsIHBlbmVsaXRpYW4uCgoKIyMjIDIuMi4yLiBQdXJwb3NpdmUgU2FtcGxpbmcKCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIE1lbWJhY2EgZGF0YXNldApkYXRhIDwtIHJlYWQuY3N2KCJEYXRhX3BlbmdlbHVhcmFuLmNzdiIpCgoKIyBGaWx0ZXIgbWFoYXNpc3dhIGRlbmdhbiBqYW0gdGlkdXIgPj0gNApwdXJwb3NpdmVfc2FtcGxlIDwtIGRhdGEgJT4lCiAgZmlsdGVyKFBlbmdlbHVhcmFuLi5SdXBpYWguIDwgMTAwMDAwMCkKCiMgTWVuYW1waWxrYW4gaGFzaWwKa2FibGUoaGVhZChwdXJwb3NpdmVfc2FtcGxlKSkKYGBgCgpNZXRvZGU6IAoKLSBLYW1pIG1lbmV0YXBrYW4ga3JpdGVyaWEga2h1c3VzLCB5YWl0dSBtYWhhc2lzd2EgZGVuZ2FuIHBlbmdlbHVhcmFuIGt1cmFuZyBkYXJpIFJwMS4wMDAuMDAwIHBlciBidWxhbi4KCgotIERhdGFzZXQgbWFoYXNpc3dhIGRpZmlsdGVyIGJlcmRhc2Fya2FuIHBlbmdlbHVhcmFuIG1lcmVrYSBtZW5nZ3VuYWthbiBmdW5nc2kgZmlsdGVyKCkgZGFsYW0gUi4KCgotIERhcmkgaGFzaWwgcGVueWFyaW5nYW4gdGVyc2VidXQsIHNlYmFueWFrIDEwMCBtYWhhc2lzd2EgeWFuZyBtZW1lbnVoaSBrcml0ZXJpYSBkaXBpbGloIHNlYmFnYWkgc2FtcGVsLgoKIyMjIDIuMi4zLiBTbm93YmFsbCBTYW1wbGluZwoKU25vd2JhbGwgU2FtcGxpbmcgZGlndW5ha2FuIGtldGlrYSBwb3B1bGFzaSBzdWxpdCBkaWphbmdrYXUuIFNhbXBlbCBwZXJ0YW1hIGRpcGlsaWgsIGxhbHUgbWVyZWthIG1lbWJhbnR1IG1lcmVrcnV0IHNhbXBlbCBiZXJpa3V0bnlhLgoKYGBge3IgZWNobz1GQUxTRSwgbWFzc2VnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBMb2FkIGxpYnJhcnkKbGlicmFyeShkcGx5cikKCiMgTWVtYmFjYSBkYXRhc2V0CmRhdGEgPC0gcmVhZC5jc3YoIkRhdGFfcGVuZ2VsdWFyYW4uY3N2IikKCiMgTWVuZ2FtYmlsIDEwMCBtYWhhc2lzd2EgcGVydGFtYQpjb252ZW5pZW5jZV9zYW1wbGUgPC0gaGVhZChkYXRhLCAxMDApCgojIE1lbmFtcGlsa2FuIGhhc2lsCmthYmxlKGhlYWQoY29udmVuaWVuY2Vfc2FtcGxlKSkKYGBgCgpNZXRvZGU6IAoKLSBTZW9yYW5nIG1haGFzaXN3YSBkaXBpbGloIHNlY2FyYSBhY2FrIHNlYmFnYWkgcmVzcG9uZGVuIGF3YWwuCgoKLSBNYWhhc2lzd2EgdGVyc2VidXQgZGltaW50YSBtZXJla29tZW5kYXNpa2FuIHRlbWFuLXRlbWFubnlhIHlhbmcgbWVtaWxpa2kgcG9sYSBwZW5nZWx1YXJhbiBzZXJ1cGEuCgoKLSBTZXRpYXAgbWFoYXNpc3dhIHlhbmcgZGlyZWtvbWVuZGFzaWthbiBrZW11ZGlhbiBkaW1pbnRhIG1lcmVrb21lbmRhc2lrYW4gbWFoYXNpc3dhIGxhaW4gaGluZ2dhIGp1bWxhaCBzYW1wZWwgbWVuY2FwYWkgMTAwIG9yYW5nLgoKCi0gRGF0YSBtYWhhc2lzd2EgeWFuZyBkaWRhcGF0a2FuIGRpY2F0YXQgc2ViYWdhaSBzYW1wZWwgcGVuZWxpdGlhbi4KCgojIyMgMi4yLjQuIFF1b3RhIFNhbXBsaW5nCgpTYW1wZWwgZGlwaWxpaCBoaW5nZ2Ega3VvdGEgdGVydGVudHUgdGVycGVudWhpIGJlcmRhc2Fya2FuIGthdGVnb3JpIHRlcnRlbnR1IChtaXNhbG55YSBqdW1sYWggbWFoYXNpc3dhIHBlciBmYWt1bHRhcykuCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExvYWQgbGlicmFyeQpsaWJyYXJ5KGRwbHlyKQoKIyBNZW1iYWNhIGRhdGFzZXQKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQoKIyBNZW5nYW1iaWwgc2FtcGVsIGJlcmRhc2Fya2FuIGt1b3RhIHBlciBmYWt1bHRhcwpzZXQuc2VlZCgxMjMpCnF1b3RhX3NhbXBsZSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KEZha3VsdGFzKSAlPiUKICBzYW1wbGVfbigxMDAgLyBsZW5ndGgodW5pcXVlKGRhdGEkRmFrdWx0YXMpKSkKCiMgTWVuYW1waWxrYW4gaGFzaWwKa2FibGUoaGVhZChxdW90YV9zYW1wbGUpKQpgYGAKCk1ldG9kZTogCgotIExhbmdrYWggYXdhbG55YSBtZW5ldGFwa2FuIGt1b3RhLCBtaXNhbG55YSBzZXRpYXAgZmFrdWx0YXMgaGFydXMgbWVueXVtYmFuZyAyMCBtYWhhc2lzd2EgZGFsYW0gc2FtcGVsLgoKCi0gRGF0YSBtYWhhc2lzd2EgZGlrZWxvbXBva2thbiBiZXJkYXNhcmthbiBmYWt1bHRhcy4KCgotIERhcmkgbWFzaW5nLW1hc2luZyBmYWt1bHRhcywgbWFoYXNpc3dhIGRpcGlsaWggc2VjYXJhIGJlcnVydXRhbiBoaW5nZ2Ega3VvdGEgMjAgbWFoYXNpc3dhIHBlciBmYWt1bHRhcyB0ZXJwZW51aGkuCgoKLSBKaWthIGRhbGFtIHN1YXR1IGZha3VsdGFzIGp1bWxhaCBtYWhhc2lzd2EgeWFuZyB0ZXJzZWRpYSB0aWRhayBtZW5jdWt1cGksIG1ha2EgZGF0YSB5YW5nIGFkYSB0ZXRhcCBkaWd1bmFrYW4gdGFucGEgdGFtYmFoYW4gZGFyaSBmYWt1bHRhcyBsYWluLgoKCi0gTWFoYXNpc3dhIHlhbmcgdGVycGlsaWggZGFsYW0gc2V0aWFwIGZha3VsdGFzIGRpY2F0YXQgc2ViYWdhaSBzYW1wZWwgYWtoaXIuCgoKCi0tLQoKIyAzLiBQZXJoaXR1bmdhbiBNYXJnaW4gb2YgRXJyb3IgKE1vRSkgZGFsYW0gUHJvYmFiaWxpdHkgU2FtcGxpbmcKClNlY2FyYSB1bXVtLCBNb0UgZGloaXR1bmcgZGVuZ2FuIHJ1bXVzOiAgCgpcWwpNb0UgPSBaIFx0aW1lcyBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fQpcXQoKRGltYW5hOiAgCgotIFwoIFogPSAxLjk2IFwpICh1bnR1ayB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JSkgCgotIFwoIG4gPSAxMDAgXCkgKGp1bWxhaCBzYW1wZWwpICAKCi0gXCggXHNpZ21hIFwpID0gU2ltcGFuZ2FuIGJha3Ugc2FtcGVsICAKClNpbXBhbmdhbiBiYWt1IChcKFxzaWdtYVwpKSBkaWhpdHVuZyBkZW5nYW4gcnVtdXM6ICAKClxbClxzaWdtYSA9IFxzcXJ0e1xmcmFje1xzdW0gKFhfaSAtIFxiYXJ7WH0pXjJ9e24tMX19ClxdCgpEaW1hbmE6ICAKCi0gXCggWF9pIFwpID0gUGVuZ2VsdWFyYW4gbWFoYXNpc3dhIGtlLVwoaVwpIGRhbGFtIHNhbXBlbCAKCi0gXCggXGJhcntYfSBcKSA9IFJhdGEtcmF0YSB3YWt0dSB0aWR1ciBtYWhhc2lzd2EgIAoKLSBcKCBuIFwpID0gVWt1cmFuIHNhbXBlbCAgCgojIyAzLjEgU2ltcGxlIFJhbmRvbSBTYW1wbGluZyAoU1JTKSAgCkRpa2V0YWh1aTogIAoKYGBge3IgZWNobz1GQUxTRSwgbWFzc2VnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBMb2FkIGRhdGFzZXQKZGF0YSA8LSByZWFkLmNzdigiRGF0YV9wZW5nZWx1YXJhbi5jc3YiKQojIE1lbmVudHVrYW4ganVtbGFoIHNhbXBlbApuIDwtIDEwMAoKIyBNZW5nYW1iaWwgc2FtcGVsIHNlY2FyYSBhY2FrCnNldC5zZWVkKDMwKQpzcnNfc2FtcGxlIDwtIGRhdGFbc2FtcGxlKG5yb3coZGF0YSksIG4sIHJlcGxhY2UgPSBGQUxTRSksIF0KCiMgTWVuZ2hpdHVuZyBzaW1wYW5nYW4gYmFrdQpzaWdtYV9zcnMgPC0gc2Qoc3JzX3NhbXBsZSRQZW5nZWx1YXJhbi4uUnVwaWFoLiwgbmEucm0gPSBUUlVFKSAgIyBHYW50aSBkZW5nYW4gbmFtYSBrb2xvbSB5YW5nIHNlc3VhaQoKIyBNZW5hbXBpbGthbiBoYXNpbApwcmludChwYXN0ZSgiU2ltcGFuZ2FuIEJha3UgKFNSUyk6Iiwgcm91bmQoc2lnbWFfc3JzLCAyKSwgIlJ1cGlhaCIpKQpgYGAKCioqU2ltcGFuZ2FuIEJha3UgKFNSUyk6IDM1NzY1NS4zNSBSdXBpYWgqKiAgCgpcWwpNb0UgPSAxLjk2IFx0aW1lcyBcZnJhY3szNTc2NTUuMzV9e1xzcXJ0ezEwMH19ClxdCgpcWwpNb0UgPSAxLjk2IFx0aW1lcyBcZnJhY3szNTc2NTUuMzV9ezEwfQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgMzU3NjUuNTQKXF0KClxbCk1vRSA9IDcwMDk5LjQ3ClxdCgpKYWRpLCAqKk1vRSA9IDcwLDA5OS40NyBSdXBpYWgqKi4gIAoKUGFkYSBtZXRvZGUgKipTaW1wbGUgUmFuZG9tIFNhbXBsaW5nIChTUlMpKiosIHNldGlhcCBtYWhhc2lzd2EgbWVtaWxpa2kgcGVsdWFuZyB5YW5nIHNhbWEgdW50dWsgdGVycGlsaWggZGFsYW0gc2FtcGVsLiBEZW5nYW4gTW9FIHNlYmVzYXIgKio3MCwwOTkuNDcgUnVwaWFoKiosIG1ldG9kZSBpbmkgY3VrdXAgYWt1cmF0IGRhbGFtIG1lbmdnYW1iYXJrYW4gcG9wdWxhc2ksIHRldGFwaSB0aWRhayBtZW1wZXJ0aW1iYW5na2FuIHZhcmlhc2kgeWFuZyBtdW5na2luIGFkYSBkaSBhbnRhcmEga2Vsb21wb2sgbWFoYXNpc3dhLCBzZXBlcnRpIHBlcmJlZGFhbiBwb2xhIHBlbmdlbHVhcmFuIGFudGFyIGZha3VsdGFzLiAgCgojIyAzLjIgU3RyYXRpZmllZCBSYW5kb20gU2FtcGxpbmcgIApEaWtldGFodWk6ICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTG9hZCBsaWJyYXJ5CmxpYnJhcnkoZHBseXIpCgojIE1lbmVudHVrYW4ganVtbGFoIHNhbXBlbApuIDwtIDEwMAoKIyBNZW5nYW1iaWwgc2FtcGVsIGJlcmRhc2Fya2FuIGZha3VsdGFzCnNldC5zZWVkKDM1KQpzdHJhdGlmaWVkX3NhbXBsZSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KEZha3VsdGFzKSAlPiUKICBzYW1wbGVfbihuIC8gbGVuZ3RoKHVuaXF1ZShkYXRhJEZha3VsdGFzKSksIHJlcGxhY2UgPSBGQUxTRSkKCiMgTWVuZ2hpdHVuZyBzaW1wYW5nYW4gYmFrdQpzaWdtYV9zdHJhdGlmaWVkIDwtIHNkKHN0cmF0aWZpZWRfc2FtcGxlJFBlbmdlbHVhcmFuLi5SdXBpYWguLCBuYS5ybSA9IFRSVUUpCgojIE1lbmFtcGlsa2FuIGhhc2lsCnByaW50KHBhc3RlKCJTaW1wYW5nYW4gQmFrdSAoU3RyYXRpZmllZCk6Iiwgcm91bmQoc2lnbWFfc3RyYXRpZmllZCwgMiksICJSdXBpYWgiKSkKCmBgYAoKKipTaW1wYW5nYW4gQmFrdSAoU3RyYXRpZmllZCk6IDM5NTMwMC44NyBSdXBpYWgqKiAgCgpcWwpNb0UgPSAxLjk2IFx0aW1lcyBcZnJhY3szOTUzMDAuODd9e1xzcXJ0ezEwMH19ClxdCgpcWwpNb0UgPSAxLjk2IFx0aW1lcyBcZnJhY3szOTUzMDAuODd9ezEwfQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgMzk1MzAuMDkKXF0KClxbCk1vRSA9IDc3NDc4Ljk4ClxdCgpKYWRpLCAqKk1vRSA9IDc3LDQ3OC45OCBSdXBpYWgqKi4gIAoKUGFkYSBtZXRvZGUgKipTdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGluZyoqLCBtYWhhc2lzd2EgZGliYWdpIGtlIGRhbGFtIGtlbG9tcG9rIGJlcmRhc2Fya2FuIGZha3VsdGFzIHNlYmVsdW0gc2FtcGVsIGRpYW1iaWwuIERlbmdhbiBjYXJhIGluaSwgc2V0aWFwIGZha3VsdGFzIG1lbmRhcGF0a2FuIHJlcHJlc2VudGFzaSB5YW5nIHByb3BvcnNpb25hbCBkYWxhbSBzYW1wZWwuIE1vRSB5YW5nIGRpaGFzaWxrYW4gYWRhbGFoICoqNzcsNDc4Ljk4IFJ1cGlhaCoqLCB5YW5nIG1lcnVwYWthbiBuaWxhaSB5YW5nIHJlbGF0aWYga2VjaWwgZGliYW5kaW5na2FuIG1ldG9kZSBsYWlubnlhLiBJbmkgbWVudW5qdWtrYW4gYmFod2EgbWV0b2RlIGluaSBtYW1wdSBtZW1iZXJpa2FuIGVzdGltYXNpIHlhbmcgbGViaWggYWt1cmF0IGthcmVuYSBtZW1wZXJ0aW1iYW5na2FuIHZhcmlhc2kgZGFsYW0gcG9wdWxhc2kuICAKCiMjIDMuMyBTeXN0ZW1hdGljIFNhbXBsaW5nICAKRGlrZXRhaHVpOiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtYXNzZWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIE1lbmVudHVrYW4ganVtbGFoIHNhbXBlbApuIDwtIDEwMApOIDwtIG5yb3coZGF0YSkKayA8LSBmbG9vcihOIC8gbikKCiMgTWVuZ2FtYmlsIHNhbXBlbCBzZWNhcmEgc2lzdGVtYXRpcwpzZXQuc2VlZCgzMCkKc3lzdGVtYXRpY19zYW1wbGUgPC0gZGF0YVtzZXEoMSwgTiwgYnkgPSBrKSwgXQoKIyBNZW5naGl0dW5nIHNpbXBhbmdhbiBiYWt1CnNpZ21hX3N5c3RlbWF0aWMgPC0gc2Qoc3lzdGVtYXRpY19zYW1wbGUkUGVuZ2VsdWFyYW4uLlJ1cGlhaC4sIG5hLnJtID0gVFJVRSkKCiMgTWVuYW1waWxrYW4gaGFzaWwKcHJpbnQocGFzdGUoIlNpbXBhbmdhbiBCYWt1IChTeXN0ZW1hdGljKToiLCByb3VuZChzaWdtYV9zeXN0ZW1hdGljLCAyKSwgIlJ1cGlhaCIpKQoKYGBgCgoqKlNpbXBhbmdhbiBCYWt1IChTeXN0ZW1hdGljKTogMzcyMzIwLjIzIFJ1cGlhaCoqICAKClxbCk1vRSA9IDEuOTYgXHRpbWVzIFxmcmFjezM3MjMyMC4yM317XHNxcnR7MTAwfX0KXF0KClxbCk1vRSA9IDEuOTYgXHRpbWVzIFxmcmFjezM3MjMyMC4yM317MTB9ClxdCgpcWwpNb0UgPSAxLjk2IFx0aW1lcyAzNzIzMi4wMgpcXQoKXFsKTW9FID0gNzI5NzQuNzUKXF0KCkphZGksICoqTW9FID0gNzIsOTc0Ljc1IFJ1cGlhaCoqLiAgCgpQYWRhIG1ldG9kZSAqKlN5c3RlbWF0aWMgU2FtcGxpbmcqKiwgbWFoYXNpc3dhIGRpcGlsaWggZGVuZ2FuIGludGVydmFsIHRlcnRlbnR1IGRhcmkgZGFmdGFyIHBvcHVsYXNpLiBNb0UgeWFuZyBkaWhhc2lsa2FuIGFkYWxhaCAqKjcyLDk3NC43NSBSdXBpYWgqKiwgeWFuZyBoYW1waXIgc2V0YXJhIGRlbmdhbiBtZXRvZGUgc3RyYXRpZmlrYXNpLiBOYW11biwgbWV0b2RlIGluaSBtZW1pbGlraSBwb3RlbnNpIGJpYXMgamlrYSB0ZXJkYXBhdCBwb2xhIGJlcnVsYW5nIGRhbGFtIGRhZnRhciBtYWhhc2lzd2EgeWFuZyBkaWd1bmFrYW4gdW50dWsgcGVtaWxpaGFuIHNhbXBlbC4gIAoKIyMgMy40IENsdXN0ZXIgU2FtcGxpbmcgIApEaWtldGFodWk6ICAKCmBgYHtyIGVjaG89RkFMU0UsIG1hc3NlZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTWVuZ2FtYmlsIHNhbXBlbCBiZXJkYXNhcmthbiBjbHVzdGVyIChmYWt1bHRhcykKc2V0LnNlZWQoMzApCnNlbGVjdGVkX2NsdXN0ZXIgPC0gc2FtcGxlKHVuaXF1ZShkYXRhJEZha3VsdGFzKSwgMSkgIyBQaWxpaCBzYXR1IGNsdXN0ZXIKY2x1c3Rlcl9zYW1wbGUgPC0gZGF0YVtkYXRhJEZha3VsdGFzID09IHNlbGVjdGVkX2NsdXN0ZXIsIF0KCiMgTWVuZ2hpdHVuZyBzaW1wYW5nYW4gYmFrdQpzaWdtYV9jbHVzdGVyIDwtIHNkKGNsdXN0ZXJfc2FtcGxlJFBlbmdlbHVhcmFuLi5SdXBpYWguLCBuYS5ybSA9IFRSVUUpCgojIE1lbmFtcGlsa2FuIGhhc2lsCnByaW50KHBhc3RlKCJTaW1wYW5nYW4gQmFrdSAoQ2x1c3Rlcik6Iiwgcm91bmQoc2lnbWFfY2x1c3RlciwgMiksICJSdXBpYWgiKSkKCmBgYAoKKipTaW1wYW5nYW4gQmFrdSAoQ2x1c3Rlcik6IDQxOTA1NS40IFJ1cGlhaCoqICAKClxbCk1vRSA9IDEuOTYgXHRpbWVzIFxmcmFjezQxOTA1NS40fXtcc3FydHsxMDB9fQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgXGZyYWN7NDE5MDU1LjR9ezEwfQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgNDE5MDUuNTQKXF0KClxbCk1vRSA9IDgyMTMxLjg2ClxdCgpKYWRpLCAqKk1vRSA9IDgyLDEzMS44NiBSdXBpYWgqKi4gIAoKUGFkYSBtZXRvZGUgKipDbHVzdGVyIFNhbXBsaW5nKiosIHNhbXBlbCBkaXBpbGloIGJlcmRhc2Fya2FuIGZha3VsdGFzIHlhbmcgZGlwaWxpaCBzZWNhcmEgYWNhaywgbGFsdSBzZWx1cnVoIG1haGFzaXN3YSBkYWxhbSBmYWt1bHRhcyB0ZXJzZWJ1dCBkaWphZGlrYW4gc2FtcGVsLiBNb0UgdW50dWsgbWV0b2RlIGluaSBhZGFsYWggKio4MiwxMzEuODYgUnVwaWFoKiosIHlhbmcgbWVydXBha2FuIG5pbGFpIHRlcnRpbmdnaSBkaWJhbmRpbmdrYW4gbWV0b2RlIGxhaW5ueWEuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgKipDbHVzdGVyIFNhbXBsaW5nIGNlbmRlcnVuZyBtZW5naGFzaWxrYW4gZXN0aW1hc2kgeWFuZyBrdXJhbmcgYWt1cmF0IGRpYmFuZGluZ2thbiBtZXRvZGUgbGFpbioqLCB0ZXJ1dGFtYSBqaWthIGZha3VsdGFzIHlhbmcgdGVycGlsaWggbWVtaWxpa2kgcG9sYSBwZW5nZWx1YXJhbiB5YW5nIGJlcmJlZGEgZGFyaSBmYWt1bHRhcyBsYWlubnlhLgoKIyMgMy41IE11bHRpLVN0YWdlIFNhbXBsaW5nCkRpa2V0YWh1aToKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKCiMgTWVuZW50dWthbiBqdW1sYWggc2FtcGVsIHRhaGFwIHBlcnRhbWEgKG1pc2FsbnlhLCBtZW1pbGloIDUgZmFrdWx0YXMgc2VjYXJhIGFjYWspCnNldC5zZWVkKDMwKQpzZWxlY3RlZF9mYWN1bHRpZXMgPC0gc2FtcGxlKHVuaXF1ZShkYXRhJEZha3VsdGFzKSwgNSkKCiMgRmlsdGVyIGRhdGEgaGFueWEgdW50dWsgZmFrdWx0YXMgeWFuZyB0ZXJwaWxpaApkYXRhX3N0YWdlMSA8LSBkYXRhW2RhdGEkRmFrdWx0YXMgJWluJSBzZWxlY3RlZF9mYWN1bHRpZXMsIF0KCiMgTWVuZW50dWthbiBqdW1sYWggc2FtcGVsIHRhaGFwIGtlZHVhIChtaXNhbG55YSwgMjAgbWFoYXNpc3dhIGRhcmkgc2V0aWFwIGZha3VsdGFzKQpuX3Blcl9mYWN1bHR5IDwtIDIwICAKbXVsdGlzdGFnZV9zYW1wbGUgPC0gZGF0YV9zdGFnZTEgJT4lCiAgZ3JvdXBfYnkoRmFrdWx0YXMpICU+JQogIHNhbXBsZV9uKG5fcGVyX2ZhY3VsdHksIHJlcGxhY2UgPSBGQUxTRSkKCiMgTWVuZ2hpdHVuZyBzaW1wYW5nYW4gYmFrdQpzaWdtYV9tdWx0aXN0YWdlIDwtIHNkKG11bHRpc3RhZ2Vfc2FtcGxlJFBlbmdlbHVhcmFuLi5SdXBpYWguLCBuYS5ybSA9IFRSVUUpCgojIE1lbmFtcGlsa2FuIGhhc2lsCnByaW50KHBhc3RlKCJTaW1wYW5nYW4gQmFrdSAoTXVsdGlzdGFnZSBTYW1wbGluZyk6Iiwgcm91bmQoc2lnbWFfbXVsdGlzdGFnZSwgMiksICJSdXBpYWgiKSkKCmBgYAoKKipTaW1wYW5nYW4gQmFrdSAoTXVsdGlzdGFnZSBTYW1wbGluZyk6IDQyNTkwMi40IFJ1cGlhaCoqICAKClxbCk1vRSA9IDEuOTYgXHRpbWVzIFxmcmFjezQyNTkwMi40fXtcc3FydHsxMDB9fQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgXGZyYWN7NDI1OTAyLjR9ezEwfQpcXQoKXFsKTW9FID0gMS45NiBcdGltZXMgNDI1OTAuMjQKXF0KClxbCk1vRSA9IDgzNDc2Ljg3ClxdCgpKYWRpLCAqKk1vRSA9IDgzLDQ3Ni44NyBSdXBpYWgqKi4gIAoKUGFkYSBtZXRvZGUgKipNdWx0aS1TdGFnZSBTYW1wbGluZyoqLCBzYW1wZWwgZGlwaWxpaCBkYWxhbSBiZWJlcmFwYSB0YWhhcCwgbWlzYWxueWE6ICAKMS4gTWVtaWxpaCBmYWt1bHRhcyBzZWNhcmEgYWNhay4gIAoyLiBNZW1pbGloIG1haGFzaXN3YSBkYXJpIGZha3VsdGFzIHlhbmcgdGVycGlsaWguICAKCk1ldG9kZSBpbmkgbGViaWggZWZpc2llbiBkaWJhbmRpbmdrYW4gKipDbHVzdGVyIFNhbXBsaW5nKiosIGthcmVuYSBtZW11bmdraW5rYW4gcmVwcmVzZW50YXNpIHlhbmcgbGViaWggYmFpayBkZW5nYW4gbWVtYmFnaSBwcm9zZXMgcGVtaWxpaGFuIG1lbmphZGkgYmViZXJhcGEgdGFoYXAuICAKCkRlbmdhbiBNb0Ugc2ViZXNhciAqKjgzLDQ3Ni44NyBSdXBpYWgqKiwgbWV0b2RlIGluaSBtZW1pbGlraSB0aW5na2F0IGtldGVwYXRhbiB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gQ2x1c3RlciBTYW1wbGluZyB0ZXRhcGkgbWFzaWggbGViaWggYmVzYXIgZGliYW5kaW5na2FuICoqU3RyYXRpZmllZCBTYW1wbGluZyoqLiBBcnRpbnlhLCBoYXNpbCBlc3RpbWFzaSBtZW5nZ3VuYWthbiBtZXRvZGUgaW5pIGN1a3VwIGJhaWssIHRldGFwaSBtYXNpaCBtZW1pbGlraSB0aW5na2F0IGtlc2FsYWhhbiB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gbWV0b2RlIHN0cmF0aWZpa2FzaS4gIAoKLS0tCgojIDQuIEFuYWxpc2lzIEJpYXMgZGFsYW0gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nCgpOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgYWRhbGFoIG1ldG9kZSBwZW1pbGloYW4gc2FtcGVsIHlhbmcgdGlkYWsgbWVtYmVyaWthbiBwZWx1YW5nIHlhbmcgc2FtYSBiYWdpIHNldGlhcCBpbmRpdmlkdSBkYWxhbSBwb3B1bGFzaSB1bnR1ayB0ZXJwaWxpaC4gSGFsIGluaSBtZW55ZWJhYmthbiBiaWFzLCB5YWl0dSBwZXJiZWRhYW4gYW50YXJhIGhhc2lsIHNhbXBlbCBkYW4ga2VhZGFhbiBzZWJlbmFybnlhIGRhbGFtIHBvcHVsYXNpLiBEYWxhbSBzdHVkaSBpbmksIGthbWkgbWVuZ2d1bmFrYW4gYmVyYmFnYWkgbWV0b2RlIE5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyB1bnR1ayBtZW5nZXN0aW1hc2kgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLiBCZXJpa3V0IGFkYWxhaCBhbmFsaXNpcyBiaWFzIGRhbGFtIHNldGlhcCBtZXRvZGU6CiAgCiMjICoqNC4xIENvbnZlbmllbmNlIFNhbXBsaW5nKioKIAojIyMgKipNZXRvZGU6KioKIApDb252ZW5pZW5jZSBTYW1wbGluZyBkaWxha3VrYW4gZGVuZ2FuIG1lbmdhbWJpbCBzYW1wZWwgYmVyZGFzYXJrYW4ga2VtdWRhaGFuIGFrc2VzLiBEYWxhbSBzdHVkaSBpbmksIG1ldG9kZSBpbmkgZGlsYWt1a2FuIGRlbmdhbiBtZW5nYW1iaWwgMTAwIG1haGFzaXN3YSBwZXJ0YW1hIHlhbmcgYmVyc2VkaWEgbWVuZ2lzaSBzdXJ2ZWkgdGFucGEgbWVtcGVydGltYmFuZ2thbiBmYWt0b3IgbGFpbiBzZXBlcnRpIGZha3VsdGFzIGF0YXUgdGluZ2thdCBla29ub21pLgogCiMjIyAqKktldW5nZ3VsYW46KioKIAogCi0gKipDZXBhdCBkYW4gbXVkYWgqKiBrYXJlbmEgdGlkYWsgbWVtZXJsdWthbiBwcm9zZXMgc2VsZWtzaSB5YW5nIHJ1bWl0LgogCi0gKipCaWF5YSByZW5kYWgqKiBrYXJlbmEgdGlkYWsgbWVtZXJsdWthbiB1c2FoYSBla3N0cmEgdW50dWsgbWVuY2FyaSByZXNwb25kZW4uCiAKLSAqKkJlcmd1bmEgdW50dWsgZWtzcGxvcmFzaSBhd2FsKiogc2ViZWx1bSBwZW5lbGl0aWFuIHlhbmcgbGViaWggbWVuZGFsYW0gZGlsYWt1a2FuLgogCgogCiMjIyAqKktlbGVtYWhhbjoqKgogCiAKLSAqKlNhbmdhdCBiaWFzKiosIGthcmVuYSBoYW55YSBtYWhhc2lzd2EgeWFuZyBtdWRhaCBkaWFrc2VzIHlhbmcgbWFzdWsgZGFsYW0gc2FtcGVsLgogCi0gKipUaWRhayByZXByZXNlbnRhdGlmKiosIGthcmVuYSBiaXNhIGphZGkgaGFueWEgbWFoYXNpc3dhIGRhcmkgZmFrdWx0YXMgdGVydGVudHUgeWFuZyBsZWJpaCBiYW55YWsgdGVybGliYXQuCiAKLSAqKlRpZGFrIGNvY29rIHVudHVrIGFuYWxpc2lzIHN0YXRpc3RpayoqLCBrYXJlbmEgaGFzaWxueWEgdGlkYWsgbWVuY2VybWlua2FuIHBvcHVsYXNpIG1haGFzaXN3YSBzZWNhcmEga2VzZWx1cnVoYW4uCiAKCiAKIyMjICoqQ29udG9oIEJpYXMgZGFsYW0gU3R1ZGkgSW5pOioqCiAKSmlrYSBraXRhIG1lbmdhbWJpbCAxMDAgbWFoYXNpc3dhIHBlcnRhbWEgeWFuZyBtZW5naXNpIHN1cnZlaSBkaSBrYW50aW4ga2FtcHVzLCBrZW11bmdraW5hbiBiZXNhciBtZXJla2EgYWRhbGFoIG1haGFzaXN3YSB5YW5nIHNlcmluZyBtYWthbiBkaSBrYW50aW4uIE1haGFzaXN3YSB5YW5nIGxlYmloIHNlcmluZyBtZW1hc2FrIHNlbmRpcmkgZGkga29zIGF0YXUgbWVuY2FyaSBtYWthbmFuIGRpIGx1YXIga2FtcHVzIHRpZGFrIHRlcndha2lsaSBkYWxhbSBzYW1wZWwgaW5pLiBBa2liYXRueWEsIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiB5YW5nIGRpcGVyb2xlaCBkYXJpIHNhbXBlbCBtdW5na2luIGxlYmloIHRpbmdnaSBkYXJpcGFkYSByYXRhLXJhdGEgc2ViZW5hcm55YSBkaSBwb3B1bGFzaS4KICAKIyMgKio0LjIgUHVycG9zaXZlIFNhbXBsaW5nKioKIAojIyMgKipNZXRvZGU6KioKIApQdXJwb3NpdmUgU2FtcGxpbmcgbWVtaWxpaCByZXNwb25kZW4gYmVyZGFzYXJrYW4ga3JpdGVyaWEgdGVydGVudHUgeWFuZyBkaWFuZ2dhcCByZWxldmFuIGRlbmdhbiBwZW5lbGl0aWFuLiBEYWxhbSBzdHVkaSBpbmksIGtpdGEgbWVtaWxpaCBtYWhhc2lzd2EgeWFuZyBtZW5naGFiaXNrYW4gbGViaWggZGFyaSBScDIuMDAwLjAwMCBwZXIgYnVsYW4gdW50dWsgbWFrYW4uCiAKIyMjICoqS2V1bmdndWxhbjoqKgogCiAKLSAqKkZva3VzIHBhZGEga2Vsb21wb2sgdGVydGVudHUqKiwgbWlzYWxueWEgbWFoYXNpc3dhIHlhbmcgbWVtaWxpa2kga2ViaWFzYWFuIG1ha2FuIG1haGFsLgogCi0gKipCaXNhIG1lbWJlcmlrYW4gd2F3YXNhbiBsZWJpaCBkYWxhbSoqLCB0ZXJ1dGFtYSBqaWthIHBlbmVsaXRpYW4gaW5naW4gbWVuZWxpdGkgcG9sYSBwZW5nZWx1YXJhbiBrZWxvbXBvayB0ZXJ0ZW50dS4KIAotICoqQmVyZ3VuYSB1bnR1ayBzdHVkaSBraHVzdXMqKiwgc2VwZXJ0aSBwZW5lbGl0aWFuIHRlbnRhbmcgbWFoYXNpc3dhIHlhbmcgc2VyaW5nIG1ha2FuIGRpIHJlc3RvcmFuIG1haGFsLgogCgogCiMjIyAqKktlbGVtYWhhbjoqKgogCiAKLSAqKlRpZGFrIHJlcHJlc2VudGF0aWYqKiwga2FyZW5hIGhhbnlhIG1lbmVsaXRpIGtlbG9tcG9rIHRlcnRlbnR1LCBidWthbiBzZWx1cnVoIG1haGFzaXN3YS4KIAotICoqUmVudGFuIGJpYXMgc2VsZWtzaSoqLCBrYXJlbmEgcGVuZWxpdGkgbWVuZW50dWthbiBzYW1wZWwgYmVyZGFzYXJrYW4gYXN1bXNpIHRlcnRlbnR1LgogCi0gKipUaWRhayBiaXNhIGRpZ3VuYWthbiB1bnR1ayBnZW5lcmFsaXNhc2kqKiwga2FyZW5hIGhhc2lsbnlhIGhhbnlhIGJlcmxha3UgdW50dWsga2Vsb21wb2sgeWFuZyBkaXBpbGloLgogCgogCiMjIyAqKkNvbnRvaCBCaWFzIGRhbGFtIFN0dWRpIEluaToqKgogCkppa2Ega2l0YSBoYW55YSBtZW1pbGloIG1haGFzaXN3YSB5YW5nIG1lbmdoYWJpc2thbiBsZWJpaCBkYXJpIFJwMi4wMDAuMDAwIHBlciBidWxhbiB1bnR1ayBtYWthbiwgbWFrYSByYXRhLXJhdGEgcGVuZ2VsdWFyYW4geWFuZyBraXRhIGRhcGF0a2FuIHBhc3RpIGphdWggbGViaWggdGluZ2dpIGRhcmlwYWRhIHJhdGEtcmF0YSBzZWJlbmFybnlhLiBIYWwgaW5pIGFrYW4gbWVtYmVyaWthbiBnYW1iYXJhbiB5YW5nIGtlbGlydSB0ZW50YW5nIGtlYmlhc2FhbiBtYWthbiBtYWhhc2lzd2Egc2VjYXJhIHVtdW0uCiAgCiMjICoqNC4zIFNub3diYWxsIFNhbXBsaW5nKioKIAojIyMgKipNZXRvZGU6KioKIApTbm93YmFsbCBTYW1wbGluZyBkaWxha3VrYW4gZGVuZ2FuIG1lbWludGEgcmVzcG9uZGVuIGF3YWwgbWVyZWtvbWVuZGFzaWthbiB0ZW1hbiBtZXJla2EgeWFuZyBtZW1pbGlraSBrYXJha3RlcmlzdGlrIHNlcnVwYS4gRGFsYW0gc3R1ZGkgaW5pLCBrYW1pIG1lbWludGEgbWFoYXNpc3dhIHlhbmcgc2VyaW5nIG1ha2FuIGRpIHJlc3RvcmFuIG1haGFsIHVudHVrIG1lcmVrb21lbmRhc2lrYW4gdGVtYW4tdGVtYW4gbWVyZWthIHlhbmcganVnYSBtZW1pbGlraSBrZWJpYXNhYW4gc2VydXBhLgogCiMjIyAqKktldW5nZ3VsYW46KioKIAogCi0gKipCZXJtYW5mYWF0IHVudHVrIG1lbmphbmdrYXUga2Vsb21wb2sgdGVydGVudHUqKiwgbWlzYWxueWEgbWFoYXNpc3dhIGRhcmkga2VsdWFyZ2Ega2F5YS4KIAotICoqRWZla3RpZiBkYWxhbSBwZW5lbGl0aWFuIGt1YWxpdGF0aWYqKiwga2FyZW5hIG1lbWJlcmlrYW4gd2F3YXNhbiB0ZW50YW5nIGtlbG9tcG9rIHlhbmcgc3VsaXQgZGlpZGVudGlmaWthc2kgbWVsYWx1aSBtZXRvZGUgbGFpbi4KIAotICoqTWVuZ2hlbWF0IHdha3R1IGRhbiBzdW1iZXIgZGF5YSoqLCBrYXJlbmEgcmVzcG9uZGVuIG1lbWJhbnR1IG1lcmVrcnV0IHNhbXBlbCB0YW1iYWhhbi4KIAoKIAojIyMgKipLZWxlbWFoYW46KioKIAogCi0gKipCaWFzIHNvc2lhbCB0aW5nZ2kqKiwga2FyZW5hIHNhbXBlbCBjZW5kZXJ1bmcgYmVyYXNhbCBkYXJpIGtlbG9tcG9rIGRlbmdhbiBrYXJha3RlcmlzdGlrIHNlcnVwYS4KIAotICoqVGlkYWsgcmVwcmVzZW50YXRpZioqLCBrYXJlbmEgaGFueWEgbWVuY2VybWlua2FuIGphcmluZ2FuIHNvc2lhbCB0ZXJ0ZW50dS4KIAotICoqU3VsaXQgZGlrb250cm9sKiosIGthcmVuYSBwZW5lbGl0aSB0aWRhayBtZW1pbGlraSBrZW5kYWxpIHBlbnVoIGF0YXMgc2lhcGEgeWFuZyBkaXJla29tZW5kYXNpa2FuLgogCgogCiMjIyAqKkNvbnRvaCBCaWFzIGRhbGFtIFN0dWRpIEluaToqKgogCkppa2Egc2VvcmFuZyBtYWhhc2lzd2EgeWFuZyBzZXJpbmcgbWFrYW4gZGkgcmVzdG9yYW4gbWFoYWwgbWVyZWtvbWVuZGFzaWthbiB0ZW1hbi10ZW1hbm55YSB5YW5nIGp1Z2EgbWVtaWxpa2kga2ViaWFzYWFuIG1ha2FuIG1haGFsLCBtYWthIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiB5YW5nIGRpcGVyb2xlaCBkYWxhbSBzdHVkaSBpbmkgYWthbiBsZWJpaCB0aW5nZ2kgZGFyaSBrZW55YXRhYW4uIEhhbCBpbmkgbWVuY2lwdGFrYW4gaWx1c2kgYmFod2Egc2ViYWdpYW4gYmVzYXIgbWFoYXNpc3dhIG1lbmdoYWJpc2thbiB1YW5nIGRhbGFtIGp1bWxhaCBiZXNhciB1bnR1ayBtYWthbiwgcGFkYWhhbCB0aWRhayBkZW1pa2lhbi4KICAKIyMgKio0LjQgUXVvdGEgU2FtcGxpbmcqKgogCiMjIyAqKk1ldG9kZToqKgogClF1b3RhIFNhbXBsaW5nIGRpbGFrdWthbiBkZW5nYW4gbWVuZXRhcGthbiBrdW90YSB1bnR1ayBrZWxvbXBvayB0ZXJ0ZW50dSwgbWlzYWxueWEgbWVtaWxpaCA1MCBtYWhhc2lzd2EgZGFyaSBGYWt1bHRhcyBFa29ub21pIGRhbiA1MCBtYWhhc2lzd2EgZGFyaSBGYWt1bHRhcyBUZWtuaWsuIE5hbXVuLCBkYWxhbSBwZW1pbGloYW4gaW5kaXZpZHUgZGFsYW0gc2V0aWFwIGtlbG9tcG9rLCB0aWRhayBhZGEgcGVtaWxpaGFuIGFjYWsuCiAKIyMjICoqS2V1bmdndWxhbjoqKgogCiAKLSAqKkxlYmloIHJlcHJlc2VudGF0aWYgZGliYW5kaW5na2FuIG1ldG9kZSBOb24tUHJvYmFiaWxpdHkgbGFpbm55YSoqLCBrYXJlbmEgbWVtYXN0aWthbiBzZXRpYXAga2Vsb21wb2sgbWVuZGFwYXRrYW4gcGVyd2FraWxhbi4KIAotICoqQ2VwYXQgZGFuIGVmaXNpZW4qKiwga2FyZW5hIHRpZGFrIG1lbWVybHVrYW4gcGVtaWxpaGFuIGFjYWsgZGFsYW0gc2V0aWFwIGt1b3RhLgogCi0gKipDb2NvayB1bnR1ayBzaXR1YXNpIGRpIG1hbmEgZGF0YSBwb3B1bGFzaSB0ZXJiYXRhcyoqLCBrYXJlbmEgdGlkYWsgbWVtYnV0dWhrYW4gZGFmdGFyIGxlbmdrYXAgc2VsdXJ1aCBtYWhhc2lzd2EuCiAKCiAKIyMjICoqS2VsZW1haGFuOioqCiAKIAotICoqQmlhcyBzZWxla3NpIG1hc2loIGJpc2EgdGVyamFkaSoqLCBrYXJlbmEgbWFoYXNpc3dhIGRhbGFtIHNldGlhcCBrdW90YSBkaXBpbGloIGJlcmRhc2Fya2FuIGtlbXVkYWhhbiBha3Nlcy4KIAotICoqVGlkYWsgc2VwZW51aG55YSBhY2FrKiosIHNlaGluZ2dhIGhhc2lsIHRldGFwIHRpZGFrIGJpc2EgZGlnZW5lcmFsaXNhc2kgc2VjYXJhIHNlbXB1cm5hLgogCi0gKipLdXJhbmcgYWt1cmF0IGRpYmFuZGluZ2thbiBTdHJhdGlmaWVkIFNhbXBsaW5nKiosIHlhbmcgbWVuZ2d1bmFrYW4gcGVtaWxpaGFuIGFjYWsgZGFsYW0gc2V0aWFwIGtlbG9tcG9rLgogCgogCiMjIyAqKkNvbnRvaCBCaWFzIGRhbGFtIFN0dWRpIEluaToqKgogCk1pc2FsbnlhLCBraXRhIG1lbmV0YXBrYW4ga3VvdGEgNTAgbWFoYXNpc3dhIGRhcmkgRmFrdWx0YXMgRWtvbm9taSBkYW4gNTAgZGFyaSBGYWt1bHRhcyBUZWtuaWssIHRldGFwaSBoYW55YSBtZW1pbGloIG1haGFzaXN3YSB5YW5nIG1ha2FuIGRpIGthbnRpbiBrYW1wdXMuIEhhc2lsbnlhIGJpc2EgbWVudW5qdWtrYW4gYmFod2EgcmF0YS1yYXRhIHBlbmdlbHVhcmFuIG1haGFzaXN3YSBUZWtuaWsgZGFuIEVrb25vbWkgaGFtcGlyIHNhbWEuIFBhZGFoYWwsIGppa2Ega2l0YSBtZW1wZXJ0aW1iYW5na2FuIG1haGFzaXN3YSB5YW5nIG1ha2FuIGRpIGx1YXIga2FtcHVzIGF0YXUgbWVtYXNhayBzZW5kaXJpLCBiaXNhIGphZGkgYWRhIHBlcmJlZGFhbiBwZW5nZWx1YXJhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlZHVhIGZha3VsdGFzLgoKLS0tCgojIDUuIFBlcmJhbmRpbmdhbiBIYXNpbCBkYXJpIEJlcmJhZ2FpIE1ldG9kZSBTYW1wbGluZwoKRGFsYW0gcGVuZWxpdGlhbiBpbmksIGthbWkgdGVsYWggbWVuZ2d1bmFrYW4gYmVyYmFnYWkgbWV0b2RlIHNhbXBsaW5nLCBiYWlrICoqUHJvYmFiaWxpdHkgU2FtcGxpbmcqKiBtYXVwdW4gKipOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcqKiwgdW50dWsgbWVuZ2FuYWxpc2lzIHBlbmdlbHVhcmFuIG1ha2FuIG1haGFzaXN3YS4gTWFzaW5nLW1hc2luZyBtZXRvZGUgbWVtaWxpa2kga2FyYWt0ZXJpc3Rpaywga2V1bmdndWxhbiwga2VsZW1haGFuLCBzZXJ0YSB0aW5na2F0IGJpYXMgZGFuIG1hcmdpbiBvZiBlcnJvciB5YW5nIGJlcmJlZGEuIFVudHVrIG1lbWFoYW1pIGVmZWt0aXZpdGFzIG1hc2luZy1tYXNpbmcgbWV0b2RlLCBkaWxha3VrYW4gYW5hbGlzaXMgbWVuZGFsYW0gYmVyZGFzYXJrYW4gKiptYXJnaW4gb2YgZXJyb3IsIGJpYXMsIGRhbiB0aW5na2F0IHJlcHJlc2VudGF0aXZpdGFzIHRlcmhhZGFwIHBvcHVsYXNpIG1haGFzaXN3YSoqLgoKIyMgNS4xIFBlcmJhbmRpbmdhbiBQcm9iYWJpbGl0eSBTYW1wbGluZyB2cyBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcKClNhbXBlbCB5YW5nIGRpYW1iaWwgbWVuZ2d1bmFrYW4gKipQcm9iYWJpbGl0eSBTYW1wbGluZyoqIG1lbWlsaWtpIHBlbHVhbmcgbGViaWggdGluZ2dpIHVudHVrIG1lbmdoYXNpbGthbiBkYXRhIHlhbmcgcmVwcmVzZW50YXRpZiBtZW5nZW5haSBwZW5nZWx1YXJhbiBtYWthbiBtYWhhc2lzd2EgZGliYW5kaW5na2FuIGRlbmdhbiAqKk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyoqLiBIYWwgaW5pIGthcmVuYSBQcm9iYWJpbGl0eSBTYW1wbGluZyBtZW11bmdraW5rYW4gc2V0aWFwIG1haGFzaXN3YSBkYWxhbSBwb3B1bGFzaSBtZW1pbGlraSBwZWx1YW5nIHlhbmcgc2FtYSB1bnR1ayBkaXBpbGloLCBzZWRhbmdrYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nIGNlbmRlcnVuZyBiZXJnYW50dW5nIHBhZGEgZmFrdG9yIGtlbXVkYWhhbiBkYW4gc3ViamVrdGl2aXRhcyBkYWxhbSBwZW1pbGloYW4gc2FtcGVsLgoKfCAqKkFzcGVrKiogICAgICAgICAgICAgICAgICB8ICoqUHJvYmFiaWxpdHkgU2FtcGxpbmcqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8ICoqRGVmaW5pc2kqKiAgICAgICAgICAgICAgIHwgTWV0b2RlIHNhbXBsaW5nIHlhbmcgbWVtYXN0aWthbiBzZXRpYXAgZWxlbWVuIGRhbGFtIHBvcHVsYXNpIG1lbWlsaWtpIHBlbHVhbmcgeWFuZyBzYW1hIHVudHVrIGRpcGlsaWguIHwgTWV0b2RlIHNhbXBsaW5nIHlhbmcgdGlkYWsgbWVtYmVyaWthbiBzZXRpYXAgZWxlbWVuIHBlbHVhbmcgeWFuZyBzYW1hIHVudHVrIGRpcGlsaWguIHwKfCAqKkNvbnRvaCBNZXRvZGUqKiAgICAgICAgICB8IFNpbXBsZSBSYW5kb20sIFN0cmF0aWZpZWQsIFN5c3RlbWF0aWMsIENsdXN0ZXIsIE11bHRpLVN0YWdlICB8IENvbnZlbmllbmNlLCBQdXJwb3NpdmUsIFNub3diYWxsLCBRdW90YSAgICAgICAgICAgICAgICAgIHwKfCAqKktlYWNha2FuKiogICAgICAgICAgICAgICB8IFBlbWlsaWhhbiBzYW1wZWwgZGlsYWt1a2FuIHNlY2FyYSBhY2FrICAgICAgICAgICAgICAgICAgICAgICB8IFBlbWlsaWhhbiBzYW1wZWwgc2VyaW5nIGJlcmRhc2Fya2FuIGFrc2VzaWJpbGl0YXMgYXRhdSBrYXJha3RlcmlzdGlrIHRlcnRlbnR1IHwKfCAqKk1hcmdpbiBvZiBFcnJvciAoTW9FKSoqICB8IERhcGF0IGRpaGl0dW5nIGRlbmdhbiBwcmVzaXNpIGRhbiBjZW5kZXJ1bmcgbGViaWgga2VjaWwgICAgIHwgU3VsaXQgZGloaXR1bmcga2FyZW5hIHRpZGFrIGFkYSBhdHVyYW4gcGVuZ2FtYmlsYW4gc2FtcGVsIHlhbmcgc2lzdGVtYXRpcyB8CnwgKipCaWFzKiogICAgICAgICAgICAgICAgICAgfCBSZWxhdGlmIHJlbmRhaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRpbmdnaSwga2FyZW5hIHBlbWlsaWhhbiB0aWRhayBkaWxha3VrYW4gc2VjYXJhIGFjYWsgfAp8ICoqS2VtdWRhaGFuIFBlbGFrc2FuYWFuKiogIHwgTWVtZXJsdWthbiBwZXJlbmNhbmFhbiBsZWJpaCBtYXRhbmcgZGFuIHN1bWJlciBkYXlhIGxlYmloIGJlc2FyIHwgTGViaWggbXVkYWgsIGNlcGF0LCBkYW4gbXVyYWggZGlsYWt1a2FuIHwKfCAqKlJlcHJlc2VudGFzaSBQb3B1bGFzaSoqICB8IEhhc2lsIGxlYmloIHJlcHJlc2VudGF0aWYgZGFuIGRhcGF0IGRpZ2VuZXJhbGlzYXNpICAgICAgICAgIHwgS3VyYW5nIHJlcHJlc2VudGF0aWYga2FyZW5hIHRpZGFrIHNlbXVhIGluZGl2aWR1IG1lbWlsaWtpIGtlc2VtcGF0YW4geWFuZyBzYW1hIHVudHVrIGRpcGlsaWggfAoKRGFyaSB0YWJlbCBpbmksIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhICoqUHJvYmFiaWxpdHkgU2FtcGxpbmcgbGViaWggdW5nZ3VsIGRhbGFtIGhhbCBha3VyYXNpIGRhbiByZXByZXNlbnRhdGl2aXRhcyoqIGRhbGFtIGtvbnRla3MgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLiBOYW11biwgKipOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgbGViaWggbXVkYWggZGFuIGNlcGF0IGRpZ3VuYWthbioqLCB0ZXJ1dGFtYSBkYWxhbSBrb25kaXNpIGRpIG1hbmEgc3VtYmVyIGRheWEgdGVyYmF0YXMuCgojIyA1LjIgUGVyYmFuZGluZ2FuIEhhc2lsIGRhcmkgQmVyYmFnYWkgTWV0b2RlIFByb2JhYmlsaXR5IFNhbXBsaW5nCgpVbnR1ayBtZW5nZXRhaHVpIG1ldG9kZSBQcm9iYWJpbGl0eSBTYW1wbGluZyBtYW5hIHlhbmcgcGFsaW5nIGFrdXJhdCBkYWxhbSBtZW5nZXN0aW1hc2kgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLCBkaWxha3VrYW4gcGVyaGl0dW5nYW4gKiptYXJnaW4gb2YgZXJyb3IgKE1vRSkqKiB1bnR1ayBzZXRpYXAgbWV0b2RlLiBCZXJpa3V0IGFkYWxhaCBoYXNpbCBwZXJiYW5kaW5nYW4gZGFyaSBtYXNpbmctbWFzaW5nIG1ldG9kZToKCnwgKipNZXRvZGUgU2FtcGxpbmcqKiAgICAgICAgICAgfCAqKkNhcmEgS2VyamEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqTWFyZ2luIG9mIEVycm9yIChNb0UpKiogfCAqKktldW5nZ3VsYW4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipLZWxlbWFoYW4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8ICoqU2ltcGxlIFJhbmRvbSBTYW1wbGluZyAoU1JTKSoqIHwgTWVtaWxpaCBzYW1wZWwgc2VjYXJhIGFjYWsgZGFyaSBzZWx1cnVoIHBvcHVsYXNpIG1haGFzaXN3YSB8ICoqNzAsMDk5LjQ3IFJ1cGlhaCoqICAgICAgfCBUaWRhayBhZGEgYmlhcyBkYWxhbSBwZW1pbGloYW4gICAgICAgICAgICAgICAgICAgfCBUaWRhayBtZW1wZXJ0aW1iYW5na2FuIHBlcmJlZGFhbiBwb2xhIHBlbmdlbHVhcmFuIGFudGFyIGtlbG9tcG9rIG1haGFzaXN3YSAgIHwKfCAqKlN0cmF0aWZpZWQgU2FtcGxpbmcqKiAgICAgICAgfCBQb3B1bGFzaSBtYWhhc2lzd2EgZGliYWdpIGRhbGFtIGtlbG9tcG9rIGJlcmRhc2Fya2FuIGZha3VsdGFzLCBsYWx1IGRpYW1iaWwgc2FtcGVsIHNlY2FyYSBwcm9wb3JzaW9uYWwgfCAqKjc3LDQ3OC45OCBSdXBpYWgqKiAgICAgIHwgUmVwcmVzZW50YXNpIGxlYmloIGJhaWsgdW50dWsgc2VtdWEgZmFrdWx0YXMgICAgfCBNZW1lcmx1a2FuIGluZm9ybWFzaSB0YW1iYWhhbiB0ZW50YW5nIHBvcHVsYXNpICAgfAp8ICoqU3lzdGVtYXRpYyBTYW1wbGluZyoqICAgICAgICB8IE1lbWlsaWggc2FtcGVsIGJlcmRhc2Fya2FuIHBvbGEgc2lzdGVtYXRpcyAobWlzYWwgc2V0aWFwIG1haGFzaXN3YSBrZS0zKSB8ICoqNzIsOTc0Ljc1IFJ1cGlhaCoqICAgICAgfCBEaXN0cmlidXNpIHNhbXBlbCBsZWJpaCBtZXJhdGEgICAgICAgICAgICAgICAgICAgfCBCaXNhIGJpYXMgamlrYSBhZGEgcG9sYSBkYWxhbSBkYXRhIHBvcHVsYXNpICAgICAgfAp8ICoqQ2x1c3RlciBTYW1wbGluZyoqICAgICAgICAgICB8IE1lbWlsaWggYmViZXJhcGEgZmFrdWx0YXMsIGxhbHUgbWVuZ2FtYmlsIHNlbXVhIGFuZ2dvdGEgZGFsYW0gZmFrdWx0YXMgdGVyc2VidXQgfCAqKjgyLDEzMS44NiBSdXBpYWgqKiAgICAgIHwgTGViaWggZWZpc2llbiBqaWthIHBvcHVsYXNpIG1haGFzaXN3YSBsdWFzIGRhbiB0ZXJzZWJhciAgIHwgQmlzYSBtZW55ZWJhYmthbiBiaWFzIGppa2EgZmFrdWx0YXMgeWFuZyBkaXBpbGloIHRpZGFrIG1ld2FraWxpIHBvcHVsYXNpIHNlY2FyYSBrZXNlbHVydWhhbiB8CnwgKipNdWx0aS1TdGFnZSBTYW1wbGluZyoqICAgICAgIHwgTWVtaWxpaCBiZWJlcmFwYSBmYWt1bHRhcyBzZWNhcmEgYWNhaywgbGFsdSBtZW5nYW1iaWwgc2FtcGVsIGRhcmkgbWFoYXNpc3dhIGRhbGFtIGZha3VsdGFzIHlhbmcgdGVycGlsaWggfCAqKjgzLDQ3Ni44NyBSdXAgaWFoKiogICAgICB8IEVmaXNpZW4gdW50dWsgcG9wdWxhc2kgYmVzYXIgZGFuIHRlcnNlYmFyICAgICAgIHwgTWVtZXJsdWthbiBiZWJlcmFwYSB0YWhhcCBwZW1pbGloYW4sIGJpc2EgbWVuYW1iYWgga29tcGxla3NpdGFzIHwKCiMjIyBBbmFsaXNpcwoxLiAqKlNpbXBsZSBSYW5kb20gU2FtcGxpbmcgKFNSUykqKiBtZW1pbGlraSBtYXJnaW4gb2YgZXJyb3IgdGVya2VjaWwgKDcwLDA5OS40NyBSdXBpYWgpLCBtZW5qYWRpa2FubnlhIG1ldG9kZSB5YW5nIHBhbGluZyBha3VyYXQgZGFsYW0gbWVuZ2dhbWJhcmthbiBwZW5nZWx1YXJhbiBtYWthbiBtYWhhc2lzd2EuIERlbmdhbiBwZW1pbGloYW4gYWNhaywgbWV0b2RlIGluaSBtYW1wdSBtZW1iZXJpa2FuIGVzdGltYXNpIHlhbmcgcmVwcmVzZW50YXRpZiB0YW5wYSBiaWFzIHlhbmcgc2lnbmlmaWthbi4KMi4gKipTeXN0ZW1hdGljIFNhbXBsaW5nKiogbWVudW5qdWtrYW4gbWFyZ2luIG9mIGVycm9yIHlhbmcgc2VkaWtpdCBsZWJpaCBiZXNhciAoNzIsOTc0Ljc1IFJ1cGlhaCksIHRldGFwaSB0ZXRhcCBtZW1iZXJpa2FuIGhhc2lsIHlhbmcgYmFpayBqaWthIHBvcHVsYXNpIGRpdXJ1dGthbiBkZW5nYW4gY2FyYSB5YW5nIHRpZGFrIGJpYXMuCjMuICoqU3RyYXRpZmllZCBTYW1wbGluZyoqIG1lbWlsaWtpIG1hcmdpbiBvZiBlcnJvciAoNzcsNDc4Ljk4IFJ1cGlhaCkgeWFuZyBsZWJpaCBiZXNhciBkaWJhbmRpbmdrYW4gU1JTLCBtZXNraXB1biBtZXRvZGUgaW5pIGVmZWt0aWYgZGFsYW0gbWVuYW5na2FwIHZhcmlhc2kgYW50YXIga2Vsb21wb2suCjQuICoqQ2x1c3RlciBTYW1wbGluZyoqIGRhbiAqKk11bHRpLVN0YWdlIFNhbXBsaW5nKiogbWVtaWxpa2kgbWFyZ2luIG9mIGVycm9yIHlhbmcgbGViaWggdGluZ2dpICg4MiwxMzEuODYgUnVwaWFoIGRhbiA4Myw0NzYuODcgUnVwaWFoKSwgbWVudW5qdWtrYW4gYmFod2EgbWV0b2RlIGluaSBsZWJpaCByZW50YW4gdGVyaGFkYXAgYmlhcyBqaWthIGZha3VsdGFzIHlhbmcgZGlwaWxpaCB0aWRhayByZXByZXNlbnRhdGlmLgoKIyMgNS4zIFBlcmJhbmRpbmdhbiBIYXNpbCBkYXJpIEJlcmJhZ2FpIE1ldG9kZSBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcKCk5vbi1Qcm9iYWJpbGl0eSBTYW1wbGluZyBsZWJpaCBiYW55YWsgZGlndW5ha2FuIGRhbGFtIHBlbmVsaXRpYW4gZWtzcGxvcmF0aWYgYXRhdSBrZXRpa2EgKipQcm9iYWJpbGl0eSBTYW1wbGluZyB0aWRhayBkYXBhdCBkaXRlcmFwa2FuKioga2FyZW5hIGtldGVyYmF0YXNhbiB3YWt0dSwgYmlheWEsIGF0YXUgYWtzZXMga2UgcG9wdWxhc2kgbWFoYXNpc3dhLiBOYW11biwgbWV0b2RlIGluaSBjZW5kZXJ1bmcgbWVtaWxpa2kgdGluZ2thdCBiaWFzIHlhbmcgbGViaWggdGluZ2dpLgoKfCAqKk1ldG9kZSBTYW1wbGluZyoqICAgICAgICB8ICoqQ2FyYSBLZXJqYSoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqQmlhcyoqICAgICAgICAgIHwgKipLZXVuZ2d1bGFuKiogICAgICAgICAgICAgICAgICAgICAgICAgfCAqKktlbGVtYWhhbioqICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgKipDb252ZW5pZW5jZSBTYW1wbGluZyoqICAgfCBNZW1pbGloIHNhbXBlbCB5YW5nIHBhbGluZyBtdWRhaCBkaWFrc2VzICAgICAgICAgICAgICAgfCAqKlRpbmdnaSoqICAgICAgICB8IENlcGF0IGRhbiBtdWRhaCBkaWxha3VrYW4gICAgICAgICAgICAgfCBUaWRhayByZXByZXNlbnRhdGlmLCBoYW55YSBtZXdha2lsaSBrZWxvbXBvayB0ZXJ0ZW50dSB8CnwgKipQdXJwb3NpdmUgU2FtcGxpbmcqKiAgICAgfCBNZW1pbGloIHNhbXBlbCBiZXJkYXNhcmthbiBrYXJha3RlcmlzdGlrIHRlcnRlbnR1ICAgICAgfCAqKlRpbmdnaSoqICAgICAgICB8IEJpc2EgZm9rdXMgcGFkYSBrZWxvbXBvayBzcGVzaWZpayAgICAgfCBUaWRhayBiaXNhIGRpZ2VuZXJhbGlzYXNpIGtlIHBvcHVsYXNpIGx1YXMgfAp8ICoqU25vd2JhbGwgU2FtcGxpbmcqKiAgICAgIHwgUmVzcG9uZGVuIHBlcnRhbWEgbWVyZWtydXQgcmVzcG9uZGVuIGxhaW4gICAgICAgICAgICAgfCAqKlNhbmdhdCBUaW5nZ2kqKiB8IEJlcmd1bmEgdW50dWsgcG9wdWxhc2kgeWFuZyBzdWxpdCBkaXRlbXVrYW4gfCBCaWFzIHRpbmdnaSBrYXJlbmEgcmVzcG9uZGVuIHNhbGluZyBtZXJla29tZW5kYXNpa2FuIHRlbWFuIGRlbmdhbiBrYXJha3RlcmlzdGlrIHlhbmcgc2FtYSB8CnwgKipRdW90YSBTYW1wbGluZyoqICAgICAgICAgfCBNZW1pbGloIHNhbXBlbCBoaW5nZ2Ega3VvdGEgdGVydGVudHUgdGVycGVudWhpICAgICAgICB8ICoqVGluZ2dpKiogICAgICAgIHwgTWVtYXN0aWthbiByZXByZXNlbnRhc2kgcHJvcG9yc2lvbmFsIHwgVGlkYWsgYWNhaywgYmlzYSBtZW55ZWJhYmthbiBiaWFzIGRhbGFtIHNlbGVrc2kgfAoKIyMjIEFuYWxpc2lzCjEuICoqU25vd2JhbGwgU2FtcGxpbmcqKiBtZW1pbGlraSB0aW5na2F0IGJpYXMgdGVydGluZ2dpIGthcmVuYSByZXNwb25kZW4gY2VuZGVydW5nIG1lcmVrcnV0IGluZGl2aWR1IHlhbmcgbWVtaWxpa2kga2FyYWt0ZXJpc3RpayBzZXJ1cGEsIHNlaGluZ2dhIHRpZGFrIG1lbmNlcm1pbmthbiB2YXJpYXNpIHBlbmdlbHVhcmFuIG1ha2FuIG1haGFzaXN3YSBzZWNhcmEga2VzZWx1cnVoYW4uCjIuICoqQ29udmVuaWVuY2UgU2FtcGxpbmcqKiBqdWdhIHNhbmdhdCBiaWFzIGthcmVuYSBoYW55YSBtZW5nYW5kYWxrYW4gaW5kaXZpZHUgeWFuZyBtdWRhaCBkaWFrc2VzLCBzZXBlcnRpIG1haGFzaXN3YSB5YW5nIHNlcmluZyBiZXJhZGEgZGkga2FudGluLCBzZWhpbmdnYSB0aWRhayBtZW5jZXJtaW5rYW4gcG9wdWxhc2kgbWFoYXNpc3dhIHNlY2FyYSBrZXNlbHVydWhhbi4KMy4gKipRdW90YSBTYW1wbGluZyoqIG1lbWlsaWtpIGJpYXMgeWFuZyBsZWJpaCByZW5kYWggZGliYW5kaW5na2FuIENvbnZlbmllbmNlIGRhbiBTbm93YmFsbCBTYW1wbGluZywgdGV0YXBpIHRldGFwIHRpZGFrIHNlYWt1cmF0IFByb2JhYmlsaXR5IFNhbXBsaW5nIGRhbGFtIG1lbWJlcmlrYW4gZ2FtYmFyYW4gcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLgoKIyMgNS40IEtlc2ltcHVsYW4gZGFyaSBQZXJiYW5kaW5nYW4gTWV0b2RlIFNhbXBsaW5nCgpCZXJkYXNhcmthbiBoYXNpbCBwZXJiYW5kaW5nYW4gZGkgYXRhcywgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2E6CgoxLiAqKlByb2JhYmlsaXR5IFNhbXBsaW5nIGxlYmloIGFrdXJhdCBkaWJhbmRpbmdrYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKioga2FyZW5hIG1lbWlsaWtpICoqbWFyZ2luIG9mIGVycm9yIHlhbmcgbGViaWgga2VjaWwgZGFuIGJpYXMgeWFuZyBsZWJpaCByZW5kYWgqKiBkYWxhbSBtZW5nZXN0aW1hc2kgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLgoyLiAqKlNpbXBsZSBSYW5kb20gU2FtcGxpbmcgKFNSUykgYWRhbGFoIG1ldG9kZSB0ZXJiYWlrIGRhbGFtIFByb2JhYmlsaXR5IFNhbXBsaW5nKiosIGthcmVuYSBtZW1pbGlraSBtYXJnaW4gb2YgZXJyb3IgdGVya2VjaWwgKDcwLDA5OS40NyBSdXBpYWgpLiBNZXRvZGUgaW5pIHNhbmdhdCBlZmVrdGlmIGRhbGFtIG1lbWJlcmlrYW4gZXN0aW1hc2kgeWFuZyBha3VyYXQuCjMuICoqQ2x1c3RlciBTYW1wbGluZyBkYW4gTXVsdGktU3RhZ2UgU2FtcGxpbmcqKiBtZW1pbGlraSBtYXJnaW4gb2YgZXJyb3IgeWFuZyBsZWJpaCB0aW5nZ2ksIG1lbnVuanVra2FuIGJhaHdhIG1ldG9kZSBpbmkgbGViaWggcmVudGFuIHRlcmhhZGFwIGJpYXMgamlrYSB0aWRhayBkaWxha3VrYW4gZGVuZ2FuIGhhdGktaGF0aS4KNC4gKipKaWthIG1lbXVuZ2tpbmthbiwgcGVuZWxpdGlhbiBzZWJhaWtueWEgbWVuZ2d1bmFrYW4gUHJvYmFiaWxpdHkgU2FtcGxpbmcqKiBhZ2FyIGhhc2lsbnlhIGxlYmloIGFrdXJhdCBkYW4gZGFwYXQgZGlnZW5lcmFsaXNhc2kga2UgcG9wdWxhc2kgeWFuZyBsZWJpaCBsdWFzLgoKRGVuZ2FuIGRlbWlraWFuLCAqKlNpbXBsZSBSYW5kb20gU2FtcGxpbmcgYWRhbGFoIG1ldG9kZSB5YW5nIHBhbGluZyBkaXJla29tZW5kYXNpa2FuIHVudHVrIHBlbmVsaXRpYW4gaW5pKioga2FyZW5hIG1lbWJlcmlrYW4ga2VzZWltYmFuZ2FuIHRlcmJhaWsgYW50YXJhICoqYWt1cmFzaSwgbWFyZ2luIG9mIGVycm9yIHlhbmcgcmVuZGFoLCBkYW4gcmVwcmVzZW50YXRpdml0YXMgcG9wdWxhc2kgbWFoYXNpc3dhKiouIFBlbmdndW5hYW4gbWV0b2RlIGluaSBkaWhhcmFwa2FuIGRhcGF0IG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBha3VyYXQgbWVuZ2VuYWkgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLCB5YW5nIHNhbmdhdCBwZW50aW5nIHVudHVrIHBlcmVuY2FuYWFuIGRhbiBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gdGVya2FpdCBrZXNlamFodGVyYWFuIG1haGFzaXN3YS4KCi0tLQoKIyA2LiBVa3VyYW4gU2FtcGVsIHlhbmcgRGlwZXJsdWthbiB1bnR1ayBNb0UgPSA1JQoKRGFsYW0gcGVuZWxpdGlhbiBpbmksIGluZ2luIG1lbmVudHVrYW4gYmVyYXBhIGJhbnlhayBtYWhhc2lzd2EgeWFuZyBoYXJ1cyBkaXN1cnZlaSBhZ2FyIGVzdGltYXNpIHBlbmdlbHVhcmFuIG1ha2FuIG1lcmVrYSB0aWRhayBtZWxlc2V0IGxlYmloIGRhcmkgNSUuIERlbmdhbiBtZW5nZ3VuYWthbiBkYXRhIHlhbmcgdGVsYWggZGlrdW1wdWxrYW4sIGtpdGEgYWthbiBtZW5naGl0dW5nIHVrdXJhbiBzYW1wZWwgeWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmNhcGFpIE1hcmdpbiBvZiBFcnJvciAoTW9FKSB5YW5nIGRpaW5naW5rYW4uCgojIyA2LjEgRGF0YSB5YW5nIERpa2V0YWh1aQoKLSAqKlRvdGFsIG1haGFzaXN3YSoqOiAzMDAgb3JhbmcKLSAqKlJhdGEtcmF0YSBwZW5nZWx1YXJhbiBtYWthbioqOiBNaXNhbGthbiByYXRhLXJhdGEgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhIGFkYWxhaCBScCAxLjUwMC4wMDAgcGVyIGJ1bGFuLgotICoqU2ltcGFuZ2FuIGJha3UgKFwoXHNpZ21hXCkpKio6IE1pc2Fsa2FuIHNpbXBhbmdhbiBiYWt1IHBlbmdlbHVhcmFuIG1ha2FuIG1haGFzaXN3YSBhZGFsYWggUnAgNTAwLjAwMC4KLSAqKkJhdGFzIGtlc2FsYWhhbiBtYWtzaW1hbCAoTWFyZ2luIG9mIEVycm9yIC8gTW9FKSoqOiA1JSBkYXJpIHJhdGEtcmF0YSBwZW5nZWx1YXJhbiwgeWFpdHU6CiAgCiAgXFsKICBNb0UgPSAwLjA1IFx0aW1lcyAxLDUwMCwwMDAgPSA3NSwwMDAgXHRleHR7IFJ1cGlhaH0KICBcXQoKIyMgNi4yIExhbmdrYWggUGVyaGl0dW5nYW4KCiMjIyA2LjIuMSBSdW11cyB1bnR1ayBNZW5naGl0dW5nIFVrdXJhbiBTYW1wZWwKCktpdGEgYWthbiBtZW5nZ3VuYWthbiBydW11cyB1bnR1ayBtZW5naGl0dW5nIHVrdXJhbiBzYW1wZWwgeWFuZyBkaXBlcmx1a2FuIGFnYXIgTW9FIHRpZGFrIGxlYmloIGRhcmkgUnAgNzUsMDAwOgoKXFsKTW9FID0gWiBcdGltZXMgXGZyYWN7XHNpZ21hfXtcc3FydHtufX0KXF0KCkRpbWFuYToKLSBcKCBaID0gMS45NiBcKSAoYW5na2Egc3RhbmRhciB1bnR1ayB0aW5na2F0IGtlcGVyY2F5YWFuIDk1JSkKLSBcKCBcc2lnbWEgPSA1MDAsMDAwIFwpIChzaW1wYW5nYW4gYmFrdSkKLSBcKCBuIFwpID0gdWt1cmFuIHNhbXBlbCB5YW5nIGRpY2FyaQoKIyMjIDYuMi4yIE1lbmdoaXR1bmcgVWt1cmFuIFNhbXBlbAoKS2l0YSBkYXBhdCBtZW55dXN1biB1bGFuZyBydW11cyB1bnR1ayBtZW5jYXJpIFwoIG4gXCk6CgpcWwpuID0gXGxlZnQoIFxmcmFje1ogXHRpbWVzIFxzaWdtYX17TW9FfSBccmlnaHQpXjIKXF0KClN1YnN0aXR1c2kgbmlsYWkgeWFuZyBkaWtldGFodWk6CgpcWwpuID0gXGxlZnQoIFxmcmFjezEuOTYgXHRpbWVzIDUwMCwwMDB9ezc1LDAwMH0gXHJpZ2h0KV4yClxdCgojIyMgNi4yLjMgTWVuZ2hpdHVuZyBOaWxhaQoKTWFyaSBraXRhIGhpdHVuZyBuaWxhaSBcKCBuIFwpIHNlY2FyYSBtYW51YWw6CgoxLiBIaXR1bmcgXCggWiBcdGltZXMgXHNpZ21hIFwpOgoKICAgXFsKICAgWiBcdGltZXMgXHNpZ21hID0gMS45NiBcdGltZXMgNTAwLDAwMCA9IDk4MCwwMDAKICAgXF0KCjIuIEhpdHVuZyBcKCBcZnJhY3taIFx0aW1lcyBcc2lnbWF9e01vRX0gXCk6CgogICBcWwogICBcZnJhY3taIFx0aW1lcyBcc2lnbWF9e01vRX0gPSBcZnJhY3s5ODAsMDAwfXs3NSwwMDB9IFxhcHByb3ggMTMuMDY2NwogICBcXQoKMy4gSGl0dW5nIFwoIG4gXCk6CgogICBcWwogICBuID0gKDEzLjA2NjcpXjIgXGFwcHJveCAxNzEuNzUKICAgXF0KCjQuIE1lbWJ1bGF0a2FuIGtlIGF0YXMgdW50dWsgbWVuZGFwYXRrYW4gdWt1cmFuIHNhbXBlbCBidWxhdDoKCiAgIFxbCiAgIG4gPSBcbGNlaWwgMTcxLjc1IFxyY2VpbCA9IDE3MgogICBcXQoKSmFkaSwga2l0YSBtZW1lcmx1a2FuICoqbiA9IDE3MioqIG1haGFzaXN3YSB1bnR1ayBtZW5jYXBhaSBNb0UgdGlkYWsgbGViaWggZGFyaSBScCA3NSwwMDAuCgojIyMgNi4yLjQgS29kZSBSIHVudHVrIGJhbnR1IE1lbmdoaXR1bmcgVWt1cmFuIFNhbXBlbAoKQmVyaWt1dCBhZGFsYWgga29kZSBSIHVudHVrIG1lbmdoaXR1bmcgdWt1cmFuIHNhbXBlbDoKCmBgYHtyIGVjaG89RkFMU0UsIG1hc3NlZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRGlrZXRhaHVpClogPC0gMS45NgpzaWdtYSA8LSA1MDAwMDAKTW9FIDwtIDc1MDAwCgojIE1lbmdoaXR1bmcgdWt1cmFuIHNhbXBlbApuIDwtIChaICogc2lnbWEgLyBNb0UpXjIKbiA8LSBjZWlsaW5nKG4pICAjIE1lbWJ1bGF0a2FuIGtlIGF0YXMgdW50dWsgbWVuZGFwYXRrYW4gdWt1cmFuIHNhbXBlbCBidWxhdApuCmBgYApqYXdhYmFuIGRhcmkgc2lzdGVtIGluaSBkaSBidWxhdGthbiBrZSBiYXdhaAoKIyMgNi4zIEtlbmFwYSBIYXJ1cyAxNzI/CgotIEppa2Ega2l0YSBtZW5nYW1iaWwgKiprdXJhbmcgZGFyaSAxNzIgb3JhbmcqKiwgaGFzaWxueWEgYmlzYSBsZWJpaCBtZWxlc2V0IGRhbiBrdXJhbmcgYWt1cmF0LgotIEppa2Ega2l0YSBtZW5nYW1iaWwgKipsZWJpaCBkYXJpIDE3MiBvcmFuZyoqLCBoYXNpbG55YSBha2FuIGxlYmloIGFrdXJhdCwgdGV0YXBpIGFrYW4gbWVtZXJsdWthbiBsZWJpaCBiYW55YWsgd2FrdHUgZGFuIGJpYXlhIHVudHVrIG1lbGFrdWthbiBzdXJ2ZWkuCgpKYWRpLCBhZ2FyIGhhc2lsIHBlbmVsaXRpYW4gaW5pICoqY3VrdXAgYWt1cmF0IGRhbiB0aWRhayBtZWxlc2V0IGxlYmloIGRhcmkgNSUqKiwga2l0YSAqKmhhcnVzIHN1cnZlaSBtaW5pbWFsIDE3MiBtYWhhc2lzd2EqKi4KRGVuZ2FuIHBlcmhpdHVuZ2FuIGluaSwga2l0YSBkYXBhdCBtZW1hc3Rpa2FuIGJhaHdhIHVrdXJhbiBzYW1wZWwgeWFuZyBkaWFtYmlsIGN1a3VwIHVudHVrIG1lbWJlcmlrYW4gZXN0aW1hc2kgeWFuZyBha3VyYXQgbWVuZ2VuYWkgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhLCB5YW5nIHNhbmdhdCBwZW50aW5nIHVudHVrIGFuYWxpc2lzIGxlYmloIGxhbmp1dCBkYW4gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHRlcmthaXQga2ViaWpha2FuIGtlc2VqYWh0ZXJhYW4gbWFoYXNpc3dhLgoKIyA3LiBLZXNpbXB1bGFuIGRhbiBSZWtvbWVuZGFzaQoKRGFsYW0gbGFwb3JhbiBwcmFrdGlrdW0gaW5pLCBrYW1pIHRlbGFoIG1lbGFrdWthbiBhbmFsaXNpcyBtZW5kYWxhbSBtZW5nZW5haSBtZXRvZGUgc2FtcGxpbmcgZGFuIG1hcmdpbiBvZiBlcnJvciAoTW9FKSBkYWxhbSBwZW5lbGl0aWFuIHN0YXRpc3Rpaywga2h1c3VzbnlhIGRhbGFtIGtvbnRla3MgcGVuZ2VsdWFyYW4gbWFrYW4gbWFoYXNpc3dhIGRpIHNlYnVhaCB1bml2ZXJzaXRhcyBkZW5nYW4gcG9wdWxhc2kgMzAwIG1haGFzaXN3YS4gQmVyaWt1dCBhZGFsYWgga2VzaW1wdWxhbiBkYW4gcmVrb21lbmRhc2kgYmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgeWFuZyB0ZWxhaCBkaWxha3VrYW46CgojIyA3LjEgS2VzaW1wdWxhbgoKMS4gKipMYXRhciBCZWxha2FuZyBkYW4gVHVqdWFuKio6IFBlbmVsaXRpYW4gaW5pIGRpbGF0YXJiZWxha2FuZ2kgb2xlaCBrZXRlcmJhdGFzYW4gZGFsYW0gbWVuZ3VtcHVsa2FuIGRhdGEgZGFyaSBzZWx1cnVoIHBvcHVsYXNpLCBzZWhpbmdnYSBtZXRvZGUgc2FtcGxpbmcgbWVuamFkaSBwZW50aW5nIHVudHVrIG1lbmRhcGF0a2FuIGRhdGEgeWFuZyByZXByZXNlbnRhdGlmLiBUdWp1YW4gcHJha3Rpa3VtIGluaSBhZGFsYWggdW50dWsgbWVtcGVsYWphcmkgYmVyYmFnYWkgbWV0b2RlIHBlbmdhbWJpbGFuIHNhbXBlbCwgbWVuZ2hpdHVuZyBNb0UsIG1lbmdhbmFsaXNpcyBiaWFzLCBkYW4gbWVuZW50dWthbiB1a3VyYW4gc2FtcGVsIHlhbmcgZGlwZXJsdWthbi4KCjIuICoqTWV0b2RlIFNhbXBsaW5nKio6IEthbWkgdGVsYWggbWVuZ2Vrc3Bsb3Jhc2kgZHVhIGthdGVnb3JpIHV0YW1hIG1ldG9kZSBzYW1wbGluZzoKICAgLSAqKlByb2JhYmlsaXR5IFNhbXBsaW5nKiogKFNpbXBsZSBSYW5kb20sIFN0cmF0aWZpZWQsIFN5c3RlbWF0aWMsIENsdXN0ZXIsIE11bHRpLVN0YWdlKSB5YW5nIG1lbWJlcmlrYW4gcGVsdWFuZyB5YW5nIHNhbWEgYmFnaSBzZXRpYXAgaW5kaXZpZHUgdW50dWsgdGVycGlsaWgsIGRhbgogICAtICoqTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKiogKENvbnZlbmllbmNlLCBQdXJwb3NpdmUsIFNub3diYWxsLCBRdW90YSkgeWFuZyB0aWRhayBtZW1iZXJpa2FuIHBlbHVhbmcgeWFuZyBzYW1hLCBzZWhpbmdnYSBiZXJwb3RlbnNpIG1lbmdoYXNpbGthbiBiaWFzLgoKMy4gKipNYXJnaW4gb2YgRXJyb3IgKE1vRSkqKjogUGVyaGl0dW5nYW4gTW9FIG1lbnVuanVra2FuIGJhaHdhIG1ldG9kZSAqKlNpbXBsZSBSYW5kb20gU2FtcGxpbmcgKFNSUykqKiBtZW1pbGlraSBNb0UgdGVya2VjaWwgKDcwLDA5OS40NyBSdXBpYWgpLCBtZW5qYWRpa2FubnlhIG1ldG9kZSB5YW5nIHBhbGluZyBha3VyYXQgZGFsYW0gbWVuZ2dhbWJhcmthbiBwb3B1bGFzaS4gU2ViYWxpa255YSwgKipNdWx0aS1TdGFnZSBTYW1wbGluZyoqIG1lbWlsaWtpIE1vRSB0ZXJiZXNhciAoODMsNDc2Ljg3IFJ1cGlhaCksIG1lbnVuanVra2FuIHBvdGVuc2kgYmlhcyB5YW5nIGxlYmloIHRpbmdnaS4KCjQuICoqQW5hbGlzaXMgQmlhcyoqOiBOb24tUHJvYmFiaWxpdHkgU2FtcGxpbmcgY2VuZGVydW5nIG1lbWlsaWtpIGJpYXMgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIFByb2JhYmlsaXR5IFNhbXBsaW5nLiBNZXRvZGUgc2VwZXJ0aSAqKkNvbnZlbmllbmNlIFNhbXBsaW5nKiogZGFuICoqU25vd2JhbGwgU2FtcGxpbmcqKiBzYW5nYXQgcmVudGFuIHRlcmhhZGFwIGJpYXMsIHlhbmcgZGFwYXQgbWVuZ2FraWJhdGthbiBoYXNpbCB5YW5nIHRpZGFrIHJlcHJlc2VudGF0aWYuCgo1LiAqKlVrdXJhbiBTYW1wZWwgdW50dWsgTW9FIOKJpCA1JSoqOiBVbnR1ayBtZW5jYXBhaSBNb0UgdGlkYWsgbGViaWggZGFyaSA1JSwgZGlwZXJsdWthbiBtaW5pbWFsIDE3MiBtYWhhc2lzd2EgZGFsYW0gc3VydmVpIGluaS4gSW5pIG1lbnVuanVra2FuIHBlbnRpbmdueWEgdWt1cmFuIHNhbXBlbCB5YW5nIG1lbWFkYWkgdW50dWsgbWVtYXN0aWthbiBha3VyYXNpIGhhc2lsIHBlbmVsaXRpYW4uCgojIyA3LjIgUmVrb21lbmRhc2kKCjEuICoqUGVuZ2d1bmFhbiBQcm9iYWJpbGl0eSBTYW1wbGluZyoqOiBEaXNhcmFua2FuIHVudHVrIG1lbmdndW5ha2FuIG1ldG9kZSBQcm9iYWJpbGl0eSBTYW1wbGluZywga2h1c3VzbnlhICoqU2ltcGxlIFJhbmRvbSBTYW1wbGluZyoqLCBkYWxhbSBwZW5lbGl0aWFuIHlhbmcgbWVtZXJsdWthbiByZXByZXNlbnRhdGl2aXRhcyB0aW5nZ2kuIE1ldG9kZSBpbmkgbWFtcHUgbWVtYmVyaWthbiBlc3RpbWFzaSB5YW5nIGxlYmloIGFrdXJhdCBkZW5nYW4gTW9FIHlhbmcgbGViaWgga2VjaWwuCgoyLiAqKkhpbmRhcmkgTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nKio6IEppa2EgbWVtdW5na2lua2FuLCBoaW5kYXJpIHBlbmdndW5hYW4gTm9uLVByb2JhYmlsaXR5IFNhbXBsaW5nLCB0ZXJ1dGFtYSBkYWxhbSBwZW5lbGl0aWFuIHlhbmcgbWVtZXJsdWthbiBnZW5lcmFsaXNhc2kgaGFzaWwuIEppa2EgaGFydXMgZGlndW5ha2FuLCBwaWxpaGxhaCBtZXRvZGUgc2VwZXJ0aSAqKlF1b3RhIFNhbXBsaW5nKiogeWFuZyBsZWJpaCBiYWlrIGRhbGFtIGhhbCByZXByZXNlbnRhdGl2aXRhcyBkaWJhbmRpbmdrYW4gbWV0b2RlIG5vbi1hY2FrIGxhaW5ueWEuCgozLiAqKlBlcmVuY2FuYWFuIFVrdXJhbiBTYW1wZWwqKjogRGFsYW0gcGVyZW5jYW5hYW4gcGVuZWxpdGlhbiwgcGVudGluZyB1bnR1ayBtZW5naGl0dW5nIHVrdXJhbiBzYW1wZWwgeWFuZyBkaXBlcmx1a2FuIHVudHVrIG1lbmNhcGFpIE1vRSB5YW5nIGRpaW5naW5rYW4uIFBhc3Rpa2FuIHVudHVrIG1lbXBlcnRpbWJhbmdrYW4gdmFyaWFiaWxpdGFzIGRhbGFtIHBvcHVsYXNpIHNhYXQgbWVuZW50dWthbiB1a3VyYW4gc2FtcGVsLgoKNC4gKipFdmFsdWFzaSBkYW4gVmFsaWRhc2kqKjogTGFrdWthbiBldmFsdWFzaSBkYW4gdmFsaWRhc2kgdGVyaGFkYXAgaGFzaWwgcGVuZWxpdGlhbiB1bnR1ayBtZW1hc3Rpa2FuIGJhaHdhIGRhdGEgeWFuZyBkaXBlcm9sZWggZGFwYXQgZGlnZW5lcmFsaXNhc2kga2UgcG9wdWxhc2kgeWFuZyBsZWJpaCBsdWFzLiBJbmkgZGFwYXQgZGlsYWt1a2FuIGRlbmdhbiBtZW1iYW5kaW5na2FuIGhhc2lsIGRhcmkgYmVyYmFnYWkgbWV0b2RlIHNhbXBsaW5nLgoKNS4gKipQZW5lcmFwYW4gSGFzaWwgUGVuZWxpdGlhbioqOiBIYXNpbCBwZW5lbGl0aWFuIGluaSBkYXBhdCBkaWd1bmFrYW4gb2xlaCBpbnN0aXR1c2kgcGVuZGlkaWthbiB1bnR1ayBtZXJhbmNhbmcga2ViaWpha2FuIHRlcmthaXQga2VzZWphaHRlcmFhbiBtYWhhc2lzd2EsIHNlcnRhIG1lbWJhbnR1IG1haGFzaXN3YSBkYWxhbSBtZW5nZWxvbGEga2V1YW5nYW4gcHJpYmFkaSBtZXJla2EuCgpEZW5nYW4gbWVuZ2lrdXRpIHJla29tZW5kYXNpIGluaSwgZGloYXJhcGthbiBwZW5lbGl0aWFuIGRpIG1hc2EgbWVuZGF0YW5nIGRhcGF0IG1lbmdoYXNpbGthbiBkYXRhIHlhbmcgbGViaWggYWt1cmF0IGRhbiByZXByZXNlbnRhdGlmLCBzZXJ0YSBtZW1iZXJpa2FuIHdhd2FzYW4geWFuZyBsZWJpaCBiYWlrIG1lbmdlbmFpIGZlbm9tZW5hIHlhbmcgZGl0ZWxpdGkuCgoKIyA4LlJlZmVyZW5zaQoKMS4gKipTaXJlZ2FyLCBCLiAobi5kLikuKiogKk1hcmdpbiBvZiBFcnJvci4qIGRhcmkgW2h0dHBzOi8vYm9va2Rvd24ub3JnL2RzY2llbmNlbGFicy9zYW1wbGluZ19hbmRfc3VydmV5X3RlY2huaXF1ZXMvZG9jcy8wNC1NYXJnaW4tb2YtRXJyb3IuaHRtbCNyZWFsLXdvcmxkLWV4YW1wbGVzXShodHRwczovL2Jvb2tkb3duLm9yZy9kc2NpZW5jZWxhYnMvc2FtcGxpbmdfYW5kX3N1cnZleV90ZWNobmlxdWVzL2RvY3MvMDQtTWFyZ2luLW9mLUVycm9yLmh0bWwjcmVhbC13b3JsZC1leGFtcGxlcykgIAoKMi4gKipBY2N1cmF0ZS5JRC4gKG4uZC4pLioqICpNYXJnaW4gb2YgRXJyb3I6IFBlbmdlcnRpYW4sIEZ1bmdzaSwgZGFuIENhcmEgTWVuZ2hpdHVuZ255YS4qIGRhcmkgW2h0dHBzOi8vYWNjdXJhdGUuaWQvbWFya2V0aW5nLW1hbmFqZW1lbi9tYXJnaW4tb2YtZXJyb3IvXShodHRwczovL2FjY3VyYXRlLmlkL21hcmtldGluZy1tYW5hamVtZW4vbWFyZ2luLW9mLWVycm9yLykgIAoKMy4gKipTdXJ2ZXlNb25rZXkuIChuLmQuKS4qKiAqTWFyZ2luIG9mIEVycm9yIENhbGN1bGF0b3IuKiBkYXJpIFtodHRwczovL3d3dy5zdXJ2ZXltb25rZXkuY29tL21wL21hcmdpbi1vZi1lcnJvci1jYWxjdWxhdG9yL10oaHR0cHM6Ly93d3cuc3VydmV5bW9ua2V5LmNvbS9tcC9tYXJnaW4tb2YtZXJyb3ItY2FsY3VsYXRvci8pICAKCjQuICoqTGVtYmFnYSBQZW5lbGl0aWFuIGRhbiBQZW5nYWJkaWFuIGtlcGFkYSBNYXN5YXJha2F0IChMUDJNKSBVTUEuICgyMDIyLCBKYW51YXJ5IDI3KS4qKiAqQXBhIEl0dSBNYXJnaW4gRXJyb3I/IFBlbmdlcnRpYW4sIFBlcmhpdHVuZ2FuLCBkZW5nYW4gQ29udG9oLiogZGFyaSBbaHR0cHM6Ly9scDJtLnVtYS5hYy5pZC8yMDIyLzAxLzI3L2FwYS1pdHUtbWFyZ2luLWVycm9yLXBlbmdlcnRpYW4tcGVyaGl0dW5nYW4tZGVuZ2FuLWNvbnRvaC9dKGh0dHBzOi8vbHAybS51bWEuYWMuaWQvMjAyMi8wMS8yNy9hcGEtaXR1LW1hcmdpbi1lcnJvci1wZW5nZXJ0aWFuLXBlcmhpdHVuZ2FuLWRlbmdhbi1jb250b2gvKSAgCg==