## Warning: package 'htmltools' was built under R version 4.5.2
M.Fitrah Aidil Harahap
Student Majoring in Data Science
R Programming
Data Science
Statistics
Case Study 1
Confidence Interval for Mean, \(\sigma\) Known: An
e-commerce platform wants to estimate the
average number of daily transactions per user after
launching a new feature. Based on large-scale historical data, the
population standard deviation is known.
\[
\begin{eqnarray*}
\sigma &=& 3.2 \quad \text{(population standard deviation)} \\
n &=& 100 \quad \text{(sample size)} \\
\bar{x} &=& 12.6 \quad \text{(sample mean)}
\end{eqnarray*}
\]
Tasks
Identify the appropriate statistical test and
justify your choice.
Compute the Confidence Intervals for:
\(90\%\)
\(95\%\)
\(99\%\)
Create a comparison visualization of the three
confidence intervals.
Interpret the results in a business analytics context.
JAWAB :
Uji statistik yang
tepat untuk digunakan adalah Z-Test (Z-Interval) untuk rata-rata
populasi.
Standar Deviasi Populasi (\(\sigma\) ) Diketahui: Soal secara
eksplisit menyebutkan \(\sigma = 3.2\) .
Jika \(\sigma\) tidak diketahui, kita
akan menggunakan t-test.
Ukuran Sampel Besar: Sampel (\(n = 100\) ) jauh lebih besar dari 30 (\(n > 30\) ), sehingga menurut Teorema
Limit Pusat, distribusi rata-rata sampel akan mendekati distribusi
normal.
Perhitungan
Confidence Intervals (CI)
Rumus umum Confidence Interval adalah: \[\bar{x} \pm z \cdot \left(
\frac{\sigma}{\sqrt{n}} \right)\] Di mana Standard Error (\(SE\) ) adalah: \(SE = \frac{3.2}{\sqrt{100}} = 0.32\) .
Data Distribusi Z
90%
1.645
0.526
12.074
13.126
95%
1.960
0.627
11.973
13.227
99%
2.576
0.824
11.776
13.424
Visualisasi
Perbandingan
Interpretasi dalam
Konteks Business Analytics
Kepastian Presisi: Semakin tinggi tingkat
kepercayaan (99%), semakin lebar rentangnya. Secara bisnis, jika kita
ingin sangat yakin (99%) bahwa prediksi kita benar, kita harus menerima
rentang yang lebih luas (11.78 hingga 13.42 transaksi). Sebaliknya, pada
90%, rentangnya lebih sempit (presisi lebih tinggi), namun risiko
melesetnya lebih besar.
Efektivitas Fitur Baru: Manajemen e-commerce
dapat menyimpulkan dengan keyakinan 95% bahwa rata-rata transaksi harian
per user setelah peluncuran fitur baru berada di antara 11.97 hingga
13.23. Angka ini bisa dibandingkan dengan data historis sebelum fitur
diluncurkan untuk mengukur kesuksesan KPI.
Pengambilan Keputusan: Rentang ini memberikan
“batas aman” bagi tim operasional untuk memproyeksikan beban server atau
pendapatan harian tanpa hanya mengandalkan satu angka rata-rata tunggal
yang mungkin fluktuatif.
Case Study 2
Confidence Interval for Mean, \(\sigma\) Unknown: A UX
Research team analyzes task completion time (in
minutes) for a new mobile application. The data are collected
from 12 users :
\[
8.4,\; 7.9,\; 9.1,\; 8.7,\; 8.2,\; 9.0,\;
7.8,\; 8.5,\; 8.9,\; 8.1,\; 8.6,\; 8.3
\]
Tasks:
Identify the appropriate statistical test and
explain why.
Compute the Confidence Intervals for:
\(90\%\)
\(95\%\)
\(99\%\)
Visualize the three intervals on a single plot.
Explain how sample size and confidence level
influence the interval width.
JAWAB :
Identifikasi Uji
Statistik
Uji statistik yang tepat adalah One-Sample t-test (t-interval).
Standar Deviasi Populasi (\(\sigma\) ) Tidak Diketahui: Kita
hanya memiliki data sampel, sehingga harus menggunakan standar deviasi
sampel (\(s\) ).
Ukuran Sampel Kecil: Jumlah sampel hanya \(n = 12\) (\(n
< 30\) ). Dalam kondisi ini, distribusi-\(t\) lebih akurat daripada distribusi-\(z\) untuk mengakomodasi ketidakpastian
ekstra dari sampel kecil.
Perhitungan
Confidence Intervals Data:
\(8.4, 7.9, 9.1, 8.7, 8.2, 9.0, 7.8, 8.5,
8.9, 8.1, 8.6, 8.3\)
Mean Sampel (\(\bar{x}\) ): \(8.458\)
Standar Deviasi Sampel (\(s\) ): \(0.412\)
Degrees of Freedom (\(df\) ): \(n - 1 = 11\)
Hasil Estimasi Distribusi T
90%
1.796
0.214
8.244
8.672
95%
2.201
0.262
8.196
8.196
99%
3.106
0.369
8.089
8.827
Visualisasi
Perbandingan
Pengaruh Ukuran
Sampel dan Confidence Level
Confidence Level: Semakin tinggi tingkat
kepercayaan (misal dari 90% ke 99%), semakin lebar intervalnya. Hal ini
karena kita membutuhkan rentang yang lebih luas agar lebih yakin bahwa
parameter populasi benar-benar ada di dalamnya.
Sample Size (\(n\) ): Semakin besar ukuran sampel,
semakin sempit intervalnya. Secara matematis, \(n\) berada di penyebut dalam rumus Standard
Error (\(s/\sqrt{n}\) ). Sampel yang
lebih besar mengurangi variabilitas estimasi, sehingga menghasilkan
presisi yang lebih tinggi.
Case Study 3
Confidence Interval for a Proportion, A/B Testing: A
data science team runs an A/B test on a new
Call-To-Action (CTA) button design. The experiment yields:
\[
\begin{eqnarray*}
n &=& 400 \quad \text{(total users)} \\
x &=& 156 \quad \text{(users who clicked the CTA)}
\end{eqnarray*}
\]
Tasks:
Compute the sample proportion \(\hat{p}\) .
Compute Confidence Intervals for the proportion at:
\(90\%\)
\(95\%\)
\(99\%\)
Visualize and compare the three intervals.
Explain how confidence level affects decision-making in product
experiments.
JAWAB :
Hitung Proporsi
Sampel(\(\hat{p}\) )
Berdasarkan data eksperimen:
Total pengguna (\(n\) ) = 400
Pengguna yang mengklik CTA (\(x\) )
= 156
\[\hat{p} = \frac{x}{n} = \frac{156}{400}
= 0.39\] Jadi, proporsi sampelnya adalah 0.39 atau 39%.
Hitung Confidence
Intervals untuk Proporsi
Rumus yang digunakan adalah: \(\hat{p} \pm
z \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\) Di mana Standard
Error (\(SE\) ) adalah: \(\sqrt{\frac{0.39 \cdot 0.61}{400}} \approx
0.02439\)
Tabel Interval Kepercayaan
Confidence.Level
Nilai.Kritis..z.
Margin.of.Error
Lower.Bound
Upper.Bound
90%
1.645
0.0401
0.3499
0.4301
95%
1.960
0.0478
0.3422
0.4378
99%
2.576
0.0628
0.3272
0.4528*
Visualisasi
Perbandingan
Pengaruh Confidence
Level dalam Pengambilan Keputusan Produk
Dalam konteks eksperimen produk (A/B Testing), tingkat kepercayaan
sangat mempengaruhi keputusan:
Toleransi Risiko: Tingkat kepercayaan 95% adalah
standar industri. Jika kita menggunakan 99%, kita menjadi sangat
konservatif—kita butuh bukti yang sangat kuat sebelum menyatakan suatu
desain CTA lebih baik. Ini mengurangi risiko False Positive (menyatakan
ada efek padahal tidak ada).
Kecepatan vs Kepastian: Tingkat kepercayaan 90%
menghasilkan interval yang lebih sempit, yang memungkinkan pengambilan
keputusan lebih cepat dengan data yang lebih sedikit, namun dengan
risiko kesalahan yang lebih tinggi (10%).
Aplikasi Praktis: Jika interval kepercayaan
untuk desain baru tidak tumpang tindih (overlap) dengan performa desain
lama, tim produk dapat dengan percaya diri meluncurkan fitur tersebut.
Semakin tinggi tingkat kepercayaan, semakin besar keyakinan bisnis bahwa
peningkatan metrik bukan terjadi karena kebetulan.
Case Study 4
Precision Comparison (Z-Test vs t-Test): Two data
teams measure API latency (in milliseconds) under
different conditions.
\[\begin{eqnarray*}
\text{Team A:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
\sigma &=& 24 \quad \text{(known population standard deviation)}
\\[6pt]
\text{Team B:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
s &=& 24 \quad \text{(sample standard deviation)}
\end{eqnarray*}\]
Tasks
Identify the statistical test used by each team.
Compute Confidence Intervals for 90%, 95%, and
99% .
Create a visualization comparing all intervals.
Explain why the interval widths differ , even with
similar data.
JAWAB:
Identifikasi Uji
Statistik
Kedua tim memiliki ukuran sampel yang sama (\(n = 36\) ), namun perbedaan terletak pada
informasi standar deviasi yang tersedia:
Team A (Z-Test): Menggunakan Z-Test karena
standar deviasi populasi (\(\sigma\) )
diketahui.
Team B (t-Test): Menggunakan t-Test karena
standar deviasi populasi tidak diketahui, sehingga menggunakan standar
deviasi sampel (\(s\) ).
Perhitungan
Confidence Interval (CI)
Rumus umum: \(\bar{x} \pm (\text{Critical
Value} \times \frac{\text{std dev}}{\sqrt{n}})\) Dengan Standard
Error (\(SE\) ) = \(\frac{24}{\sqrt{36}} = 4\) .
Tabel Interval Kepercayaan Team A
Confidence.Level
Nilai.Kritis..z..
Perhitungan..z..x.4.
Lower.Bound..ms.
Upper.Bound..ms.
90%
1.645
6.58
203.42
216.58
95%
1.960
7.84
202.16
217.84
99%
2.576
10.30
199.70
220.30
Tabel Interval Kepercayaan Team B
Confidence Level
t-score (t*)
Perhitungan
Lower Bound
Upper Bound
90%
1.689
210 ± 6.76
203.24
216.76
95%
2.030
210 ± 8.12
201.88
218.12
99%
2.724
210 ± 10.90
199.10
220.90
Visualisasi
Perbandingan
Analisis Perbedaan
Lebar Interval
Meskipun nilai \(\bar{x}\) , \(n\) , dan angka standar deviasinya sama
(24), interval Team B lebih lebar karena alasan berikut:
1. Ketidakpastian Tambahan: Team B menggunakan
standar deviasi sampel (\(s\) ), yang
merupakan estimasi. Distribusi-t memiliki “ekor yang lebih tebal”
(heavier tails) untuk mengompensasi ketidakpastian estimasi
tersebut.
2. Nilai Kritis: Nilai kritis \(t\) selalu lebih besar daripada nilai
kritis \(z\) untuk ukuran sampel yang
sama (\(t^ > z^\) ).
3. Konservatisme: Pendekatan t-test lebih
konservatif (menghasilkan margin of error lebih besar) untuk memastikan
bahwa parameter populasi benar-benar tercakup dalam interval ketika
informasi populasi tidak lengkap.
Case Study 5
One-Sided Confidence Interval: A Software as
a Service (SaaS) company wants to ensure that at least
70% of weekly active users utilize a premium feature.
From the experiment:
\[
\begin{eqnarray*}
n &=& 250 \quad \text{(total users)} \\
x &=& 185 \quad \text{(active premium users)}
\end{eqnarray*}
\]
Management is only interested in the lower bound of
the estimate.
Tasks:
Identify the type of Confidence Interval and the
appropriate test.
Compute the one-sided lower Confidence Interval at:
\(90\%\)
\(95\%\)
\(99\%\)
Visualize the lower bounds for all confidence levels.
Determine whether the 70% target is statistically
satisfied.
JAWAB:
Identifikasi Tipe
Confidence Interval dan Uji yang Tepat
Tipe Confidence Interval: Menggunakan One-Sided
Lower Confidence Interval karena manajemen hanya tertarik pada batas
bawah (lower bound) untuk memastikan proporsi pengguna minimal mencapai
target tertentu.
Uji Statistik: Menggunakan Z-test untuk Proporsi
(Z-test for a single proportion) karena data berupa proporsi binominal
(aktif/tidak aktif) dengan ukuran sampel yang besar (\(n=250\) ).
Perhitungan One-Sided
Lower Confidence Interval
Diketahui :
\(n = 250\) \(x = 185\)
Proporsi sampel (\(\hat{p}\) ) =
\(\frac{185}{250} = 0.74\)
(74%)
Standard Error (\(SE\) ) = \(\sqrt{\frac{\hat{p}(1-\hat{p})}{n}} =
\sqrt{\frac{0.74 \times 0.26}{250}} \approx 0.0277\)
Rumus Lower Bound: \(\hat{p} - (z
\times SE)\)
Tabel Batas Bawah Satu Sisi
Confidence Level
Z-score (One-Sided)
Perhitungan
Lower Bound (%)
90%
1.282
0.74 - (1.282 × 0.0277)
70.45%
95%
1.645
0.74 - (1.645 × 0.0277)
69.44%
99%
2.326
0.74 - (2.326 × 0.0277)
67.56%
Visualisasi Lower
Bounds
Kesimpulan Target
70%
Berdasarkan hasil analisis, apakah target 70% terpenuhi secara
statistik?
Pada Tingkat Kepercayaan 90%: Terpenuhi, karena
batas bawah (70.45%) masih di atas target 70%.
Pada Tingkat Kepercayaan 95%: Tidak Terpenuhi
secara ketat, karena batas bawah (69.44%) turun sedikit di bawah target
70%.
Pada Tingkat Kepercayaan 99%: Tidak Terpenuhi,
karena batas bawah (67.56%) berada di bawah target.
Kesimpulan Akhir: Manajemen bisa merasa yakin sebesar 90% bahwa
target tercapai, namun jika mereka membutuhkan tingkat keyakinan yang
lebih tinggi (95% atau 99%), data saat ini belum cukup kuat untuk
menjamin target 70% terpenuhi secara statistik.
LS0tDQp0aXRsZTogIlN0dWR5IENhc2VzIiAgICAgICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiQ29uZmlkZW5jZSBJbnRlcnZhbH4gV2VlayAxMyIgICMgU3VidGl0bGUgb3IgdG9waWMgZm9yIHdlZWsgMg0KYXV0aG9yOiAiTS4gRml0cmFoIEFpZGlsIEhhcmFoYXAiICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICMgQXV0byBkaXNwbGF5cyB0aGUgY3VycmVudCBkYXRlDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IHNlY3Rpb24gZGVmaW5lcyB0aGUgZm9ybWF0IGFuZCBsYXlvdXQgDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAjIEVtYmVkcyBhbGwgcmVzb3VyY2VzIChDU1MsIEpTLCBpbWFnZXMpIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAjIERpc3BsYXlzIGltYWdlIHRodW1ibmFpbHMgaW4gdGhlIGRvYw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAjIEVuYWJsZXMgY2xpY2sgdG8gZW5sYXJnZSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgIyBHcm91cHMgaW1hZ2VzIGludG8gYW4gaW50ZXJhY3RpdmUgZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAjIEF1dG9tYXRpY2FsbHkgbnVtYmVycyBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgIyBEaXJlY3Rvcnkgd2hlcmUgSmF2YVNjcmlwdC9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICMgRGlzcGxheXMgZGF0YSBmcmFtZXMgYXMgaW50ZXJhY3RpdmUgcGFnZWQgDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICMgQWxsb3dzIGZvbGRpbmcvdW5mb2xkaW5nIFIgY29kZSBibG9ja3MgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICMgQWRkcyBhIGJ1dHRvbiB0byBkb3dubG9hZCBhbGwgUiBjb2RlDQogICAgY3NzIDogc3R5bGUuY3NzDQotLS0NCg0KDQoNCmBgYHtyIHByb2ZpbGUsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGh0bWx0b29scykNCkhUTUwoJw0KPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAzMHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmNWY3ZmEgMCUsICNjM2NmZTIgMTAwJSk7IHBhZGRpbmc6IDMwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IG1hcmdpbjogMjBweCAwOyI+DQogIDxkaXY+DQogICAgPGltZyBzcmM9IkM6L1VzZXJzL2ZhcmVsL09uZURyaXZlL0Rva3VtZW4vQWlkaWwvZm90byBhbG1ldC5wbmciDQogDQogICAgICAgICBzdHlsZT0id2lkdGg6IDI1MHB4OyBoZWlnaHQ6IDI1MHB4OyBib3JkZXItcmFkaXVzOiA1MCU7IG9iamVjdC1maXQ6IGNvdmVyOyBib3JkZXI6IDRweCBzb2xpZCB3aGl0ZTsgYm94LXNoYWRvdzogMCA1cHggMTVweCByZ2JhKDAsMCwwLDAuMik7Ij4NCiAgPC9kaXY+DQogIDxkaXY+DQogICAgPGgxIHN0eWxlPSJjb2xvcjogIzJjM2U1MDsgbWFyZ2luOiAwOyI+TS5GaXRyYWggQWlkaWwgSGFyYWhhcDwvaDE+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBtYXJnaW46IDVweCAwIDE1cHggMDsiPlN0dWRlbnQgTWFqb3JpbmcgaW4gRGF0YSBTY2llbmNlPC9wPg0KICAgIA0KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogMTVweDsgbWFyZ2luLXRvcDogMjBweDsiPg0KICAgICAgPGJ1dHRvbiBzdHlsZT0iYmFja2dyb3VuZDogIzM0OThkYjsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogMTVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogYm9sZDsiPg0KICAgICAgICBSIFByb2dyYW1taW5nDQogICAgICA8L2J1dHRvbj4NCiAgICAgIDxidXR0b24gc3R5bGU9ImJhY2tncm91bmQ6ICNlNzRjM2M7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4NCiAgICAgICAgRGF0YSBTY2llbmNlDQogICAgICA8L2J1dHRvbj4NCiAgICAgIDxidXR0b24gc3R5bGU9ImJhY2tncm91bmQ6ICMyZWNjNzE7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4NCiAgICAgICAgU3RhdGlzdGljcw0KICAgICAgPC9idXR0b24+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQonKQ0KDQpgYGANCg0KDQotLS0NCg0KIyMgQ2FzZSBTdHVkeSAxDQoNCioqQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgTWVhbiwgJFxzaWdtYSQgS25vd246KiogQW4gKiplLWNvbW1lcmNlIHBsYXRmb3JtKiogd2FudHMgdG8gZXN0aW1hdGUgdGhlICoqYXZlcmFnZSBudW1iZXIgb2YgZGFpbHkgdHJhbnNhY3Rpb25zIHBlciB1c2VyKiogYWZ0ZXIgbGF1bmNoaW5nIGEgbmV3IGZlYXR1cmUuIEJhc2VkIG9uIGxhcmdlLXNjYWxlIGhpc3RvcmljYWwgZGF0YSwgdGhlICoqcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24qKiBpcyBrbm93bi4NCg0KJCQNClxiZWdpbntlcW5hcnJheSp9DQpcc2lnbWEgJj0mIDMuMiBccXVhZCBcdGV4dHsocG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24pfSBcXA0KbiAmPSYgMTAwIFxxdWFkIFx0ZXh0eyhzYW1wbGUgc2l6ZSl9IFxcDQpcYmFye3h9ICY9JiAxMi42IFxxdWFkIFx0ZXh0eyhzYW1wbGUgbWVhbil9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVGFza3MqKg0KDQoxLiBJZGVudGlmeSB0aGUgKiphcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0KiogYW5kIGp1c3RpZnkgeW91ciBjaG9pY2UuDQoyLiBDb21wdXRlIHRoZSBDb25maWRlbmNlIEludGVydmFscyBmb3I6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBDcmVhdGUgYSAqKmNvbXBhcmlzb24gdmlzdWFsaXphdGlvbioqIG9mIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscy4NCjQuIEludGVycHJldCB0aGUgcmVzdWx0cyBpbiBhIGJ1c2luZXNzIGFuYWx5dGljcyBjb250ZXh0Lg0KDQoqKkpBV0FCIDogKiogDQoNCiMjIyBVamkgc3RhdGlzdGlrIHlhbmcgdGVwYXQgdW50dWsgZGlndW5ha2FuIGFkYWxhaCBaLVRlc3QgKFotSW50ZXJ2YWwpIHVudHVrIHJhdGEtcmF0YSBwb3B1bGFzaS4NCg0KLSAqKlN0YW5kYXIgRGV2aWFzaSBQb3B1bGFzaSAoJFxzaWdtYSQpIERpa2V0YWh1aToqKiBTb2FsIHNlY2FyYSBla3NwbGlzaXQgbWVueWVidXRrYW4gJFxzaWdtYSA9IDMuMiQuIEppa2EgJFxzaWdtYSQgdGlkYWsgZGlrZXRhaHVpLCBraXRhIGFrYW4gbWVuZ2d1bmFrYW4gdC10ZXN0Lg0KDQotICoqVWt1cmFuIFNhbXBlbCBCZXNhcjoqKiBTYW1wZWwgKCRuID0gMTAwJCkgamF1aCBsZWJpaCBiZXNhciBkYXJpIDMwICgkbiA+IDMwJCksIHNlaGluZ2dhIG1lbnVydXQgVGVvcmVtYSBMaW1pdCBQdXNhdCwgZGlzdHJpYnVzaSByYXRhLXJhdGEgc2FtcGVsIGFrYW4gbWVuZGVrYXRpIGRpc3RyaWJ1c2kgbm9ybWFsLg0KDQojIyMgUGVyaGl0dW5nYW4gQ29uZmlkZW5jZSBJbnRlcnZhbHMgKENJKQ0KDQpSdW11cyB1bXVtIENvbmZpZGVuY2UgSW50ZXJ2YWwgYWRhbGFoOg0KJCRcYmFye3h9IFxwbSB6IFxjZG90IFxsZWZ0KCBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSBccmlnaHQpJCQNCkRpIG1hbmEgU3RhbmRhcmQgRXJyb3IgKCRTRSQpIGFkYWxhaDogDQokU0UgPSBcZnJhY3szLjJ9e1xzcXJ0ezEwMH19ID0gMC4zMiQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBzZWRlcmhhbmENCkNvbmZpZGVuY2VfTGV2ZWwgPC0gYygiOTAlIiwgIjk1JSIsICI5OSUiKQ0KWl9Lcml0aXMgPC0gYygxLjY0NSwgMS45NjAsIDIuNTc2KQ0KTWFyZ2luX0Vycm9yIDwtIGMoMC41MjYsIDAuNjI3LCAwLjgyNCkNCkxvd2VyIDwtIGMoMTIuMDc0LCAxMS45NzMsIDExLjc3NikNClVwcGVyIDwtIGMoMTMuMTI2LCAxMy4yMjcsIDEzLjQyNCkNCg0KZGYgPC0gZGF0YS5mcmFtZShDb25maWRlbmNlX0xldmVsLCBaX0tyaXRpcywgTWFyZ2luX0Vycm9yLCBMb3dlciwgVXBwZXIpDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwgc3RhbmRhcg0Ka25pdHI6OmthYmxlKGRmLCBjYXB0aW9uID0gIkRhdGEgRGlzdHJpYnVzaSBaIikNCg0KDQpgYGANCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiANCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTG9hZCBsaWJyYXJ5DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgSW5wdXQgZGF0YQ0KZGF0YV9jaSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5OSUiLCAiOTUlIiwgIjkwJSIpKSwNCiAgbWVhbiA9IGMoMTIuNiwgMTIuNiwgMTIuNiksDQogIGxvd2VyID0gYygxMi4wNzQsIDExLjk3MywgMTEuNzc2KSwNCiAgdXBwZXIgPSBjKDEzLjEyNiwgMTMuMjI3LCAxMy40MjQpDQopDQoNCiMgTWVtYnVhdCBQbG90DQpnZ3Bsb3QoZGF0YV9jaSwgYWVzKHggPSBsZXZlbCwgeSA9IG1lYW4pKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyLCBjb2xvciA9IGxldmVsKSwgd2lkdGggPSAwLjMsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9wb2ludChzaXplID0gNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiUGVyYmFuZGluZ2FuIENvbmZpZGVuY2UgSW50ZXJ2YWxzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJSYXRhLXJhdGEgVHJhbnNha3NpIEhhcmlhbiAoTWVhbiA9IDEyLjYpIiwNCiAgICAgICB4ID0gIlRpbmdrYXQgS2VwZXJjYXlhYW4iLA0KICAgICAgIHkgPSAiSnVtbGFoIFRyYW5zYWtzaSIsDQogICAgICAgY29sb3IgPSAiQ0kgTGV2ZWwiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KIyMjIEludGVycHJldGFzaSBkYWxhbSBLb250ZWtzIEJ1c2luZXNzIEFuYWx5dGljcw0KDQotICoqS2VwYXN0aWFuIFByZXNpc2k6KiogU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiAoOTklKSwgc2VtYWtpbiBsZWJhciByZW50YW5nbnlhLiBTZWNhcmEgYmlzbmlzLCBqaWthIGtpdGEgaW5naW4gc2FuZ2F0IHlha2luICg5OSUpIGJhaHdhIHByZWRpa3NpIGtpdGEgYmVuYXIsIGtpdGEgaGFydXMgbWVuZXJpbWEgcmVudGFuZyB5YW5nIGxlYmloIGx1YXMgKDExLjc4IGhpbmdnYSAxMy40MiB0cmFuc2Frc2kpLiBTZWJhbGlrbnlhLCBwYWRhIDkwJSwgcmVudGFuZ255YSBsZWJpaCBzZW1waXQgKHByZXNpc2kgbGViaWggdGluZ2dpKSwgbmFtdW4gcmlzaWtvIG1lbGVzZXRueWEgbGViaWggYmVzYXIuDQoNCi0gKipFZmVrdGl2aXRhcyBGaXR1ciBCYXJ1OioqIE1hbmFqZW1lbiBlLWNvbW1lcmNlIGRhcGF0IG1lbnlpbXB1bGthbiBkZW5nYW4ga2V5YWtpbmFuIDk1JSBiYWh3YSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBwZXIgdXNlciBzZXRlbGFoIHBlbHVuY3VyYW4gZml0dXIgYmFydSBiZXJhZGEgZGkgYW50YXJhIDExLjk3IGhpbmdnYSAxMy4yMy4gQW5na2EgaW5pIGJpc2EgZGliYW5kaW5na2FuIGRlbmdhbiBkYXRhIGhpc3RvcmlzIHNlYmVsdW0gZml0dXIgZGlsdW5jdXJrYW4gdW50dWsgbWVuZ3VrdXIga2VzdWtzZXNhbiBLUEkuDQoNCi0gKipQZW5nYW1iaWxhbiBLZXB1dHVzYW46KiogUmVudGFuZyBpbmkgbWVtYmVyaWthbiAiYmF0YXMgYW1hbiIgYmFnaSB0aW0gb3BlcmFzaW9uYWwgdW50dWsgbWVtcHJveWVrc2lrYW4gYmViYW4gc2VydmVyIGF0YXUgcGVuZGFwYXRhbiBoYXJpYW4gdGFucGEgaGFueWEgbWVuZ2FuZGFsa2FuIHNhdHUgYW5na2EgcmF0YS1yYXRhIHR1bmdnYWwgeWFuZyBtdW5na2luIGZsdWt0dWF0aWYuDQoNCi0tLQ0KDQojIyBDYXNlIFN0dWR5IDIgDQoNCioqQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgTWVhbiwgJFxzaWdtYSQgVW5rbm93bjoqKiBBICoqVVggUmVzZWFyY2ggdGVhbSoqIGFuYWx5emVzICoqdGFzayBjb21wbGV0aW9uIHRpbWUgKGluIG1pbnV0ZXMpKiogZm9yIGEgbmV3IG1vYmlsZSBhcHBsaWNhdGlvbi4gVGhlIGRhdGEgYXJlIGNvbGxlY3RlZCBmcm9tICoqMTIgdXNlcnMqKjoNCg0KJCQNCjguNCxcOyA3LjksXDsgOS4xLFw7IDguNyxcOyA4LjIsXDsgOS4wLFw7DQo3LjgsXDsgOC41LFw7IDguOSxcOyA4LjEsXDsgOC42LFw7IDguMw0KJCQNCg0KKipUYXNrczoqKg0KDQoxLiBJZGVudGlmeSB0aGUgKiphcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0KiogYW5kIGV4cGxhaW4gd2h5Lg0KMi4gQ29tcHV0ZSB0aGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yOg0KICAgLSAkOTBcJSQNCiAgIC0gJDk1XCUkDQogICAtICQ5OVwlJA0KMy4gVmlzdWFsaXplIHRoZSB0aHJlZSBpbnRlcnZhbHMgb24gYSBzaW5nbGUgcGxvdC4NCjQuIEV4cGxhaW4gaG93ICoqc2FtcGxlIHNpemUgYW5kIGNvbmZpZGVuY2UgbGV2ZWwqKiBpbmZsdWVuY2UgdGhlIGludGVydmFsIHdpZHRoLg0KDQoqKkpBV0FCIDoqKiANCg0KIyMjIElkZW50aWZpa2FzaSBVamkgU3RhdGlzdGlrDQpVamkgc3RhdGlzdGlrIHlhbmcgdGVwYXQgYWRhbGFoIE9uZS1TYW1wbGUgdC10ZXN0ICh0LWludGVydmFsKS4NCg0KLSAqKlN0YW5kYXIgRGV2aWFzaSBQb3B1bGFzaSAoJFxzaWdtYSQpIFRpZGFrIERpa2V0YWh1aToqKiBLaXRhIGhhbnlhIG1lbWlsaWtpIGRhdGEgc2FtcGVsLCBzZWhpbmdnYSBoYXJ1cyBtZW5nZ3VuYWthbiBzdGFuZGFyIGRldmlhc2kgc2FtcGVsICgkcyQpLg0KDQotICoqVWt1cmFuIFNhbXBlbCBLZWNpbDoqKiBKdW1sYWggc2FtcGVsIGhhbnlhICRuID0gMTIkICgkbiA8IDMwJCkuIERhbGFtIGtvbmRpc2kgaW5pLCBkaXN0cmlidXNpLSR0JCBsZWJpaCBha3VyYXQgZGFyaXBhZGEgZGlzdHJpYnVzaS0keiQgdW50dWsgbWVuZ2Frb21vZGFzaSBrZXRpZGFrcGFzdGlhbiBla3N0cmEgZGFyaSBzYW1wZWwga2VjaWwuDQoNCiMjIyAgUGVyaGl0dW5nYW4gQ29uZmlkZW5jZSBJbnRlcnZhbHMgRGF0YToNCg0KJDguNCwgNy45LCA5LjEsIDguNywgOC4yLCA5LjAsIDcuOCwgOC41LCA4LjksIDguMSwgOC42LCA4LjMkDQoNCi0gKipNZWFuIFNhbXBlbCAoJFxiYXJ7eH0kKToqKiAkOC40NTgkDQoNCi0gKipTdGFuZGFyIERldmlhc2kgU2FtcGVsICgkcyQpOioqICQwLjQxMiQNCg0KLSAqKkRlZ3JlZXMgb2YgRnJlZWRvbSAoJGRmJCk6KiogJG4gLSAxID0gMTEkDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIERhdGEgZGFyaSBHYW1iYXIgMg0KZGF0YV90IDwtIGRhdGEuZnJhbWUoDQogICJDb25maWRlbmNlIExldmVsIiA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogICJ0LXNjb3JlIChkZj0xMSkiID0gYygxLjc5NiwgMi4yMDEsIDMuMTA2KSwNCiAgIk1hcmdpbiBvZiBFcnJvciIgPSBjKDAuMjE0LCAwLjI2MiwgMC4zNjkpLA0KICAiTG93ZXIgQm91bmQiID0gYyg4LjI0NCwgOC4xOTYsIDguMDg5KSwNCiAgIlVwcGVyIEJvdW5kIiA9IGMoOC42NzIsIDguMTk2LCA4LjgyNyksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCg0Ka25pdHI6OmthYmxlKGRhdGFfdCwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiSGFzaWwgRXN0aW1hc2kgRGlzdHJpYnVzaSBUIikNCg0KYGBgDQoNCiMjIyBWaXN1YWxpc2FzaSBQZXJiYW5kaW5nYW4gDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyAxLiBEYXRhIElucHV0DQp3YWt0dV90dWdhcyA8LSBjKDguNCwgNy45LCA5LjEsIDguNywgOC4yLCA5LjAsIDcuOCwgOC41LCA4LjksIDguMSwgOC42LCA4LjMpDQpuIDwtIGxlbmd0aCh3YWt0dV90dWdhcykNCm1lYW5feCA8LSBtZWFuKHdha3R1X3R1Z2FzKQ0Kc2RfeCA8LSBzZCh3YWt0dV90dWdhcykNCnNlIDwtIHNkX3ggLyBzcXJ0KG4pDQoNCiMgMi4gRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgQ0kNCmNhbGNfY2kgPC0gZnVuY3Rpb24obGV2ZWwpIHsNCiAgYWxwaGEgPC0gMSAtIGxldmVsDQogIHRfc2NvcmUgPC0gcXQoMSAtIGFscGhhLzIsIGRmID0gbiAtIDEpDQogIG1vZSA8LSB0X3Njb3JlICogc2UNCiAgcmV0dXJuKGMobG93ZXIgPSBtZWFuX3ggLSBtb2UsIHVwcGVyID0gbWVhbl94ICsgbW9lKSkNCn0NCg0KIyAzLiBNZW1idWF0IERhdGEgRnJhbWUgdW50dWsgUGxvdA0KbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCmNpX3Jlc3VsdHMgPC0gdChzYXBwbHkobGV2ZWxzLCBjYWxjX2NpKSkNCmRmX3Bsb3QgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZSA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTWVhbiA9IG1lYW5feCwNCiAgTG93ZXIgPSBjaV9yZXN1bHRzWywxXSwNCiAgVXBwZXIgPSBjaV9yZXN1bHRzWywyXQ0KKQ0KDQojIDQuIFZpc3VhbGlzYXNpIGRlbmdhbiBnZ3Bsb3QyDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGZfcGxvdCwgYWVzKHggPSBDb25maWRlbmNlLCB5ID0gTWVhbikpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIsIGNvbG9yID0gQ29uZmlkZW5jZSksIHdpZHRoID0gMC4zLCBzaXplID0gMS4yKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJVWCBSZXNlYXJjaDogVGFzayBDb21wbGV0aW9uIFRpbWUgQ29uZmlkZW5jZSBJbnRlcnZhbHMiLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlNhbXBsZSBTaXplIChuKSA9IiwgbiwgInwgTWVhbiA9Iiwgcm91bmQobWVhbl94LCAzKSksDQogICAgICAgeSA9ICJXYWt0dSAoTWVuaXQpIiwgeCA9ICJDb25maWRlbmNlIExldmVsIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQpgYGANCg0KIyMjIFBlbmdhcnVoIFVrdXJhbiBTYW1wZWwgZGFuIENvbmZpZGVuY2UgTGV2ZWwNCg0KLSAqKkNvbmZpZGVuY2UgTGV2ZWw6KiogU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiAobWlzYWwgZGFyaSA5MCUga2UgOTklKSwgc2VtYWtpbiBsZWJhciBpbnRlcnZhbG55YS4gSGFsIGluaSBrYXJlbmEga2l0YSBtZW1idXR1aGthbiByZW50YW5nIHlhbmcgbGViaWggbHVhcyBhZ2FyIGxlYmloIHlha2luIGJhaHdhIHBhcmFtZXRlciBwb3B1bGFzaSBiZW5hci1iZW5hciBhZGEgZGkgZGFsYW1ueWEuDQoNCi0gKipTYW1wbGUgU2l6ZSAoJG4kKToqKiBTZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwsIHNlbWFraW4gc2VtcGl0IGludGVydmFsbnlhLiBTZWNhcmEgbWF0ZW1hdGlzLCAkbiQgYmVyYWRhIGRpIHBlbnllYnV0IGRhbGFtIHJ1bXVzIFN0YW5kYXJkIEVycm9yICgkcy9cc3FydHtufSQpLiBTYW1wZWwgeWFuZyBsZWJpaCBiZXNhciBtZW5ndXJhbmdpIHZhcmlhYmlsaXRhcyBlc3RpbWFzaSwgc2VoaW5nZ2EgbWVuZ2hhc2lsa2FuIHByZXNpc2kgeWFuZyBsZWJpaCB0aW5nZ2kuDQoNCi0tLQ0KDQojIyBDYXNlIFN0dWR5IDMgDQoNCioqQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgYSBQcm9wb3J0aW9uLCBBL0IgVGVzdGluZzoqKiBBIGRhdGEgc2NpZW5jZSB0ZWFtIHJ1bnMgYW4gKipBL0IgdGVzdCoqIG9uIGEgbmV3ICpDYWxsLVRvLUFjdGlvbiAoQ1RBKSogYnV0dG9uIGRlc2lnbi4gVGhlIGV4cGVyaW1lbnQgeWllbGRzOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDQwMCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTU2IFxxdWFkIFx0ZXh0eyh1c2VycyB3aG8gY2xpY2tlZCB0aGUgQ1RBKX0NClxlbmR7ZXFuYXJyYXkqfQ0KJCQNCg0KKipUYXNrczoqKg0KDQoxLiBDb21wdXRlIHRoZSAqKnNhbXBsZSBwcm9wb3J0aW9uKiogJFxoYXR7cH0kLg0KMi4gQ29tcHV0ZSBDb25maWRlbmNlIEludGVydmFscyBmb3IgdGhlIHByb3BvcnRpb24gYXQ6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpemUgYW5kIGNvbXBhcmUgdGhlIHRocmVlIGludGVydmFscy4NCjQuIEV4cGxhaW4gaG93IGNvbmZpZGVuY2UgbGV2ZWwgYWZmZWN0cyBkZWNpc2lvbi1tYWtpbmcgaW4gcHJvZHVjdCBleHBlcmltZW50cy4NCg0KKipKQVdBQiA6KiogDQoNCiMjIyBIaXR1bmcgUHJvcG9yc2kgU2FtcGVsKCRcaGF0e3B9JCkNCg0KQmVyZGFzYXJrYW4gZGF0YSBla3NwZXJpbWVuOg0KDQotIFRvdGFsIHBlbmdndW5hICgkbiQpID0gNDAwDQotIFBlbmdndW5hIHlhbmcgbWVuZ2tsaWsgQ1RBICgkeCQpID0gMTU2DQoNCiQkXGhhdHtwfSA9IFxmcmFje3h9e259ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOSQkDQpKYWRpLCBwcm9wb3JzaSBzYW1wZWxueWEgYWRhbGFoIDAuMzkgYXRhdSAzOSUuDQoNCiMjIyBIaXR1bmcgQ29uZmlkZW5jZSBJbnRlcnZhbHMgdW50dWsgUHJvcG9yc2kNClJ1bXVzIHlhbmcgZGlndW5ha2FuIGFkYWxhaDogDQokXGhhdHtwfSBccG0geiBcY2RvdCBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSQNCkRpIG1hbmEgU3RhbmRhcmQgRXJyb3IgKCRTRSQpIGFkYWxhaDogJFxzcXJ0e1xmcmFjezAuMzkgXGNkb3QgMC42MX17NDAwfX0gXGFwcHJveCAwLjAyNDM5JA0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxsIHBha2V0IGppa2EgYmVsdW0gYWRhDQojIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiMgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTWVtYnVhdCBkYXRhDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIGBDb25maWRlbmNlIExldmVsYCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIGBOaWxhaSBLcml0aXMgKHopYCA9IGMoMS42NDUsIDEuOTYwLCAyLjU3NiksDQogIGBNYXJnaW4gb2YgRXJyb3JgID0gYygwLjA0MDEsIDAuMDQ3OCwgMC4wNjI4KSwNCiAgYExvd2VyIEJvdW5kYCA9IGMoMC4zNDk5LCAwLjM0MjIsIDAuMzI3MiksDQogIGBVcHBlciBCb3VuZGAgPSBjKDAuNDMwMSwgMC40Mzc4LCAiMC40NTI4KiIpDQopDQoNCiMgTWVtYnVhdCB0YWJlbCBiZXJnYXlhIHByb2Zlc2lvbmFsDQprYWJsZShkYXRhLCBhbGlnbiA9ICJsY2NjYyIsIGNhcHRpb24gPSAiVGFiZWwgSW50ZXJ2YWwgS2VwZXJjYXlhYW4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiANCmBgYCB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyAxLiBQZXJzaWFwYW4gRGF0YQ0KbiA8LSA0MDANCnggPC0gMTU2DQpwX2hhdCA8LSB4IC8gbg0Kc2UgPC0gc3FydCgocF9oYXQgKiAoMSAtIHBfaGF0KSkgLyBuKQ0KDQpsZXZlbHMgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0Kel9zY29yZXMgPC0gYygxLjY0NSwgMS45NjAsIDIuNTc2KQ0KbW9lIDwtIHpfc2NvcmVzICogc2UNCg0KZGZfcHJvcG9ydGlvbiA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlID0gZmFjdG9yKGMoIjkwJSIsICI5NSUiLCAiOTklIiksIGxldmVscyA9IGMoIjk5JSIsICI5NSUiLCAiOTAlIikpLA0KICBMb3dlciA9IHBfaGF0IC0gbW9lLA0KICBVcHBlciA9IHBfaGF0ICsgbW9lLA0KICBNZWFuID0gcF9oYXQNCikNCg0KIyAyLiBWaXN1YWxpc2FzaSBkZW5nYW4gZ2dwbG90Mg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRmX3Byb3BvcnRpb24sIGFlcyh4ID0gQ29uZmlkZW5jZSwgeSA9IE1lYW4pKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyLCBjb2xvciA9IENvbmZpZGVuY2UpLCB3aWR0aCA9IDAuMywgc2l6ZSA9IDEuMikgKw0KICBnZW9tX3BvaW50KHNpemUgPSA0KSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgbGFicyh0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyBmb3IgQ1RBIENsaWNrIFByb3BvcnRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlNhbXBsZSBQcm9wb3J0aW9uID0iLCBwX2hhdCAqIDEwMCwgIiUgfCBuID0gNDAwIiksDQogICAgICAgeSA9ICJQcm9wb3JzaSBLbGlrICglKSIsIHggPSAiVGluZ2thdCBLZXBlcmNheWFhbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQogICANCg0KDQpgYGANCg0KIyMjIFBlbmdhcnVoIENvbmZpZGVuY2UgTGV2ZWwgZGFsYW0gUGVuZ2FtYmlsYW4gS2VwdXR1c2FuIFByb2R1aw0KRGFsYW0ga29udGVrcyBla3NwZXJpbWVuIHByb2R1ayAoQS9CIFRlc3RpbmcpLCB0aW5na2F0IGtlcGVyY2F5YWFuIHNhbmdhdCBtZW1wZW5nYXJ1aGkga2VwdXR1c2FuOg0KDQotICoqVG9sZXJhbnNpIFJpc2lrbzoqKiBUaW5na2F0IGtlcGVyY2F5YWFuIDk1JSBhZGFsYWggc3RhbmRhciBpbmR1c3RyaS4gSmlrYSBraXRhIG1lbmdndW5ha2FuIDk5JSwga2l0YSBtZW5qYWRpIHNhbmdhdCBrb25zZXJ2YXRpZuKAlGtpdGEgYnV0dWggYnVrdGkgeWFuZyBzYW5nYXQga3VhdCBzZWJlbHVtIG1lbnlhdGFrYW4gc3VhdHUgZGVzYWluIENUQSBsZWJpaCBiYWlrLiBJbmkgbWVuZ3VyYW5naSByaXNpa28gRmFsc2UgUG9zaXRpdmUgKG1lbnlhdGFrYW4gYWRhIGVmZWsgcGFkYWhhbCB0aWRhayBhZGEpLg0KDQotICoqS2VjZXBhdGFuIHZzIEtlcGFzdGlhbjoqKiBUaW5na2F0IGtlcGVyY2F5YWFuIDkwJSBtZW5naGFzaWxrYW4gaW50ZXJ2YWwgeWFuZyBsZWJpaCBzZW1waXQsIHlhbmcgbWVtdW5na2lua2FuIHBlbmdhbWJpbGFuIGtlcHV0dXNhbiBsZWJpaCBjZXBhdCBkZW5nYW4gZGF0YSB5YW5nIGxlYmloIHNlZGlraXQsIG5hbXVuIGRlbmdhbiByaXNpa28ga2VzYWxhaGFuIHlhbmcgbGViaWggdGluZ2dpICgxMCUpLg0KDQotICoqQXBsaWthc2kgUHJha3RpczoqKiBKaWthIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIGRlc2FpbiBiYXJ1IHRpZGFrIHR1bXBhbmcgdGluZGloIChvdmVybGFwKSBkZW5nYW4gcGVyZm9ybWEgZGVzYWluIGxhbWEsIHRpbSBwcm9kdWsgZGFwYXQgZGVuZ2FuIHBlcmNheWEgZGlyaSBtZWx1bmN1cmthbiBmaXR1ciB0ZXJzZWJ1dC4gU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiwgc2VtYWtpbiBiZXNhciBrZXlha2luYW4gYmlzbmlzIGJhaHdhIHBlbmluZ2thdGFuIG1ldHJpayBidWthbiB0ZXJqYWRpIGthcmVuYSBrZWJldHVsYW4uDQoNCg0KIyMgQ2FzZSBTdHVkeSA0IA0KDQoqKlByZWNpc2lvbiBDb21wYXJpc29uIChaLVRlc3QgdnMgdC1UZXN0KToqKiBUd28gZGF0YSB0ZWFtcyBtZWFzdXJlICoqQVBJIGxhdGVuY3kgKGluIG1pbGxpc2Vjb25kcykqKiB1bmRlciBkaWZmZXJlbnQgY29uZGl0aW9ucy4NCg0KXGJlZ2lue2VxbmFycmF5Kn0NClx0ZXh0e1RlYW0gQTp9IFxcDQpuICY9JiAzNiBccXVhZCBcdGV4dHsoc2FtcGxlIHNpemUpfSBcXA0KXGJhcnt4fSAmPSYgMjEwIFxxdWFkIFx0ZXh0eyhzYW1wbGUgbWVhbil9IFxcDQpcc2lnbWEgJj0mIDI0IFxxdWFkIFx0ZXh0eyhrbm93biBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbil9IFxcWzZwdF0NCg0KXHRleHR7VGVhbSBCOn0gXFwNCm4gJj0mIDM2IFxxdWFkIFx0ZXh0eyhzYW1wbGUgc2l6ZSl9IFxcDQpcYmFye3h9ICY9JiAyMTAgXHF1YWQgXHRleHR7KHNhbXBsZSBtZWFuKX0gXFwNCnMgJj0mIDI0IFxxdWFkIFx0ZXh0eyhzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uKX0NClxlbmR7ZXFuYXJyYXkqfQ0KDQoqKlRhc2tzKioNCg0KMS4gSWRlbnRpZnkgdGhlIHN0YXRpc3RpY2FsIHRlc3QgdXNlZCBieSBlYWNoIHRlYW0uDQoyLiBDb21wdXRlIENvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvciAqKjkwJSwgOTUlLCBhbmQgOTklKiouDQozLiBDcmVhdGUgYSB2aXN1YWxpemF0aW9uIGNvbXBhcmluZyBhbGwgaW50ZXJ2YWxzLg0KNC4gRXhwbGFpbiB3aHkgdGhlICoqaW50ZXJ2YWwgd2lkdGhzIGRpZmZlcioqLCBldmVuIHdpdGggc2ltaWxhciBkYXRhLg0KDQoNCioqSkFXQUI6KioNCg0KIyMjIElkZW50aWZpa2FzaSBVamkgU3RhdGlzdGlrDQpLZWR1YSB0aW0gbWVtaWxpa2kgdWt1cmFuIHNhbXBlbCB5YW5nIHNhbWEgKCRuID0gMzYkKSwgbmFtdW4gcGVyYmVkYWFuIHRlcmxldGFrIHBhZGEgaW5mb3JtYXNpIHN0YW5kYXIgZGV2aWFzaSB5YW5nIHRlcnNlZGlhOg0KDQotICoqVGVhbSBBIChaLVRlc3QpOioqIE1lbmdndW5ha2FuIFotVGVzdCBrYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICgkXHNpZ21hJCkgZGlrZXRhaHVpLg0KDQotICoqVGVhbSBCICh0LVRlc3QpOioqIE1lbmdndW5ha2FuIHQtVGVzdCBrYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSwgc2VoaW5nZ2EgbWVuZ2d1bmFrYW4gc3RhbmRhciBkZXZpYXNpIHNhbXBlbCAoJHMkKS4NCg0KIyMjIFBlcmhpdHVuZ2FuIENvbmZpZGVuY2UgSW50ZXJ2YWwgKENJKQ0KUnVtdXMgdW11bTogJFxiYXJ7eH0gXHBtIChcdGV4dHtDcml0aWNhbCBWYWx1ZX0gXHRpbWVzIFxmcmFje1x0ZXh0e3N0ZCBkZXZ9fXtcc3FydHtufX0pJA0KRGVuZ2FuIFN0YW5kYXJkIEVycm9yICgkU0UkKSA9ICRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEgZnJhbWUNCnRlYW1fYV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIGBDb25maWRlbmNlIExldmVsYCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIGBOaWxhaSBLcml0aXMgKHoqKWAgPSBjKDEuNjQ1LCAxLjk2MCwgMi41NzYpLA0KICBgUGVyaGl0dW5nYW4gKHoqIHggNClgID0gYyg2LjU4LCA3Ljg0LCAxMC4zMCksDQogIGBMb3dlciBCb3VuZCAobXMpYCA9IGMoMjAzLjQyLCAyMDIuMTYsIDE5OS43MCksDQogIGBVcHBlciBCb3VuZCAobXMpYCA9IGMoMjE2LjU4LCAyMTcuODQsIDIyMC4zMCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbCBhZ2FyIG11bmN1bCBkaSBSUHVicw0Ka2FibGUodGVhbV9hX2RhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIEludGVydmFsIEtlcGVyY2F5YWFuIFRlYW0gQSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCANCiAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIikNCg0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGZyYW1lIFRlYW0gQg0KdGVhbV9iIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBDcml0aWNhbF9WYWx1ZSA9IGMoMS42ODksIDIuMDMwLCAyLjcyNCksDQogIENhbGN1bGF0aW9uID0gYygiMjEwIMKxIDYuNzYiLCAiMjEwIMKxIDguMTIiLCAiMjEwIMKxIDEwLjkwIiksDQogIExvd2VyX0JvdW5kID0gYygyMDMuMjQsIDIwMS44OCwgMTk5LjEwKSwNCiAgVXBwZXJfQm91bmQgPSBjKDIxNi43NiwgMjE4LjEyLCAyMjAuOTApDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwgSFRNTCB5YW5nIGtvbXBhdGliZWwgZGVuZ2FuIFJQdWJzDQprYWJsZSh0ZWFtX2IsIGNvbC5uYW1lcyA9IGMoIkNvbmZpZGVuY2UgTGV2ZWwiLCAidC1zY29yZSAodCopIiwgIlBlcmhpdHVuZ2FuIiwgIkxvd2VyIEJvdW5kIiwgIlVwcGVyIEJvdW5kIiksDQogICAgICBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBJbnRlcnZhbCBLZXBlcmNheWFhbiBUZWFtIEIiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KIyMjIFZpc3VhbGlzYXNpIFBlcmJhbmRpbmdhbiANCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgMS4gUGFyYW1ldGVyIERhdGENCm4gPC0gMzYNCm1lYW5fdmFsIDwtIDIxMA0Kc2RfdmFsIDwtIDI0DQpzZSA8LSBzZF92YWwgLyBzcXJ0KG4pIA0KZGYgPC0gbiAtIDENCmNvbmZfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCg0KIyAyLiBNZW1idWF0IERhdGEgRnJhbWUgUGVyaGl0dW5nYW4NCnBsb3RfZGF0YSA8LSBkYXRhLmZyYW1lKCkNCg0KZm9yIChjbCBpbiBjb25mX2xldmVscykgew0KICAjIFRlYW0gQSAoWi1UZXN0KQ0KICB6X2NyaXQgPC0gcW5vcm0oMSAtICgxIC0gY2wpIC8gMikNCiAgbW9lX3ogPC0gel9jcml0ICogc2UNCiAgcGxvdF9kYXRhIDwtIHJiaW5kKHBsb3RfZGF0YSwgZGF0YS5mcmFtZSgNCiAgICBUZWFtID0gIlRlYW0gQSAoWi1UZXN0OiBEaWtldGFodWkgU2lnbWEpIiwNCiAgICBDTCA9IHBhc3RlMChjbCAqIDEwMCwgIiUiKSwNCiAgICBMb3dlciA9IHJvdW5kKG1lYW5fdmFsIC0gbW9lX3osIDIpLA0KICAgIFVwcGVyID0gcm91bmQobWVhbl92YWwgKyBtb2VfeiwgMikNCiAgKSkNCiAgDQogICMgVGVhbSBCICh0LVRlc3QpDQogIHRfY3JpdCA8LSBxdCgxIC0gKDEgLSBjbCkgLyAyLCBkZiA9IGRmKQ0KICBtb2VfdCA8LSB0X2NyaXQgKiBzZQ0KICBwbG90X2RhdGEgPC0gcmJpbmQocGxvdF9kYXRhLCBkYXRhLmZyYW1lKA0KICAgIFRlYW0gPSAiVGVhbSBCICh0LVRlc3Q6IFBha2FpIFNhbXBlbCBzKSIsDQogICAgQ0wgPSBwYXN0ZTAoY2wgKiAxMDAsICIlIiksDQogICAgTG93ZXIgPSByb3VuZChtZWFuX3ZhbCAtIG1vZV90LCAyKSwNCiAgICBVcHBlciA9IHJvdW5kKG1lYW5fdmFsICsgbW9lX3QsIDIpDQogICkpDQp9DQoNCiMgMy4gTWVtYnVhdCBWaXN1YWxpc2FzaQ0KIyBlY2hvPUZBTFNFIHBhZGEgY2h1bmsgaW5pIG1lbmphbWluIGhhbnlhIGdhbWJhciB5YW5nIHRhbXBpbA0KZ2dwbG90KHBsb3RfZGF0YSwgYWVzKHggPSBDTCwgeSA9IG1lYW5fdmFsLCBjb2xvciA9IFRlYW0pKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgDQogICAgICAgICAgICAgICAgd2lkdGggPSAwLjQsIGxpbmV3aWR0aCA9IDEuMiwgDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjYpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjYpLCBzaXplID0gMykgKw0KICBnZW9tX3RleHQoYWVzKHkgPSBMb3dlciwgbGFiZWwgPSBMb3dlciksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjYpLCB2anVzdCA9IC0xLjUsIHNpemUgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIGdlb21fdGV4dChhZXMoeSA9IFVwcGVyLCBsYWJlbCA9IFVwcGVyKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNiksIHZqdXN0ID0gLTEuNSwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJQZXJiYW5kaW5nYW4gSW50ZXJ2YWwgS2VwZXJjYXlhYW4gKEFQSSBMYXRlbmN5KSIsDQogICAgICAgc3VidGl0bGUgPSAiVGltIEIgKHQtdGVzdCkgbWVtaWxpa2kgaW50ZXJ2YWwgbGViaWggbGViYXIgdW50dWsgbWVuZ2Frb21vZGFzaSBlc3RpbWFzaSBzdGFuZGFyIGRldmlhc2kgc2FtcGVsLiIsDQogICAgICAgeCA9ICJDb25maWRlbmNlIExldmVsIiwNCiAgICAgICB5ID0gIkxhdGVuY3kgKG1zKSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhOiBuPTM2LCBNZWFuPTIxMCwgU0Q9MjQgfCBBbmdrYSBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCAmIGF0YXMgQ0kiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyYzNlNTAiLCAiI2U3NGMzYyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KIyMjIEFuYWxpc2lzIFBlcmJlZGFhbiBMZWJhciBJbnRlcnZhbA0KTWVza2lwdW4gbmlsYWkgJFxiYXJ7eH0kLCAkbiQsIGRhbiBhbmdrYSBzdGFuZGFyIGRldmlhc2lueWEgc2FtYSAoMjQpLCBpbnRlcnZhbCBUZWFtIEIgbGViaWggbGViYXIga2FyZW5hIGFsYXNhbiBiZXJpa3V0Og0KDQoqKjEuKiogS2V0aWRha3Bhc3RpYW4gVGFtYmFoYW46IFRlYW0gQiBtZW5nZ3VuYWthbiBzdGFuZGFyIGRldmlhc2kgc2FtcGVsICgkcyQpLCB5YW5nIG1lcnVwYWthbiBlc3RpbWFzaS4gRGlzdHJpYnVzaS10IG1lbWlsaWtpICJla29yIHlhbmcgbGViaWggdGViYWwiIChoZWF2aWVyIHRhaWxzKSB1bnR1ayBtZW5nb21wZW5zYXNpIGtldGlkYWtwYXN0aWFuIGVzdGltYXNpIHRlcnNlYnV0Lg0KDQoqKjIuKiogTmlsYWkgS3JpdGlzOiBOaWxhaSBrcml0aXMgJHQkIHNlbGFsdSBsZWJpaCBiZXNhciBkYXJpcGFkYSBuaWxhaSBrcml0aXMgJHokIHVudHVrIHVrdXJhbiBzYW1wZWwgeWFuZyBzYW1hICgkdF4gPiB6XiQpLg0KDQoqKjMuKiogS29uc2VydmF0aXNtZTogUGVuZGVrYXRhbiB0LXRlc3QgbGViaWgga29uc2VydmF0aWYgKG1lbmdoYXNpbGthbiBtYXJnaW4gb2YgZXJyb3IgbGViaWggYmVzYXIpIHVudHVrIG1lbWFzdGlrYW4gYmFod2EgcGFyYW1ldGVyIHBvcHVsYXNpIGJlbmFyLWJlbmFyIHRlcmNha3VwIGRhbGFtIGludGVydmFsIGtldGlrYSBpbmZvcm1hc2kgcG9wdWxhc2kgdGlkYWsgbGVuZ2thcC4NCg0KIyMgQ2FzZSBTdHVkeSA1DQoNCioqT25lLVNpZGVkIENvbmZpZGVuY2UgSW50ZXJ2YWw6KiogQSAqKlNvZnR3YXJlIGFzIGEgU2VydmljZSAoU2FhUykqKiBjb21wYW55IHdhbnRzIHRvIGVuc3VyZSB0aGF0ICoqYXQgbGVhc3QgNzAlIG9mIHdlZWtseSBhY3RpdmUgdXNlcnMqKiB1dGlsaXplIGEgcHJlbWl1bSBmZWF0dXJlLg0KDQpGcm9tIHRoZSBleHBlcmltZW50Og0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDI1MCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTg1IFxxdWFkIFx0ZXh0eyhhY3RpdmUgcHJlbWl1bSB1c2Vycyl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCk1hbmFnZW1lbnQgaXMgb25seSBpbnRlcmVzdGVkIGluIHRoZSAqKmxvd2VyIGJvdW5kKiogb2YgdGhlIGVzdGltYXRlLg0KDQoqKlRhc2tzOioqDQoNCjEuIElkZW50aWZ5IHRoZSAqKnR5cGUgb2YgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGVzdC4NCjIuIENvbXB1dGUgdGhlICoqb25lLXNpZGVkIGxvd2VyIENvbmZpZGVuY2UgSW50ZXJ2YWwqKiBhdDoNCiAgIC0gJDkwXCUkDQogICAtICQ5NVwlJA0KICAgLSAkOTlcJSQNCjMuIFZpc3VhbGl6ZSB0aGUgbG93ZXIgYm91bmRzIGZvciBhbGwgY29uZmlkZW5jZSBsZXZlbHMuDQo0LiBEZXRlcm1pbmUgd2hldGhlciB0aGUgKio3MCUgdGFyZ2V0KiogaXMgc3RhdGlzdGljYWxseSBzYXRpc2ZpZWQuDQoNCioqSkFXQUI6KioNCg0KIyMjIElkZW50aWZpa2FzaSBUaXBlIENvbmZpZGVuY2UgSW50ZXJ2YWwgZGFuIFVqaSB5YW5nIFRlcGF0DQotICoqVGlwZSBDb25maWRlbmNlIEludGVydmFsOioqIE1lbmdndW5ha2FuIE9uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEludGVydmFsIGthcmVuYSBtYW5hamVtZW4gaGFueWEgdGVydGFyaWsgcGFkYSBiYXRhcyBiYXdhaCAobG93ZXIgYm91bmQpIHVudHVrIG1lbWFzdGlrYW4gcHJvcG9yc2kgcGVuZ2d1bmEgbWluaW1hbCBtZW5jYXBhaSB0YXJnZXQgdGVydGVudHUuDQoNCi0gKipVamkgU3RhdGlzdGlrOioqIE1lbmdndW5ha2FuIFotdGVzdCB1bnR1ayBQcm9wb3JzaSAoWi10ZXN0IGZvciBhIHNpbmdsZSBwcm9wb3J0aW9uKSBrYXJlbmEgZGF0YSBiZXJ1cGEgcHJvcG9yc2kgYmlub21pbmFsIChha3RpZi90aWRhayBha3RpZikgZGVuZ2FuIHVrdXJhbiBzYW1wZWwgeWFuZyBiZXNhciAoJG49MjUwJCkuDQoNCiMjIyBQZXJoaXR1bmdhbiBPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBJbnRlcnZhbA0KRGlrZXRhaHVpIDogDQoNCi0gJG4gPSAyNTAkJHggPSAxODUkDQoNCi0gUHJvcG9yc2kgc2FtcGVsICgkXGhhdHtwfSQpID0gJFxmcmFjezE4NX17MjUwfSA9IDAuNzQkICg3NCUpDQoNCi0gU3RhbmRhcmQgRXJyb3IgKCRTRSQpID0gJFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19ID0gXHNxcnR7XGZyYWN7MC43NCBcdGltZXMgMC4yNn17MjUwfX0gXGFwcHJveCAwLjAyNzckDQoNCi0gUnVtdXMgTG93ZXIgQm91bmQ6ICRcaGF0e3B9IC0gKHogXHRpbWVzIFNFKSQNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm9uZV9zaWRlZCA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlX0xldmVsID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgWl9zY29yZSA9IGMoMS4yODIsIDEuNjQ1LCAyLjMyNiksDQogIENhbGN1bGF0aW9uID0gYygiMC43NCAtICgxLjI4MiDDlyAwLjAyNzcpIiwgIjAuNzQgLSAoMS42NDUgw5cgMC4wMjc3KSIsICIwLjc0IC0gKDIuMzI2IMOXIDAuMDI3NykiKSwNCiAgTG93ZXJfQm91bmQgPSBjKCI3MC40NSUiLCAiNjkuNDQlIiwgIjY3LjU2JSIpDQopDQoNCmthYmxlKG9uZV9zaWRlZCwgY29sLm5hbWVzID0gYygiQ29uZmlkZW5jZSBMZXZlbCIsICJaLXNjb3JlIChPbmUtU2lkZWQpIiwgIlBlcmhpdHVuZ2FuIiwgIkxvd2VyIEJvdW5kICglKSIpLA0KICAgICAgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgQmF0YXMgQmF3YWggU2F0dSBTaXNpIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRikNCg0KYGBgDQoNCiMjIyBWaXN1YWxpc2FzaSBMb3dlciBCb3VuZHMgDQpgYGAge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBEYXRhIGhhc2lsIHBlcmhpdHVuZ2FuDQpkZiA8LSBkYXRhLmZyYW1lKA0KICBDTCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHM9YygiOTAlIiwgIjk1JSIsICI5OSUiKSksDQogIExvd2VyX0JvdW5kID0gYygwLjcwNDUsIDAuNjk0NCwgMC42NzU2KQ0KKQ0KDQpnZ3Bsb3QoZGYsIGFlcyh4PUNMLCB5PUxvd2VyX0JvdW5kLCBmaWxsPUNMKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjcwLCBjb2xvcj0icmVkIiwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MS41LCB5PTAuNzEsIGxhYmVsPSJUYXJnZXQgNzAlIiwgY29sb3I9InJlZCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCwgbGltaXRzID0gYygwLCAwLjgpKSArDQogIGxhYnModGl0bGU9Ik9uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEludGVydmFsIiwNCiAgICAgICBzdWJ0aXRsZT0iQXBha2FoIGJhdGFzIGJhd2FoIG1lbGV3YXRpIHRhcmdldCA3MCU/IiwNCiAgICAgICB4PSJDb25maWRlbmNlIExldmVsIiwgeT0iTG93ZXIgQm91bmQgKCUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCg0KIyMjIEtlc2ltcHVsYW4gVGFyZ2V0IDcwJQ0KDQpCZXJkYXNhcmthbiBoYXNpbCBhbmFsaXNpcywgYXBha2FoIHRhcmdldCA3MCUgdGVycGVudWhpIHNlY2FyYSBzdGF0aXN0aWs/DQoNCi0gKipQYWRhIFRpbmdrYXQgS2VwZXJjYXlhYW4gOTAlOioqIFRlcnBlbnVoaSwga2FyZW5hIGJhdGFzIGJhd2FoICg3MC40NSUpIG1hc2loIGRpIGF0YXMgdGFyZ2V0IDcwJS4NCg0KLSAqKlBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiA5NSU6KiogVGlkYWsgVGVycGVudWhpIHNlY2FyYSBrZXRhdCwga2FyZW5hIGJhdGFzIGJhd2FoICg2OS40NCUpIHR1cnVuIHNlZGlraXQgZGkgYmF3YWggdGFyZ2V0IDcwJS4NCg0KLSAqKlBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiA5OSU6KiogVGlkYWsgVGVycGVudWhpLCBrYXJlbmEgYmF0YXMgYmF3YWggKDY3LjU2JSkgYmVyYWRhIGRpIGJhd2FoIHRhcmdldC4NCg0KS2VzaW1wdWxhbiBBa2hpcjogTWFuYWplbWVuIGJpc2EgbWVyYXNhIHlha2luIHNlYmVzYXIgOTAlIGJhaHdhIHRhcmdldCB0ZXJjYXBhaSwgbmFtdW4gamlrYSBtZXJla2EgbWVtYnV0dWhrYW4gdGluZ2thdCBrZXlha2luYW4geWFuZyBsZWJpaCB0aW5nZ2kgKDk1JSBhdGF1IDk5JSksIGRhdGEgc2FhdCBpbmkgYmVsdW0gY3VrdXAga3VhdCB1bnR1ayBtZW5qYW1pbiB0YXJnZXQgNzAlIHRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrLg0KDQoNCg0KDQo=