Pemusatan Data

Mean,Median,Modus

Foto Kelompok

Praktikum 1

Tabel Data Kelompok

Tabel Data Kelompok untuk Mean, Median, dan Modus
Nilai_Siswa Frekuensi..f_i.
40 - 50 5
51 - 60 8
61 - 70 10
71 - 80 7
81 - 90 4

Mean (Rata-rata)

Untuk pertama kita bisa melakukan perhitungan untuk mencarinilai tenggah nya, selanjutnya kita bisa mencari mean(Rata-rata).

Berikut Rumus untuk menghitung mean adalah sebagai berikut:

f : frekuensi

x : nilai tengah dari setiap kelompok nilai

1. Mean (Rata-rata)

Rumus mean:
\[ \text{Mean} = \frac{\Sigma (f \cdot x)}{\Sigma f} \]

Nilai tengah (\(x\)) dihitung untuk tiap kelompok:

  • 40 - 50: \(\frac{40 + 50}{2} = 45\)

  • 51 - 60: \(\frac{51 + 60}{2} = 55.5\)

  • 61 - 70: \(\frac{61 + 70}{2} = 65.5\)

  • 71 - 80: \(\frac{71 + 80}{2} = 75.5\)

  • 81 - 90: \(\frac{81 + 90}{2} = 85.5\)

Perhitungan: \[ \text{Mean} = \frac{(5 \cdot 45) + (8 \cdot 55.5) + (10 \cdot 65.5) + (7 \cdot 75.5) + (4 \cdot 85.5)}{5 + 8 + 10 + 7 + 4} \]

\[ \text{Mean} = \frac{225 + 444 + 655 + 528.5 + 342}{34} \approx 64.54 \]

Hasil: Mean (rata-rata) Nilai siswa adalah 64.54. —

Data: dua skenario, satu dengan outliers, satu tanpa outliers

Membuat visual Histogram

  • Sebelum Outliers: Mean memberikan gambaran yang lebih representatif tentang rata-rata nilai siswa karena semua data berada dalam rentang nilai yang wajar.

Sebagai contoh: Mean (tanpa outliers): 67.6 (bergantung pada data asli).

  • Sesudah Outliers: Mean menjadi lebih tinggi karena outliers berupa nilai ekstrem (misalnya 120, 130) sangat memengaruhi hasil perhitungan.

Contoh: Mean (dengan outliers): 75.3.

  • Kesimpulan: Mean adalah ukuran yang sangat sensitif terhadap outliers. Dalam analisis nilai siswa, jika terdapat siswa dengan nilai yang jauh lebih tinggi atau rendah dibandingkan lainnya, mean tidak lagi mencerminkan performa rata-rata siswa dengan baik.

Median(Nilai Tenggah)

selanjutnya kita dapat mencari median nya dengan rincian sebagai berikut:

2. Median

Rumus median: \[ \text{Median} = L + \left( \frac{\frac{N}{2} - F}{f_m} \right) \cdot c \]

Parameter: - Total frekuensi (\(N\)) = 34

  • Posisi median: \(\frac{N}{2} = 17\)

  • Kelas median: 61 - 70

    • \(L = 61\) (batas bawah kelas median)

    • \(F = 13\) (frekuensi kumulatif sebelum kelas median)

    • \(f_m = 10\) (frekuensi kelas median)

    • \(c = 10\) (panjang kelas)

Perhitungan: \[ \text{Median} = 61 + \left( \frac{17 - 13}{10} \right) \cdot 10 \] \[ \text{Median} = 61 + 4 = 65 \]


Data: dua skenario, satu dengan outliers, satu tanpa outliers

Membuat visual Histogram

  • Sebelum Outliers: Median dihitung berdasarkan posisi data, sehingga tetap berada di tengah-tengah distribusi. Nilai median tanpa outliers adalah sekitar 64.5, mencerminkan bahwa separuh siswa mendapat nilai di atas, dan separuh di bawah.

  • Sesudah Outliers: Median tetap tidak berubah, yaitu sekitar 64.5, karena outliers hanya memengaruhi ujung distribusi, tidak memengaruhi posisi tengah data.

  • Kesimpulan: Median adalah ukuran yang tidak sensitif terhadap outliers, sehingga memberikan gambaran yang lebih stabil dan akurat tentang nilai tengah siswa, terutama jika terdapat nilai ekstrem.

Modus(Paling sering muncul)

pada tahap terakhir kita dapat mencari nilai modusnya dengan rincian sebagai berikut:

3. Modus

Rumus modus: \[ \text{Modus} = L + \left( \frac{f_m - f_1}{(f_m - f_1) + (f_m - f_2)} \right) \cdot c \]

Parameter: - Kelas modus: 61 - 70

  • \(L = 61\)

  • \(f_m = 10\)

  • \(f_1 = 8\) (frekuensi kelas sebelum kelas modus)

  • \(f_2 = 7\) (frekuensi kelas setelah kelas modus)

  • \(c = 10\)

Perhitungan: \[ \text{Modus} = 61 + \left( \frac{10 - 8}{(10 - 8) + (10 - 7)} \right) \cdot 10 \] \[ \text{Modus} = 61 + \left( \frac{2}{2 + 3} \right) \cdot 10 \] \[ \text{Modus} = 61 + 4 = 65 \]


Data: dua skenario, satu dengan outliers, satu tanpa outliers

Membuat visual Histogram

  • Sebelum Outliers: Modus adalah nilai atau kelompok nilai yang paling sering muncul. Dalam data ini, modus berada pada kelas 61–70 (nilai tengah: 64.5), karena memiliki frekuensi tertinggi (10 siswa).

  • Sesudah Outliers: Modus tetap tidak berubah, yaitu pada kelas 61–70 (nilai tengah: 64.5), karena outliers tidak mengubah jumlah frekuensi tertinggi.

  • Kesimpulan: Modus juga tidak sensitif terhadap outliers, menjadikannya ukuran yang stabil untuk menggambarkan performa nilai mayoritas siswa. Namun, modus hanya cocok digunakan jika data memiliki nilai yang sering muncul secara signifikan.

Praktikum 2

Bisnis

Pada bidang bisnis,saya memilih tabel kelompok data kosmetik. Saya memilih parfum sebagai objek pemusatan datanya. Dengan rincian sebagai berikut.

Tabel Data Kelompok

Data Awal

Tabel Data Kelompok untuk
Kelompok_Harga_parfum Frekuensi..f_i. Titik_Tengah
50.000 - 100.000 12 75.000
101.000 - 150.000 18 125.500
151.000 - 200.000 25 175.500
201.000 - 250.000 20 225.500
251.000 - 300.000 15 275.500

Mean (Rata-rata)

Untuk mencari mean kita dapat menghitung nilai tenggah terlebih dahulu

Berikut Rumus untuk menghitung mean adalah sebagai berikut:

f : frekuensi

x : nilai tengah dari setiap kelompok nilai

1. Mean (Rata-rata)

Rumus mean:
\[ \text{Mean} = \frac{\Sigma (f \cdot x)}{\Sigma f} \]

Nilai tengah (\(x\)) dihitung untuk tiap kelompok:

  • Kelompok 50.000 - 100.000: Titik tengah: \(\frac{50.000 + 100.000}{2} = 75.000\)

  • Kelompok 101.000 - 150.000: Titik tengah: \(\frac{101.000 + 150.000}{2} = 125.500\)

  • Kelompok 151.000 - 200.000: Titik tengah: \(\frac{151.000 + 200.000}{2} = 175.500\)

  • Kelompok 201.000 - 250.000: Titik tengah: \(\frac{201.000 + 250.000}{2} = 225.500\)

  • Kelompok 251.000 - 300.000: Titik tengah: \(\frac{251.000 + 300.000}{2} = 275.500\)

Setelah kita mendapatkan nilai titik tengah kita dapat mencari mean nya dengan Perhitungan sebagai berikut:

\[ \text{Mean} = \frac{(12 \cdot 75.000) + (18 \cdot 125.000) + (25 \cdot 175.000) + (20 \cdot 225.000) + (15 \cdot 275.000)}{12 + 18 + 25 + 20 + 15} \]

\[ \text{Mean} = \frac{900.000 + 2.250.000 + 4.375.000 + 4.500.000 + 4.125.000}{90} \approx 179.444 \]

Nilai Dari Mean = 179.444



Median(Nilai Tenggah)

selanjutnya kita dapat mencari median nya dengan rincian sebagai berikut:

2. Median

Rumus median: \[ \text{Median} = L + \left( \frac{\frac{N}{2} - F}{f_m} \right) \cdot c \]

Parameter: - Total frekuensi (\(N\)) = 90

  • Posisi median: \(\frac{N}{2} = 45\)

  • Kelas median: Kelas dengan frekuensi kumulatif yang mencakup nilai ke-45. Dari data, kelas median adalah 151.000 - 200.000.

    • \(L = 151.000\) (batas bawah kelas median)

    • \(F = 30\) (frekuensi kumulatif sebelum kelas median)

    • \(f_m = 25\) (frekuensi kelas median)

    • \(c = 50.000\) (panjang kelas)

Perhitungan: \[ \text{Median} = 151.000 + \left( \frac{45 - 30}{25} \right) \cdot 50.000 \] \[ \text{Median} = 151.000 + 30.000 = 181.000 \]

Nilai dari Median = 181.000


Modus(Paling sering muncul)

3. Modus

Rumus modus: \[ \text{Modus} = L + \left( \frac{f_m - f_1}{(f_m - f_1) + (f_m - f_2)} \right) \cdot c \]

Parameter: - Kelas modus: Kelas dengan frekuensi tertinggi = 151.000 - 200.000

  • \(L = 151.000\)

  • \(f_m = 25\)

  • \(f_1 = 18\) (frekuensi kelas sebelum kelas modus)

  • \(f_2 = 20\) (frekuensi kelas setelah kelas modus)

  • \(c = 50.000\)

Perhitungan: \[ \text{Modus} = 151.000 + \left( \frac{25 - 18}{(25 - 18) + (25 - 20)} \right) \cdot 50.000 \] \[ \text{Modus} = 151.000 + \left( \frac{7}{7 + 5} \right) \cdot 50.000 \] \[ \text{Modus} = 151.000 + 29.167 = 180.167 \]

Kesimpulan:

  • Mean (Rata-rata): 179.444

  • Median (Nilai Tengah): 181.000

  • Modus (Paling Sering Muncul): 180.167


Kesehatan

Pada bidang kesehatan,saya membuat tabel kelompok tentang program pencegahan diabetes pasien selama 3 bulan.

Tabel Data Kelompok

Tabel Data Kelompok untuk
data_pasien_diabetes_.mg.dl. Frekuensi..f_i.
70 - 89 5
90 - 109 12
110 - 129 20
130 - 149 8
150 - 169 5

Mean(Rata-rata)

Untuk mencari mean kita dapat menghitung nilai tenggah terlebih dahulu. selanjutnya kita bisa menghitung mean.

1. Mean (Rata-rata)

Rumus Mean: \[ \text{Mean} = \frac{\Sigma (f \cdot x)}{\Sigma f} \]

  • f⋅x adalah hasil perkalian frekuensi (f) dengan titik tengah (x) pada setiap kelas.

  • ÎŁ(𝑓⋅𝑥) = 5895

  • ÎŁf=50 \[ \text{Mean} = \frac{\Sigma (5895)}{50} = 117.9mg/dl \]

Median(Nilai Tengah)

selanjutnya kita dapat mencari median nya dengan rincian sebagai berikut:

2. Median

Langkah - langkahnya:

\[ \text{Median} = L + \frac{(n/2 - f)}{fm} \cdot c \]

Keterangan:

  • L: Batas bawah kelas median = 110

  • n/2 : Separuh jumlah total frekuensi = 50/2 = 25

  • F: Frekuensi kumulatif sebelum kelas median = 5 + 12 = 17

-𝑓𝑚: Frekuensi kelas median = 20

  • c: Panjang kelas = 130 − 110 = 20

subtitusi:

\[ \text{Median} = 110 + \frac{(25 - 17)}{20} \cdot 20 \]

\[ \text{Median} = 110 + \frac{(8)}{20} \cdot 20 \]

\[ \text{Median} = 110 + 18 = 118mg/dl \]

3. Modus

Modus adalah kelas dengan frekuensi tertinggi, yaitu 31 - 40 (frekuensi 35).

Gunakan rumus modus: \[ \text{Modus} = L + \frac{(f1 - f0)}{(f1 - f0)+(f1 + f2)} \cdot i \]

Keterangan:

  • L: Batas bawah kelas modus = 110

-𝑓1 : Frekuensi kelas modus = 20

-𝑓0 : Frekuensi kelas sebelum kelas modus = 12

-𝑓2 : Frekuensi kelas setelah kelas modus = 8

c: Panjang kelas = 130 − 110 = 20

\[ \text{Modus} = 110 + \frac{(20 - 12)}{(20 - 12)+(20 + 8)} \cdot 20 \]

\[ \text{Modus} = 110 + \frac{(8)}{(8 + 12)} \cdot 20 \]

\[ \text{Modus} = 110 + \frac{(8)}{(20)} \cdot 20 \]

\[ \text{Modus} = 110 + 8 = 118mg/dl \]

Kesimpulan:

  • Mean (Rata-rata): 117.9mg/dl

  • Median (Nilai Tengah): 110 + 18 = 118mg/dl

  • Modus (Paling Sering Muncul): 110 + 8 = 118mg/dl


Menghitung Persenan

1. Perhitungan Mean (117.9 mg/dL)

  1. Tentukan frekuensi kumulatif yang mencakup 90% data:
  • Total data: \(50\)
    \(90\% \times 50 = 45\).
    Nilai data ke-45 berada dalam kelas *130-149 mg/dL
  1. Analisis apakah mean (117.9) berada dalam cakupan 90%:
  • Mean (117.9) berada dalam kelas 110-129 mg/dL, yang kumulatif frekuensinya adalah \(5 + 12 + 20 = 37\) (74%).

  • Nilai ini tidak termasuk 90% distribusi data.

  1. Persentase cakupan mean: \[ \text{Persentase mean} = \frac{\text{Frekuensi kelas mean}}{\text{Total frekuensi}} \times 100\% = \frac{20}{50} \times 100\% = 40\% \]

2. Perhitungan Median (118 mg/dL)

  1. Lokasi median:
  • Median berada di kelas 110-129 mg/dL, dengan kumulatif frekuensi hingga kelas ini = \(37\) (74%).

b.Persentase cakupan median: \[ \text{Persentase median} = \frac{\text{Frekuensi kelas median}}{\text{Total frekuensi}} \times 100\% = \frac{20}{50} \times 100\% = 40\% \]


3. Perhitungan Modus (118 mg/dL)

  1. Lokasi modus:
  • Modus berada di kelas 110-129 mg/dL, dengan kumulatif frekuensi hingga kelas ini = \(37\) (74%).
  1. Persentase cakupan modus: \[ \text{Persentase modus} = \frac{\text{Frekuensi kelas modus}}{\text{Total frekuensi}} \times 100\% = \frac{20}{50} \times 100\% = 40\% \]

4. Hubungan dengan Frekuensi 90%

Frekuensi 90% mencakup kelas hingga 130-149 mg/dL. Namun:
- Mean (117.9 mg/dL): Masuk hingga kelas \(74\%\).
- Median (118 mg/dL): Masuk hingga kelas \(74\%\).
- Modus (118 mg/dL): Masuk hingga kelas \(74\%\).

Jika diukur secara terpisah, 40% distribusi data berpusat pada kelas modus, mean, dan median (110-129 mg/dL).

Kesimpulan
- Persentase Mean: 40%
- Persentase Median: 40%
- Persentase Modus: 40%



Pendidikan

Pada bidang pendidikan,saya membuat data tentang kelompok jam kerja guru dengan rincian sebagai berikut:

Tabel Data Kelompok

Tabel Data Kelompok untuk
Kelompok_Jam.Kerja_.jam.minggu. Frekuensi
0 - 10 5
11 - 20 15
21 - 30 25
31 - 40 35
41 - 50 20
  • 0 - 10: Jumlah individu yang bekerja antara 0 hingga 10 jam per minggu adalah 5 orang.

  • 11 - 20: Jumlah individu yang bekerja antara 11 hingga 20 jam per minggu adalah 15 orang.

  • 21 - 30: Jumlah individu yang bekerja antara 21 hingga 30 jam per minggu adalah 25 orang.

  • 31 - 40: Jumlah individu yang bekerja antara 31 hingga 40 jam per minggu adalah 35 orang.

  • 41 - 50: Jumlah individu yang bekerja antara 41 hingga 50 jam per minggu adalah 20 orang.

Tabel Data kelompok perhitungan

Tabel Data Kelompok untuk
Kelompok_Jam.Kerja_.jam.minggu. Frekuensi Titik.tenggah F.x.X
0 - 10 5 5 25
11 - 20 15 15 225
21 - 30 25 25 625
31 - 40 35 35 1.225
41 - 50 20 45 900

Mean (Rata-rata)

Untuk mencari mean kita dapat menghitung nilai tenggah terlebih dahulu. selanjutnya kita bisa menghitung mean

1. Mean (Rata-rata)

Rumus mean:

1.Titik Tengah (x) adalah nilai tengah dari setiap kelompok.

Dihitung dengan rumus:

\[ \text{x} = \frac{\ (Batas atas + Batas bawah)}{2} \]

Misalnya untuk kelompok 0 - 10:

\[ \text{x} = \frac{\ (0 + 10)}{2} = 5 \]

Untuk kelompok 11 - 20:

\[ \text{x} = \frac{\ (11 + 20)}{2} = 15 \]

  1. f × x adalah hasil perkalian antara frekuensi (f) dan titik tengah (x) untuk setiap kelompok:

Untuk kelompok 0 - 10:

f × x = 5 × 5 = 25

Untuk kelompok 11 - 20:

f × x = 15 × 15= 225

Untuk kelompok 21 - 30:

f × x = 25 × 25 = 625

Untuk kelompok 31 - 40:

f × x = 35 × 35 = 1.225

Untuk kelompok 41 - 50:

f × x = 20 × 45 = 900

3.Jumlahkan semua hasil perkalian (Σ f × x):

25 + 225 + 625 + 1.225 + 900 = 3.000

4.Jumlahkan semua frekuensi (ÎŁ f): 5 + 15 + 25+ 35 + 20 = 100

  1. Hitung Mean dengan rumus: \[ \text{Mean} = \frac{\Sigma (f \cdot x)}{\Sigma f} \]

\[ \text{Mean} = \frac{ (3.000)}{\Sigma 100} = 30 \]

Hasil: Mean (rata-rata) jam kerja per minggu adalah 30 jam.


Median(Nilai Tengah)

selanjutnya kita dapat mencari median nya dengan rincian sebagai berikut:

2. Median

Langkah - langkahnya:

1.Hitung frekuensi kumulatif (Fkum):

Tabel Data Kelompok untuk
Kelompok_Jam.Kerja_.jam.minggu. Frekuensi Fkum
0 - 10 5 5
11 - 20 15 20
21 - 30 25 45
31 - 40 35 80
41 - 50 20 100
  1. Tentukan kelompok median
  • Total frekuensi = 100

_ Letak median n/2 = 100/2 = 50

_ Kelompok dengan Fkum ≥ 50 adalah 31 - 40.

  1. Gunakan Rumus Median: \[ \text{Median} = L + \frac{(n/2 - fsebelum)}{fmedian} \cdot i \]
  • L = batas bawah kelas median = 30

  • n = total frekuensi = 100

  • F sebelum = Fkum sebelum kelas median = 45

  • f median = frekuensi kelas median = 35

  • i = panjang kelas = 10

subtitusi : \[ \text{Median} = 30 + \frac{(50 - 45)}{35} \cdot 10 \]

\[ \text{Median} = 30 + \frac{(5)}{35} \cdot 10 = 30 + 1.43 = 31.43 \]

Jadi, median yang diperoleh = 31.43 jam.



Modus(Paling sering muncul)

3. Modus

Modus adalah kelas dengan frekuensi tertinggi, yaitu 31 - 40 (frekuensi 35).

Gunakan rumus modus: \[ \text{Modus} = L + \frac{(d1)}{d1 + d2} \cdot i \]

  • L = batas bawah kelas modus = 30

  • d1 = selisih frekuensi kelas modus dengan kelas sebelumnya =

  • 35 − 25 = 10

  • d2 = selisih frekuensi kelas modus dengan kelas setelahnya =

  • 35−20=15

  • i = panjang kelas = 10

Subtitusi: \[ \text{Modus} = 30 + \frac{(10)}{10 + 15} \cdot 10 \]

\[ \text{Modus} = 30 + \frac{(10)}{25} \cdot 10 \]

30 + 4 = 34

Jadi, modus yang diperoleh = 34 jam.

Kesimpulan:

  • Mean (Rata-rata): 30 jam

  • Median (Nilai Tengah): 31.43 jam

  • Modus (Paling Sering Muncul): 34 jam


LS0tDQp0aXRsZTogIlBlbXVzYXRhbiBEYXRhIg0Kc3VidGl0bGU6ICJNZWFuLE1lZGlhbixNb2R1cyINCmF1dGhvcjogDQogIC0gIk1vaGFtbWFkIFJpeWFkaCBOSU1fNTIyNDAwMTgiDQpkYXRlOiAgIlNlbmluLCAxOC8xMS8yMDI0Ig0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgbGliX2RpcjogbGlicw0KICAgIDNkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgc3JjPSJHYW1iYXIvRm90b19SaXlhZGguanBlZyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDo1MDBweDsgbWFyZ2luOiBhdXRvOyIgYWx0PSJGb3RvIEtlbG9tcG9rIj4NCg0KIyBQcmFrdGlrdW0gMQ0KDQojIyBUYWJlbCBEYXRhIEtlbG9tcG9rDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgZGF0YSBrZWxvbXBvaw0KbGlicmFyeShrbml0cikNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICAiTmlsYWlfU2lzd2EiID0gYygiNDAgLSA1MCIsICI1MSAtIDYwIiwgIjYxIC0gNzAiLCAiNzEgLSA4MCIsICI4MSAtIDkwIiksDQogICJGcmVrdWVuc2kgKGZfaSkiID0gYyg1LCA4LCAxMCwgNywgNCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayBNZWFuLCBNZWRpYW4sIGRhbiBNb2R1cyIpDQoNCmBgYA0KDQojIE1lYW4gKFJhdGEtcmF0YSkNClVudHVrIHBlcnRhbWEga2l0YSBiaXNhIG1lbGFrdWthbiBwZXJoaXR1bmdhbiB1bnR1ayBtZW5jYXJpbmlsYWkgdGVuZ2dhaCBueWEsIHNlbGFuanV0bnlhIGtpdGEgYmlzYSBtZW5jYXJpIG1lYW4oUmF0YS1yYXRhKS4gDQoNCkJlcmlrdXQgUnVtdXMgdW50dWsgbWVuZ2hpdHVuZyBtZWFuIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCmYgOiBmcmVrdWVuc2kNCg0KeCA6ICBuaWxhaSB0ZW5nYWggZGFyaSBzZXRpYXAga2Vsb21wb2sgbmlsYWkNCg0KIyMjIDEuIE1lYW4gKFJhdGEtcmF0YSkNClJ1bXVzIG1lYW46ICANClxbDQpcdGV4dHtNZWFufSA9IFxmcmFje1xTaWdtYSAoZiBcY2RvdCB4KX17XFNpZ21hIGZ9DQpcXQ0KDQpOaWxhaSB0ZW5nYWggKFwoeFwpKSBkaWhpdHVuZyB1bnR1ayB0aWFwIGtlbG9tcG9rOg0KDQotIDQwIC0gNTA6IFwoIFxmcmFjezQwICsgNTB9ezJ9ID0gNDUgXCkNCg0KLSA1MSAtIDYwOiBcKCBcZnJhY3s1MSArIDYwfXsyfSA9IDU1LjUgXCkNCg0KLSA2MSAtIDcwOiBcKCBcZnJhY3s2MSArIDcwfXsyfSA9IDY1LjUgXCkNCg0KLSA3MSAtIDgwOiBcKCBcZnJhY3s3MSArIDgwfXsyfSA9IDc1LjUgXCkNCg0KLSA4MSAtIDkwOiBcKCBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUgXCkNCg0KUGVyaGl0dW5nYW46DQpcWw0KXHRleHR7TWVhbn0gPSBcZnJhY3soNSBcY2RvdCA0NSkgKyAoOCBcY2RvdCA1NS41KSArICgxMCBcY2RvdCA2NS41KSArICg3IFxjZG90IDc1LjUpICsgKDQgXGNkb3QgODUuNSl9ezUgKyA4ICsgMTAgKyA3ICsgNH0NClxdDQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjezIyNSArIDQ0NCArIDY1NSArIDUyOC41ICsgMzQyfXszNH0gXGFwcHJveCA2NC41NA0KXF0NCg0KSGFzaWw6DQpNZWFuIChyYXRhLXJhdGEpIE5pbGFpIHNpc3dhIGFkYWxhaCA2NC41NC4NCi0tLQ0KDQoNCiMjIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGFzbGkNCm5pbGFpX3RlbmdhaCA8LSBjKDQ1LCA1NS41LCA2NS41LCA3NS41LCA4NS41KQ0KZnJla3VlbnNpIDwtIGMoNSwgOCwgMTAsIDcsIDQpDQoNCiMgTWVtYnVhdCBkYXRhIHVsYW5nIHVudHVrIGJveHBsb3QNCmRhdGFfYXNsaSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuYW1iYWhrYW4gb3V0bGllcnMga2UgZGF0YQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyhkYXRhX2FzbGksIDEyMCwgMTMwLCA1LCAxMCkgICMgTWVuYW1iYWggbmlsYWkgZWtzdHJlbSBzZWJhZ2FpIG91dGxpZXJzDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgZGFyaSBrZWR1YSBkYXRhc2V0DQptZWFuX2RhdGFfYXNsaSA8LSBtZWFuKGRhdGFfYXNsaSkNCm1lYW5fZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gbWVhbihkYXRhX2Rlbmdhbl9vdXRsaWVycykNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIHkgPSB+ZGF0YV9kZW5nYW5fb3V0bGllcnMsDQogIHR5cGUgPSAiYm94IiwNCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiwgICMgTWVuYW1waWxrYW4gb3V0bGllcnMNCiAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiDQopICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeSA9IH5kYXRhX2FzbGksDQogICAgdHlwZSA9ICJib3giLA0KICAgIGJveHBvaW50cyA9ICJvdXRsaWVycyIsICAjIFRpZGFrIGFkYSBvdXRsaWVycyBkYWxhbSBkYXRhIGluaQ0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3hwbG90IERhdGEgTmlsYWkgU2lzd2EgKERlbmdhbiBkYW4gVGFucGEgT3V0bGllcnMpIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgU2lzd2EiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2sgRGF0YSIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgTWVuYW1iYWhrYW4gYW5vdGFzaSB1bnR1ayByYXRhLXJhdGENCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAxLA0KICAgICAgICB5ID0gbWVhbl9kYXRhX2FzbGksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogIiwgcm91bmQobWVhbl9kYXRhX2FzbGksIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAyMCwNCiAgICAgICAgYXkgPSAtNDAsDQogICAgICAgIGFycm93Y29sb3IgPSAiYmxhY2siICAjIE1lbmd1YmFoIHdhcm5hIHBhbmFoIG1lbmphZGkgaGl0YW0NCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gMiwNCiAgICAgICAgeSA9IG1lYW5fZGF0YV9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjogIiwgcm91bmQobWVhbl9kYXRhX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDIwLA0KICAgICAgICBheSA9IC00MCwNCiAgICAgICAgYXJyb3djb2xvciA9ICJibGFjayIgICMgTWVuZ3ViYWggd2FybmEgcGFuYWggbWVuamFkaSBoaXRhbQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMgTWVtYnVhdCB2aXN1YWwgSGlzdG9ncmFtDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGFzbGkgYmVyZGFzYXJrYW4gbmlsYWkgdGVuZ2FoIGRhbiBmcmVrdWVuc2kNCm5pbGFpX3RlbmdhaCA8LSBjKDQ1LCA1NS41LCA2NS41LCA3NS41LCA4NS41KQ0KZnJla3VlbnNpIDwtIGMoNSwgOCwgMTAsIDcsIDQpDQoNCiMgTWVtYnVhdCBkYXRhIGFzbGkNCmRhdGFfYXNsaSA8LSByZXAobmlsYWlfdGVuZ2FoLCBmcmVrdWVuc2kpDQoNCiMgTWVuYW1iYWhrYW4gb3V0bGllcnMga2UgZGF0YQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyhkYXRhX2FzbGksIDEyMCwgMTMwLCA1LCAxMCkgICMgT3V0bGllcnMgeWFuZyBkaW1hc3Vra2FuDQoNCiMgTWVtYnVhdCBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBhc2xpIGRhbiBkYXRhIGRlbmdhbiBvdXRsaWVycw0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfYXNsaSkNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGENCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gbWVhbihkYXRhX2FzbGkpDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIERlbnNpdHkgcGxvdCB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpIiwgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIERlbnNpdHkgcGxvdCB1bnR1ayBkYXRhIHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMzgsIDE2NiwgOTEsIDAuOCkiLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgR2FyaXMgcmF0YS1yYXRhIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX2Rlbmdhbl9vdXRsaWVycywgbWVhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIlJhdGEtcmF0YSAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiYSgyMjIsIDQ1LCAzOCwgMC42KSIsIGRhc2ggPSAiZGFzaCIpDQogICkgJT4lDQogICMgR2FyaXMgcmF0YS1yYXRhIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fdGFucGFfb3V0bGllcnMsIG1lYW5fdGFucGFfb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMzgsIDE2NiwgOTEsIDAuNikiLCBkYXNoID0gImRhc2giKQ0KICApICU+JQ0KICAjIExheW91dCBkYW4gYW5vdGFzaQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVhbiBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCA5MSwgMC44KSIsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQotIFNlYmVsdW0gT3V0bGllcnM6DQpNZWFuIG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCByZXByZXNlbnRhdGlmIHRlbnRhbmcgcmF0YS1yYXRhIG5pbGFpIHNpc3dhIGthcmVuYSBzZW11YSBkYXRhIGJlcmFkYSBkYWxhbSByZW50YW5nIG5pbGFpIHlhbmcgd2FqYXIuIA0KDQpTZWJhZ2FpIGNvbnRvaDoNCk1lYW4gKHRhbnBhIG91dGxpZXJzKTogNjcuNiAoYmVyZ2FudHVuZyBwYWRhIGRhdGEgYXNsaSkuDQoNCi0gU2VzdWRhaCBPdXRsaWVyczoNCk1lYW4gbWVuamFkaSBsZWJpaCB0aW5nZ2kga2FyZW5hIG91dGxpZXJzIGJlcnVwYSBuaWxhaSBla3N0cmVtIChtaXNhbG55YSAxMjAsIDEzMCkgc2FuZ2F0IG1lbWVuZ2FydWhpIGhhc2lsIHBlcmhpdHVuZ2FuLg0KDQpDb250b2g6DQpNZWFuIChkZW5nYW4gb3V0bGllcnMpOiA3NS4zLg0KDQotIEtlc2ltcHVsYW46DQpNZWFuIGFkYWxhaCB1a3VyYW4geWFuZyBzYW5nYXQgc2Vuc2l0aWYgdGVyaGFkYXAgb3V0bGllcnMuIERhbGFtIGFuYWxpc2lzIG5pbGFpIHNpc3dhLCBqaWthIHRlcmRhcGF0IHNpc3dhIGRlbmdhbiBuaWxhaSB5YW5nIGphdWggbGViaWggdGluZ2dpIGF0YXUgcmVuZGFoIGRpYmFuZGluZ2thbiBsYWlubnlhLCBtZWFuIHRpZGFrIGxhZ2kgbWVuY2VybWlua2FuIHBlcmZvcm1hIHJhdGEtcmF0YSBzaXN3YSBkZW5nYW4gYmFpay4NCg0KIyBNZWRpYW4oTmlsYWkgVGVuZ2dhaCkNCnNlbGFuanV0bnlhIGtpdGEgZGFwYXQgbWVuY2FyaSBtZWRpYW4gbnlhIGRlbmdhbiByaW5jaWFuIHNlYmFnYWkgYmVyaWt1dDoNCg0KIyMjIDIuIE1lZGlhbg0KUnVtdXMgbWVkaWFuOg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoIFxmcmFje1xmcmFje059ezJ9IC0gRn17Zl9tfSBccmlnaHQpIFxjZG90IGMNClxdDQoNClBhcmFtZXRlcjoNCi0gVG90YWwgZnJla3VlbnNpIChcKE5cKSkgPSAzNA0KDQotIFBvc2lzaSBtZWRpYW46IFwoIFxmcmFje059ezJ9ID0gMTcgXCkNCg0KLSBLZWxhcyBtZWRpYW46IDYxIC0gNzANCg0KICAtIFwoTCA9IDYxXCkgKGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbikNCiAgDQogIC0gXChGID0gMTNcKSAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikNCiAgDQogIC0gXChmX20gPSAxMFwpIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKQ0KICANCiAgLSBcKGMgPSAxMFwpIChwYW5qYW5nIGtlbGFzKQ0KDQpQZXJoaXR1bmdhbjoNClxbDQpcdGV4dHtNZWRpYW59ID0gNjEgKyBcbGVmdCggXGZyYWN7MTcgLSAxM317MTB9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TWVkaWFufSA9IDYxICsgNCA9IDY1DQpcXQ0KDQotLS0NCg0KIyMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgYXNsaQ0KbmlsYWlfdGVuZ2FoIDwtIGMoNDUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUpDQpmcmVrdWVuc2kgPC0gYyg1LCA4LCAxMCwgNywgNCkNCg0KIyBNZW1idWF0IGRhdGEgdWxhbmcgdW50dWsgYm94cGxvdA0KZGF0YV9hc2xpIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaSkNCg0KIyBNZW5hbWJhaGthbiBvdXRsaWVycyBrZSBkYXRhDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKGRhdGFfYXNsaSwgMTIwLCAxMzAsIDUsIDEwKSAgIyBNZW5hbWJhaCBuaWxhaSBla3N0cmVtIHNlYmFnYWkgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIG1lZGlhbiAoc2FtYSB1bnR1ayBrZWR1YW55YSBrYXJlbmEgcG9zaXNpIGtlbGFzIG1lZGlhbiB0aWRhayBiZXJ1YmFoKQ0KTCA8LSA2MC41ICAjIEJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbg0KRiA8LSAxMyAgICAjIEZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4NCmYgPC0gMTAgICAgIyBGcmVrdWVuc2kga2VsYXMgbWVkaWFuDQppIDwtIDEwICAgICMgUGFuamFuZyBpbnRlcnZhbA0KbiA8LSBzdW0oZnJla3VlbnNpKQ0KbWVkaWFuIDwtIEwgKyAoKG4gLyAyIC0gRikgLyBmKSAqIGkgICMgTWVkaWFuID0gNjQuNQ0KDQojIE1lbWJ1YXQgYm94cGxvdCB1bnR1ayBkYXRhIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllcnMNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeSA9IH5kYXRhX2FzbGksDQogICAgdHlwZSA9ICJib3giLA0KICAgIGJveHBvaW50cyA9ICJvdXRsaWVycyIsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyINCiAgKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSB+ZGF0YV9kZW5nYW5fb3V0bGllcnMsDQogICAgdHlwZSA9ICJib3giLA0KICAgIGJveHBvaW50cyA9ICJvdXRsaWVycyIsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3hwbG90IERhdGEgTmlsYWkgU2lzd2EgKERlbmdhbiBkYW4gVGFucGEgT3V0bGllcnMpIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgU2lzd2EiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2sgRGF0YSIpLA0KICAgIHNoYXBlcyA9IGxpc3QoDQogICAgICAjIEdhcmlzIG1lZGlhbiB1bnR1ayBUYW5wYSBPdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgdHlwZSA9ICJsaW5lIiwNCiAgICAgICAgeDAgPSAwLjUsDQogICAgICAgIHgxID0gMS41LA0KICAgICAgICB5MCA9IG1lZGlhbiwNCiAgICAgICAgeTEgPSBtZWRpYW4sDQogICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJlZCIsIGRhc2ggPSAiZGFzaCIpLA0KICAgICAgICB4cmVmID0gIngiLA0KICAgICAgICB5cmVmID0gInkiDQogICAgICApLA0KICAgICAgIyBHYXJpcyBtZWRpYW4gdW50dWsgRGVuZ2FuIE91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB0eXBlID0gImxpbmUiLA0KICAgICAgICB4MCA9IDEuNSwNCiAgICAgICAgeDEgPSAyLjUsDQogICAgICAgIHkwID0gbWVkaWFuLA0KICAgICAgICB5MSA9IG1lZGlhbiwNCiAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIGRhc2ggPSAiZGFzaCIpLA0KICAgICAgICB4cmVmID0gIngiLA0KICAgICAgICB5cmVmID0gInkiDQogICAgICApDQogICAgKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gMSwNCiAgICAgICAgeSA9IG1lZGlhbiwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gMiwNCiAgICAgICAgeSA9IG1lZGlhbiwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBNZW1idWF0IHZpc3VhbCBIaXN0b2dyYW0NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgYXNsaSBiZXJkYXNhcmthbiBuaWxhaSB0ZW5nYWggZGFuIGZyZWt1ZW5zaQ0KbmlsYWlfdGVuZ2FoIDwtIGMoNDUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUpDQpmcmVrdWVuc2kgPC0gYyg1LCA4LCAxMCwgNywgNCkNCg0KIyBNZW1idWF0IGRhdGEgYXNsaQ0KZGF0YV9hc2xpIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaSkNCg0KIyBNZW5hbWJhaGthbiBvdXRsaWVycyBrZSBkYXRhDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKGRhdGFfYXNsaSwgMTIwLCAxMzAsIDUsIDEwKSAgIyBPdXRsaWVycyB5YW5nIGRpbWFzdWtrYW4NCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhIGFzbGkgZGFuIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9hc2xpKQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX2FzbGkpDQptZWRpYW5fZGVuZ2FuX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX2Rlbmdhbl9vdXRsaWVycykNCg0KIyBNZW1idWF0IHBsb3QgdW50dWsgbWVkaWFuDQpwbG90X21lZGlhbiA8LSBwbG90X2x5KCkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCA5MSwgMC44KSIsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBHYXJpcyBtZWRpYW4gdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3RhbnBhX291dGxpZXJzLCBtZWRpYW5fdGFucGFfb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVkaWFuIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMzgsIDE2NiwgOTEsIDAuOCkiLCBkYXNoID0gImRvdCIpDQogICkgJT4lDQogICMgR2FyaXMgbWVkaWFuIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiLCBkYXNoID0gImRvdCIpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4gcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdF9tZWRpYW4NCg0KDQpgYGANCg0KLSBTZWJlbHVtIE91dGxpZXJzOg0KTWVkaWFuIGRpaGl0dW5nIGJlcmRhc2Fya2FuIHBvc2lzaSBkYXRhLCBzZWhpbmdnYSB0ZXRhcCBiZXJhZGEgZGkgdGVuZ2FoLXRlbmdhaCBkaXN0cmlidXNpLiBOaWxhaSBtZWRpYW4gdGFucGEgb3V0bGllcnMgYWRhbGFoIHNla2l0YXIgNjQuNSwgbWVuY2VybWlua2FuIGJhaHdhIHNlcGFydWggc2lzd2EgbWVuZGFwYXQgbmlsYWkgZGkgYXRhcywgZGFuIHNlcGFydWggZGkgYmF3YWguDQoNCg0KLSBTZXN1ZGFoIE91dGxpZXJzOg0KTWVkaWFuIHRldGFwIHRpZGFrIGJlcnViYWgsIHlhaXR1IHNla2l0YXIgNjQuNSwga2FyZW5hIG91dGxpZXJzIGhhbnlhIG1lbWVuZ2FydWhpIHVqdW5nIGRpc3RyaWJ1c2ksIHRpZGFrIG1lbWVuZ2FydWhpIHBvc2lzaSB0ZW5nYWggZGF0YS4NCg0KDQotIEtlc2ltcHVsYW46DQpNZWRpYW4gYWRhbGFoIHVrdXJhbiB5YW5nIHRpZGFrIHNlbnNpdGlmIHRlcmhhZGFwIG91dGxpZXJzLCBzZWhpbmdnYSBtZW1iZXJpa2FuIGdhbWJhcmFuIHlhbmcgbGViaWggc3RhYmlsIGRhbiBha3VyYXQgdGVudGFuZyBuaWxhaSB0ZW5nYWggc2lzd2EsIHRlcnV0YW1hIGppa2EgdGVyZGFwYXQgbmlsYWkgZWtzdHJlbS4NCg0KIyBNb2R1cyhQYWxpbmcgc2VyaW5nIG11bmN1bCkNCnBhZGEgdGFoYXAgdGVyYWtoaXIga2l0YSBkYXBhdCBtZW5jYXJpIG5pbGFpIG1vZHVzbnlhIGRlbmdhbiByaW5jaWFuIHNlYmFnYWkgYmVyaWt1dDoNCg0KIyMjIDMuIE1vZHVzDQpSdW11cyBtb2R1czoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoIFxmcmFje2ZfbSAtIGZfMX17KGZfbSAtIGZfMSkgKyAoZl9tIC0gZl8yKX0gXHJpZ2h0KSBcY2RvdCBjDQpcXQ0KDQpQYXJhbWV0ZXI6DQotIEtlbGFzIG1vZHVzOiA2MSAtIDcwDQoNCiAgLSBcKEwgPSA2MVwpDQogIA0KICAtIFwoZl9tID0gMTBcKQ0KICANCiAgLSBcKGZfMSA9IDhcKSAoZnJla3VlbnNpIGtlbGFzIHNlYmVsdW0ga2VsYXMgbW9kdXMpDQogIA0KICAtIFwoZl8yID0gN1wpIChmcmVrdWVuc2kga2VsYXMgc2V0ZWxhaCBrZWxhcyBtb2R1cykNCiAgDQogIC0gXChjID0gMTBcKQ0KDQpQZXJoaXR1bmdhbjoNClxbDQpcdGV4dHtNb2R1c30gPSA2MSArIFxsZWZ0KCBcZnJhY3sxMCAtIDh9eygxMCAtIDgpICsgKDEwIC0gNyl9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNjEgKyBcbGVmdCggXGZyYWN7Mn17MiArIDN9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNjEgKyA0ID0gNjUNClxdDQoNCi0tLQ0KDQojIyBEYXRhOiBkdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBhc2xpDQpuaWxhaV90ZW5nYWggPC0gYyg0NSwgNTUuNSwgNjUuNSwgNzUuNSwgODUuNSkNCmZyZWt1ZW5zaSA8LSBjKDUsIDgsIDEwLCA3LCA0KQ0KDQojIE1lbWJ1YXQgZGF0YSB1bGFuZyB1bnR1ayBib3hwbG90DQpkYXRhX2FzbGkgPC0gcmVwKG5pbGFpX3RlbmdhaCwgZnJla3VlbnNpKQ0KDQojIE1lbmFtYmFoa2FuIG91dGxpZXJzIGtlIGRhdGENCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoZGF0YV9hc2xpLCAxMjAsIDEzMCwgNSwgMTApICAjIE1lbmFtYmFoIG5pbGFpIGVrc3RyZW0gc2ViYWdhaSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgbW9kdXMgKHNhbWEgdW50dWsga2VkdWEga2FzdXMga2FyZW5hIG91dGxpZXJzIHRpZGFrIG1lbWVuZ2FydWhpIGtlbGFzIG1vZHVzKQ0KTCA8LSA2MC41ICAjIEJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzDQpkMSA8LSAxMCAtIDggICMgRnJla3VlbnNpIGtlbGFzIG1vZHVzIC0gZnJla3VlbnNpIGtlbGFzIHNlYmVsdW1ueWENCmQyIDwtIDEwIC0gNyAgIyBGcmVrdWVuc2kga2VsYXMgbW9kdXMgLSBmcmVrdWVuc2kga2VsYXMgc2V0ZWxhaG55YQ0KaSA8LSAxMCAgICAgICAjIFBhbmphbmcgaW50ZXJ2YWwNCm1vZHVzIDwtIEwgKyAoZDEgLyAoZDEgKyBkMikpICogaSAgIyBNb2R1cyA9IDY0LjUNCg0KIyBNZW1idWF0IGJveHBsb3QgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzDQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSB+ZGF0YV9hc2xpLA0KICAgIHR5cGUgPSAiYm94IiwNCiAgICBib3hwb2ludHMgPSAib3V0bGllcnMiLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiDQogICkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB5ID0gfmRhdGFfZGVuZ2FuX291dGxpZXJzLA0KICAgIHR5cGUgPSAiYm94IiwNCiAgICBib3hwb2ludHMgPSAib3V0bGllcnMiLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIg0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94cGxvdCBEYXRhIE5pbGFpIFNpc3dhIChEZW5nYW4gZGFuIFRhbnBhIE91dGxpZXJzKSIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIFNpc3dhIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIERhdGEiKSwNCiAgICBzaGFwZXMgPSBsaXN0KA0KICAgICAgIyBHYXJpcyBtb2R1cyB1bnR1ayBUYW5wYSBPdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgdHlwZSA9ICJsaW5lIiwNCiAgICAgICAgeDAgPSAwLjUsDQogICAgICAgIHgxID0gMS41LA0KICAgICAgICB5MCA9IG1vZHVzLA0KICAgICAgICB5MSA9IG1vZHVzLA0KICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmVlbiIsIGRhc2ggPSAiZGFzaCIpLA0KICAgICAgICB4cmVmID0gIngiLA0KICAgICAgICB5cmVmID0gInkiDQogICAgICApLA0KICAgICAgIyBHYXJpcyBtb2R1cyB1bnR1ayBEZW5nYW4gT3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHR5cGUgPSAibGluZSIsDQogICAgICAgIHgwID0gMS41LA0KICAgICAgICB4MSA9IDIuNSwNCiAgICAgICAgeTAgPSBtb2R1cywNCiAgICAgICAgeTEgPSBtb2R1cywNCiAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIGRhc2ggPSAiZGFzaCIpLA0KICAgICAgICB4cmVmID0gIngiLA0KICAgICAgICB5cmVmID0gInkiDQogICAgICApDQogICAgKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gMSwNCiAgICAgICAgeSA9IG1vZHVzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHJvdW5kKG1vZHVzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gMiwNCiAgICAgICAgeSA9IG1vZHVzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHJvdW5kKG1vZHVzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBNZW1idWF0IHZpc3VhbCBIaXN0b2dyYW0NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgYXNsaSBiZXJkYXNhcmthbiBuaWxhaSB0ZW5nYWggZGFuIGZyZWt1ZW5zaQ0KbmlsYWlfdGVuZ2FoIDwtIGMoNDUsIDU1LjUsIDY1LjUsIDc1LjUsIDg1LjUpDQpmcmVrdWVuc2kgPC0gYyg1LCA4LCAxMCwgNywgNCkNCg0KIyBNZW1idWF0IGRhdGEgYXNsaQ0KZGF0YV9hc2xpIDwtIHJlcChuaWxhaV90ZW5nYWgsIGZyZWt1ZW5zaSkNCg0KIyBNZW5hbWJhaGthbiBvdXRsaWVycyBrZSBkYXRhDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKGRhdGFfYXNsaSwgMTIwLCAxMzAsIDUsIDEwKSAgIyBPdXRsaWVycyB5YW5nIGRpbWFzdWtrYW4NCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhIGFzbGkgZGFuIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9hc2xpKQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCg0KIyBNZW5naGl0dW5nIG1lYW4NCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gbWVhbihkYXRhX2FzbGkpDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fdGFucGFfb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfYXNsaSkNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgbW9kdXMNCm1vZGVfdGFucGFfb3V0bGllcnMgPC0gbmlsYWlfdGVuZ2FoW3doaWNoLm1heChmcmVrdWVuc2kpXQ0KbW9kZV9kZW5nYW5fb3V0bGllcnMgPC0gbW9kZV90YW5wYV9vdXRsaWVycyAgIyBNb2R1cyB0ZXRhcCBzYW1hIGthcmVuYSBvdXRsaWVycyB0aWRhayBtZW1lbmdhcnVoaSBkaXN0cmlidXNpIGZyZWt1ZW5zaQ0KDQojIE1lbWJ1YXQgcGxvdCB1bnR1ayBtb2R1cw0KcGxvdF9tb2R1cyA8LSBwbG90X2x5KCkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCA5MSwgMC44KSIsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBHYXJpcyBtb2R1cyB1bnR1ayBkYXRhIHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2RlX3RhbnBhX291dGxpZXJzLCBtb2RlX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYmEoMzgsIDE2NiwgMjAwLCAwLjgpIiwgZGFzaCA9ICJkYXNoZG90IikNCiAgKSAlPiUNCiAgIyBHYXJpcyBtb2R1cyB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kZV9kZW5nYW5fb3V0bGllcnMsIG1vZGVfZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCAyMDAsIDAuOCkiLCBkYXNoID0gImRhc2hkb3QiKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTW9kdXMgcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdF9tb2R1cw0KDQoNCg0KYGBgDQoNCi0gU2ViZWx1bSBPdXRsaWVyczoNCk1vZHVzIGFkYWxhaCBuaWxhaSBhdGF1IGtlbG9tcG9rIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwuIERhbGFtIGRhdGEgaW5pLCBtb2R1cyBiZXJhZGEgcGFkYSBrZWxhcyA2MeKAkzcwIChuaWxhaSB0ZW5nYWg6IDY0LjUpLCBrYXJlbmEgbWVtaWxpa2kgZnJla3VlbnNpIHRlcnRpbmdnaSAoMTAgc2lzd2EpLg0KDQoNCi0gU2VzdWRhaCBPdXRsaWVyczoNCk1vZHVzIHRldGFwIHRpZGFrIGJlcnViYWgsIHlhaXR1IHBhZGEga2VsYXMgNjHigJM3MCAobmlsYWkgdGVuZ2FoOiA2NC41KSwga2FyZW5hIG91dGxpZXJzIHRpZGFrIG1lbmd1YmFoIGp1bWxhaCBmcmVrdWVuc2kgdGVydGluZ2dpLg0KDQoNCi0gS2VzaW1wdWxhbjoNCk1vZHVzIGp1Z2EgdGlkYWsgc2Vuc2l0aWYgdGVyaGFkYXAgb3V0bGllcnMsIG1lbmphZGlrYW5ueWEgdWt1cmFuIHlhbmcgc3RhYmlsIHVudHVrIG1lbmdnYW1iYXJrYW4gcGVyZm9ybWEgbmlsYWkgbWF5b3JpdGFzIHNpc3dhLiBOYW11biwgbW9kdXMgaGFueWEgY29jb2sgZGlndW5ha2FuIGppa2EgZGF0YSBtZW1pbGlraSBuaWxhaSB5YW5nIHNlcmluZyBtdW5jdWwgc2VjYXJhIHNpZ25pZmlrYW4uDQoNCiMgUHJha3Rpa3VtIDINCg0KIyMgQmlzbmlzDQpQYWRhIGJpZGFuZyBiaXNuaXMsc2F5YSBtZW1pbGloIHRhYmVsIGtlbG9tcG9rIGRhdGEga29zbWV0aWsuIFNheWEgbWVtaWxpaCBwYXJmdW0gc2ViYWdhaSBvYmplayBwZW11c2F0YW4gZGF0YW55YS4gRGVuZ2FuIHJpbmNpYW4gc2ViYWdhaSBiZXJpa3V0Lg0KDQojIyMjIFRhYmVsIERhdGEgS2Vsb21wb2sgDQoNCkRhdGEgQXdhbA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sgdW50dWsgUGFyZnVtIA0KbGlicmFyeShrbml0cikNCg0KZGF0YV9tZWFuIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva19IYXJnYV9wYXJmdW0iID0gYygiNTAuMDAwIC0gMTAwLjAwMCIsICIxMDEuMDAwIC0gMTUwLjAwMCIsICIxNTEuMDAwIC0gMjAwLjAwMCIsICIyMDEuMDAwIC0gMjUwLjAwMCIsICIyNTEuMDAwIC0gMzAwLjAwMCIpLA0KICAiRnJla3VlbnNpIChmX2kpIiA9IGMoIjEyIiwgIjE4IiwgIjI1IiwgIjIwIiwgIjE1IiksDQogICJUaXRpa19UZW5nYWgiID1jKCI3NS4wMDAiLCAiMTI1LjUwMCIsICIxNzUuNTAwIiwgIjIyNS41MDAiLCAiMjc1LjUwMCIpDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwgTWVhbg0Ka2FibGUoZGF0YV9tZWFuLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIikNCg0KYGBgDQoNCiMjIyMgTWVhbiAoUmF0YS1yYXRhKQ0KVW50dWsgbWVuY2FyaSBtZWFuIGtpdGEgZGFwYXQgbWVuZ2hpdHVuZyBuaWxhaSB0ZW5nZ2FoIHRlcmxlYmloIGRhaHVsdSANCg0KQmVyaWt1dCBSdW11cyB1bnR1ayBtZW5naGl0dW5nIG1lYW4gYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KZiA6IGZyZWt1ZW5zaQ0KDQp4IDogIG5pbGFpIHRlbmdhaCBkYXJpIHNldGlhcCBrZWxvbXBvayBuaWxhaQ0KDQojIyMjIDEuIE1lYW4gKFJhdGEtcmF0YSkNClJ1bXVzIG1lYW46ICANClxbDQpcdGV4dHtNZWFufSA9IFxmcmFje1xTaWdtYSAoZiBcY2RvdCB4KX17XFNpZ21hIGZ9DQpcXQ0KDQpOaWxhaSB0ZW5nYWggKFwoeFwpKSBkaWhpdHVuZyB1bnR1ayB0aWFwIGtlbG9tcG9rOg0KDQotIEtlbG9tcG9rIDUwLjAwMCAtIDEwMC4wMDA6IFRpdGlrIHRlbmdhaDogXCggXGZyYWN7NTAuMDAwICsgMTAwLjAwMH17Mn0gPSA3NS4wMDAgXCkNCg0KLSBLZWxvbXBvayAxMDEuMDAwIC0gMTUwLjAwMDogVGl0aWsgdGVuZ2FoOiBcKCBcZnJhY3sxMDEuMDAwICsgMTUwLjAwMH17Mn0gPSAxMjUuNTAwIFwpDQoNCi0gS2Vsb21wb2sgMTUxLjAwMCAtIDIwMC4wMDA6IFRpdGlrIHRlbmdhaDogXCggXGZyYWN7MTUxLjAwMCArIDIwMC4wMDB9ezJ9ID0gMTc1LjUwMCBcKQ0KDQotIEtlbG9tcG9rIDIwMS4wMDAgLSAyNTAuMDAwOiBUaXRpayB0ZW5nYWg6IFwoIFxmcmFjezIwMS4wMDAgKyAyNTAuMDAwfXsyfSA9IDIyNS41MDAgXCkNCg0KLSBLZWxvbXBvayAyNTEuMDAwIC0gMzAwLjAwMDogVGl0aWsgdGVuZ2FoOiBcKCBcZnJhY3syNTEuMDAwICsgMzAwLjAwMH17Mn0gPSAyNzUuNTAwIFwpDQoNClNldGVsYWgga2l0YSBtZW5kYXBhdGthbiBuaWxhaSB0aXRpayB0ZW5nYWgga2l0YSBkYXBhdCBtZW5jYXJpIG1lYW4gbnlhIGRlbmdhbiBQZXJoaXR1bmdhbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjeygxMiBcY2RvdCA3NS4wMDApICsgKDE4IFxjZG90IDEyNS4wMDApICsgKDI1IFxjZG90IDE3NS4wMDApICsgKDIwIFxjZG90IDIyNS4wMDApICsgKDE1IFxjZG90IDI3NS4wMDApfXsxMiArIDE4ICsgMjUgKyAyMCArIDE1fQ0KXF0NCg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7OTAwLjAwMCArIDIuMjUwLjAwMCArIDQuMzc1LjAwMCArIDQuNTAwLjAwMCArIDQuMTI1LjAwMH17OTB9IFxhcHByb3ggMTc5LjQ0NA0KXF0NCg0KTmlsYWkgRGFyaSBNZWFuID0gMTc5LjQ0NA0KDQotLS0NCg0KLS0tDQoNCiMjIyMgTWVkaWFuKE5pbGFpIFRlbmdnYWgpDQpzZWxhbmp1dG55YSBraXRhIGRhcGF0IG1lbmNhcmkgbWVkaWFuIG55YSBkZW5nYW4gcmluY2lhbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiMjIyMgMi4gTWVkaWFuDQpSdW11cyBtZWRpYW46DQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdCggXGZyYWN7XGZyYWN7Tn17Mn0gLSBGfXtmX219IFxyaWdodCkgXGNkb3QgYw0KXF0NCg0KUGFyYW1ldGVyOg0KLSBUb3RhbCBmcmVrdWVuc2kgKFwoTlwpKSA9IDkwDQoNCi0gUG9zaXNpIG1lZGlhbjogXCggXGZyYWN7Tn17Mn0gPSA0NSBcKQ0KDQotIEtlbGFzIG1lZGlhbjogS2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSBrdW11bGF0aWYgeWFuZyBtZW5jYWt1cCBuaWxhaSBrZS00NS4gRGFyaSBkYXRhLCBrZWxhcyBtZWRpYW4gYWRhbGFoIDE1MS4wMDAgLSAyMDAuMDAwLg0KDQogIC0gXChMID0gMTUxLjAwMFwpIChiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4pDQogIA0KICAtIFwoRiA9IDMwXCkgKGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4pDQogIA0KICAtIFwoZl9tID0gMjVcKSAoZnJla3VlbnNpIGtlbGFzIG1lZGlhbikNCiAgDQogIC0gXChjID0gNTAuMDAwXCkgKHBhbmphbmcga2VsYXMpDQoNClBlcmhpdHVuZ2FuOg0KXFsNClx0ZXh0e01lZGlhbn0gPSAxNTEuMDAwICsgXGxlZnQoIFxmcmFjezQ1IC0gMzB9ezI1fSBccmlnaHQpIFxjZG90IDUwLjAwMA0KXF0NClxbDQpcdGV4dHtNZWRpYW59ID0gMTUxLjAwMCArIDMwLjAwMCA9IDE4MS4wMDANClxdDQoNCk5pbGFpIGRhcmkgTWVkaWFuID0gMTgxLjAwMA0KDQotLS0NCg0KIyMjIyBNb2R1cyhQYWxpbmcgc2VyaW5nIG11bmN1bCkNCg0KIyMjIyAzLiBNb2R1cw0KUnVtdXMgbW9kdXM6DQpcWw0KXHRleHR7TW9kdXN9ID0gTCArIFxsZWZ0KCBcZnJhY3tmX20gLSBmXzF9eyhmX20gLSBmXzEpICsgKGZfbSAtIGZfMil9IFxyaWdodCkgXGNkb3QgYw0KXF0NCg0KUGFyYW1ldGVyOg0KLSBLZWxhcyBtb2R1czogS2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2kgPSAxNTEuMDAwIC0gMjAwLjAwMA0KDQogIC0gXChMID0gMTUxLjAwMFwpDQogIA0KICAtIFwoZl9tID0gMjVcKQ0KICANCiAgLSBcKGZfMSA9IDE4XCkgKGZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzKQ0KICANCiAgLSBcKGZfMiA9IDIwXCkgKGZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIGtlbGFzIG1vZHVzKQ0KICANCiAgLSBcKGMgPSA1MC4wMDBcKQ0KDQpQZXJoaXR1bmdhbjoNClxbDQpcdGV4dHtNb2R1c30gPSAxNTEuMDAwICsgXGxlZnQoIFxmcmFjezI1IC0gMTh9eygyNSAtIDE4KSArICgyNSAtIDIwKX0gXHJpZ2h0KSBcY2RvdCA1MC4wMDANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gMTUxLjAwMCArIFxsZWZ0KCBcZnJhY3s3fXs3ICsgNX0gXHJpZ2h0KSBcY2RvdCA1MC4wMDANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gMTUxLjAwMCArIDI5LjE2NyA9IDE4MC4xNjcNClxdDQoNCktlc2ltcHVsYW46DQoNCi0gTWVhbiAoUmF0YS1yYXRhKTogMTc5LjQ0NA0KDQotIE1lZGlhbiAoTmlsYWkgVGVuZ2FoKTogMTgxLjAwMA0KDQotIE1vZHVzIChQYWxpbmcgU2VyaW5nIE11bmN1bCk6IDE4MC4xNjcNCg0KLS0tDQoNCiMjIEtlc2VoYXRhbg0KUGFkYSBiaWRhbmcga2VzZWhhdGFuLHNheWEgbWVtYnVhdCB0YWJlbCBrZWxvbXBvayB0ZW50YW5nIHByb2dyYW0gcGVuY2VnYWhhbiBkaWFiZXRlcyBwYXNpZW4gc2VsYW1hIDMgYnVsYW4uIA0KDQojIyMjIFRhYmVsIERhdGEgS2Vsb21wb2sNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rIHVudHVrIE9iYXQNCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgImRhdGFfcGFzaWVuX2RpYWJldGVzXyhtZy9kbCkiID0gYygiNzAgLSA4OSIsICI5MCAtIDEwOSIsICIxMTAgLSAxMjkiLCAiMTMwIC0gMTQ5IiwgIjE1MCAtIDE2OSIpLA0KICAiRnJla3VlbnNpIChmX2kpIiA9IGMoNSwgMTIsIDIwLCA4LCA1KQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIikNCg0KYGBgDQojIyMjIE1lYW4oUmF0YS1yYXRhKQ0KVW50dWsgbWVuY2FyaSBtZWFuIGtpdGEgZGFwYXQgbWVuZ2hpdHVuZyBuaWxhaSB0ZW5nZ2FoIHRlcmxlYmloIGRhaHVsdS4gc2VsYW5qdXRueWEga2l0YSBiaXNhIG1lbmdoaXR1bmcgbWVhbi4NCg0KIyMjIyAxLiBNZWFuIChSYXRhLXJhdGEpDQpSdW11cyBNZWFuOg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7XFNpZ21hIChmIFxjZG90IHgpfXtcU2lnbWEgZn0NClxdDQoNCi0gZuKLhXggYWRhbGFoIGhhc2lsIHBlcmthbGlhbiBmcmVrdWVuc2kgKGYpIGRlbmdhbiB0aXRpayB0ZW5nYWggKHgpIHBhZGEgc2V0aWFwIGtlbGFzLg0KDQotIM6jKPCdkZPii4XwnZGlKSA9IDU4OTUNCg0KLSDOo2Y9NTANClxbDQpcdGV4dHtNZWFufSA9IFxmcmFje1xTaWdtYSAoNTg5NSl9ezUwfSA9IDExNy45bWcvZGwNClxdDQoNCiMjIyMgTWVkaWFuKE5pbGFpIFRlbmdhaCkNCnNlbGFuanV0bnlhIGtpdGEgZGFwYXQgbWVuY2FyaSBtZWRpYW4gbnlhIGRlbmdhbiByaW5jaWFuIHNlYmFnYWkgYmVyaWt1dDoNCg0KIyMjIyAyLiBNZWRpYW4NCkxhbmdrYWggLSBsYW5na2FobnlhOg0KDQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcZnJhY3sobi8yIC0gZil9e2ZtfSBcY2RvdCBjDQpcXQ0KDQpLZXRlcmFuZ2FuOg0KDQotIEw6IEJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbiA9IDExMA0KDQotIG4vMiA6IFNlcGFydWgganVtbGFoIHRvdGFsIGZyZWt1ZW5zaSA9IDUwLzIgPSAyNQ0KDQotIEY6IEZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4gPSA1ICsgMTIgPSAxNw0KDQot8J2Rk/CdkZo6IEZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4gPSAyMA0KDQotIGM6IFBhbmphbmcga2VsYXMgPSAxMzAg4oiSIDExMCA9IDIwDQoNCnN1YnRpdHVzaToNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSAxMTAgKyBcZnJhY3soMjUgLSAxNyl9ezIwfSBcY2RvdCAyMA0KXF0NCg0KXFsNClx0ZXh0e01lZGlhbn0gPSAxMTAgKyBcZnJhY3soOCl9ezIwfSBcY2RvdCAyMA0KXF0NCg0KXFsNClx0ZXh0e01lZGlhbn0gPSAxMTAgKyAxOCA9IDExOG1nL2RsDQpcXQ0KDQojIyMjIDMuIE1vZHVzDQoNCk1vZHVzIGFkYWxhaCBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSwgeWFpdHUgMzEgLSA0MCAoZnJla3VlbnNpIDM1KS4NCg0KR3VuYWthbiBydW11cyBtb2R1czoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGZyYWN7KGYxIC0gZjApfXsoZjEgLSBmMCkrKGYxICsgZjIpfSBcY2RvdCBpDQpcXQ0KDQpLZXRlcmFuZ2FuOg0KDQotIEw6IEJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzID0gMTEwDQoNCi3wnZGTMSA6IEZyZWt1ZW5zaSBrZWxhcyBtb2R1cyA9IDIwDQoNCi3wnZGTMCA6IEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzID0gMTINCg0KLfCdkZMyIDogRnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMgPSA4DQoNCmM6IFBhbmphbmcga2VsYXMgPSAxMzAg4oiSIDExMCA9IDIwDQoNClxbDQpcdGV4dHtNb2R1c30gPSAxMTAgKyBcZnJhY3soMjAgLSAxMil9eygyMCAtIDEyKSsoMjAgKyA4KX0gXGNkb3QgMjANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSAxMTAgKyBcZnJhY3soOCl9eyg4ICsgMTIpfSBcY2RvdCAyMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDExMCArIFxmcmFjeyg4KX17KDIwKX0gXGNkb3QgMjANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSAxMTAgKyA4ID0gMTE4bWcvZGwNClxdDQoNCktlc2ltcHVsYW46DQoNCi0gTWVhbiAoUmF0YS1yYXRhKTogMTE3LjltZy9kbA0KDQotIE1lZGlhbiAoTmlsYWkgVGVuZ2FoKTogMTEwICsgMTggPSAxMThtZy9kbA0KDQotIE1vZHVzIChQYWxpbmcgU2VyaW5nIE11bmN1bCk6IDExMCArIDggPSAxMThtZy9kbA0KDQotLS0NCg0KIyMjIyBNZW5naGl0dW5nIFBlcnNlbmFuDQoNCiMjIyMgMS4gUGVyaGl0dW5nYW4gTWVhbiAoMTE3LjkgbWcvZEwpICANCmEuIFRlbnR1a2FuIGZyZWt1ZW5zaSBrdW11bGF0aWYgeWFuZyBtZW5jYWt1cCA5MCUgZGF0YToNCi0gVG90YWwgZGF0YTogXCggNTAgXCkgIA0KICBcKCA5MFwlIFx0aW1lcyA1MCA9IDQ1IFwpLiAgDQogIE5pbGFpIGRhdGEga2UtNDUgYmVyYWRhIGRhbGFtIGtlbGFzICoxMzAtMTQ5IG1nL2RMDQoNCmIuIEFuYWxpc2lzIGFwYWthaCBtZWFuICgxMTcuOSkgYmVyYWRhIGRhbGFtIGNha3VwYW4gOTAlOg0KLSBNZWFuICgxMTcuOSkgYmVyYWRhIGRhbGFtIGtlbGFzIDExMC0xMjkgbWcvZEwsIHlhbmcga3VtdWxhdGlmIGZyZWt1ZW5zaW55YSBhZGFsYWggXCggNSArIDEyICsgMjAgPSAzNyBcKSAoNzQlKS4NCg0KLSBOaWxhaSBpbmkgdGlkYWsgdGVybWFzdWsgOTAlIGRpc3RyaWJ1c2kgZGF0YS4NCg0KYy4gUGVyc2VudGFzZSBjYWt1cGFuIG1lYW46DQpcWw0KXHRleHR7UGVyc2VudGFzZSBtZWFufSA9IFxmcmFje1x0ZXh0e0ZyZWt1ZW5zaSBrZWxhcyBtZWFufX17XHRleHR7VG90YWwgZnJla3VlbnNpfX0gXHRpbWVzIDEwMFwlID0gXGZyYWN7MjB9ezUwfSBcdGltZXMgMTAwXCUgPSA0MFwlDQpcXQ0KDQotLS0NCg0KIyMjIyAyLiBQZXJoaXR1bmdhbiBNZWRpYW4gKDExOCBtZy9kTCkgIA0KIGEuIExva2FzaSBtZWRpYW46DQotIE1lZGlhbiBiZXJhZGEgZGkga2VsYXMgMTEwLTEyOSBtZy9kTCwgZGVuZ2FuIGt1bXVsYXRpZiBmcmVrdWVuc2kgaGluZ2dhIGtlbGFzIGluaSA9IFwoIDM3IFwpICg3NCUpLiAgDQoNCiBiLlBlcnNlbnRhc2UgY2FrdXBhbiBtZWRpYW46DQpcWw0KXHRleHR7UGVyc2VudGFzZSBtZWRpYW59ID0gXGZyYWN7XHRleHR7RnJla3VlbnNpIGtlbGFzIG1lZGlhbn19e1x0ZXh0e1RvdGFsIGZyZWt1ZW5zaX19IFx0aW1lcyAxMDBcJSA9IFxmcmFjezIwfXs1MH0gXHRpbWVzIDEwMFwlID0gNDBcJQ0KXF0NCg0KLS0tDQoNCiMjIyMgMy4gUGVyaGl0dW5nYW4gTW9kdXMgKDExOCBtZy9kTCkgIA0KIGEuIExva2FzaSBtb2R1czoNCi0gTW9kdXMgYmVyYWRhIGRpIGtlbGFzIDExMC0xMjkgbWcvZEwsIGRlbmdhbiBrdW11bGF0aWYgZnJla3VlbnNpIGhpbmdnYSBrZWxhcyBpbmkgPSBcKCAzNyBcKSAoNzQlKS4gIA0KDQpiLiBQZXJzZW50YXNlIGNha3VwYW4gbW9kdXM6DQpcWw0KXHRleHR7UGVyc2VudGFzZSBtb2R1c30gPSBcZnJhY3tcdGV4dHtGcmVrdWVuc2kga2VsYXMgbW9kdXN9fXtcdGV4dHtUb3RhbCBmcmVrdWVuc2l9fSBcdGltZXMgMTAwXCUgPSBcZnJhY3syMH17NTB9IFx0aW1lcyAxMDBcJSA9IDQwXCUNClxdDQoNCi0tLQ0KDQojIyMjIDQuIEh1YnVuZ2FuIGRlbmdhbiBGcmVrdWVuc2kgOTAlDQpGcmVrdWVuc2kgOTAlIG1lbmNha3VwIGtlbGFzIGhpbmdnYSAxMzAtMTQ5IG1nL2RMLiBOYW11bjogIA0KLSBNZWFuICgxMTcuOSBtZy9kTCk6IE1hc3VrIGhpbmdnYSBrZWxhcyBcKCA3NFwlIFwpLiAgDQotIE1lZGlhbiAoMTE4IG1nL2RMKTogTWFzdWsgaGluZ2dhIGtlbGFzIFwoIDc0XCUgXCkuICANCi0gTW9kdXMgKDExOCBtZy9kTCk6IE1hc3VrIGhpbmdnYSBrZWxhcyBcKCA3NFwlIFwpLiAgDQoNCkppa2EgZGl1a3VyIHNlY2FyYSB0ZXJwaXNhaCwgNDAlIGRpc3RyaWJ1c2kgZGF0YSBiZXJwdXNhdCBwYWRhIGtlbGFzIG1vZHVzLCBtZWFuLCBkYW4gbWVkaWFuICgxMTAtMTI5IG1nL2RMKS4NCg0KS2VzaW1wdWxhbiAgDQotIFBlcnNlbnRhc2UgTWVhbjogNDAlICANCi0gUGVyc2VudGFzZSBNZWRpYW46IDQwJSAgDQotIFBlcnNlbnRhc2UgTW9kdXM6IDQwJQ0KDQotLS0NCg0KDQotLS0NCg0KIyMgUGVuZGlkaWthbiANClBhZGEgYmlkYW5nIHBlbmRpZGlrYW4sc2F5YSBtZW1idWF0IGRhdGEgdGVudGFuZyBrZWxvbXBvayBqYW0ga2VyamEgZ3VydSBkZW5nYW4gcmluY2lhbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiMjIyMgVGFiZWwgRGF0YSBLZWxvbXBvaw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sgQnVrdSBQZXJwdXN0YWthYW4NCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIktlbG9tcG9rX0phbSBLZXJqYV8oamFtL21pbmdndSkiID0gYygiMCAtIDEwIiwgIjExIC0gMjAiLCAiMjEgLSAzMCIsICIzMSAtIDQwIiwgIjQxIC0gNTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKCI1IiwgIjE1IiwgIjI1IiwgIjM1IiwgIjIwIikNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0Ka2FibGUoZGF0YSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgRGF0YSBLZWxvbXBvayB1bnR1ayIpDQoNCmBgYA0KDQotIDAgLSAxMDogSnVtbGFoIGluZGl2aWR1IHlhbmcgYmVrZXJqYSBhbnRhcmEgMCBoaW5nZ2EgMTAgamFtIHBlciBtaW5nZ3UgYWRhbGFoIDUgb3JhbmcuDQoNCi0gMTEgLSAyMDogSnVtbGFoIGluZGl2aWR1IHlhbmcgYmVrZXJqYSBhbnRhcmEgMTEgaGluZ2dhIDIwIGphbSBwZXIgbWluZ2d1IGFkYWxhaCAxNSBvcmFuZy4NCg0KLSAyMSAtIDMwOiBKdW1sYWggaW5kaXZpZHUgeWFuZyBiZWtlcmphIGFudGFyYSAyMSBoaW5nZ2EgMzAgamFtIHBlciBtaW5nZ3UgYWRhbGFoIDI1IG9yYW5nLg0KDQotIDMxIC0gNDA6IEp1bWxhaCBpbmRpdmlkdSB5YW5nIGJla2VyamEgYW50YXJhIDMxIGhpbmdnYSA0MCBqYW0gcGVyIG1pbmdndSBhZGFsYWggMzUgb3JhbmcuDQoNCi0gNDEgLSA1MDogSnVtbGFoIGluZGl2aWR1IHlhbmcgYmVrZXJqYSBhbnRhcmEgNDEgaGluZ2dhIDUwIGphbSBwZXIgbWluZ2d1IGFkYWxhaCAyMCBvcmFuZy4NCg0KIyMjIyBUYWJlbCBEYXRhIGtlbG9tcG9rIHBlcmhpdHVuZ2FuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IGRhdGEga2Vsb21wb2sgQnVrdSBQZXJwdXN0YWthYW4NCmxpYnJhcnkoa25pdHIpDQoNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgIktlbG9tcG9rX0phbSBLZXJqYV8oamFtL21pbmdndSkiID0gYygiMCAtIDEwIiwgIjExIC0gMjAiLCAiMjEgLSAzMCIsICIzMSAtIDQwIiwgIjQxIC0gNTAiKSwNCiAgIkZyZWt1ZW5zaSIgPSBjKCI1IiwgIjE1IiwgIjI1IiwgIjM1IiwgIjIwIiksDQogICJUaXRpayB0ZW5nZ2FoIiA9YygiNSIsICIxNSIsICIyNSIsIjM1IiwiNDUiKSwNCiAgIkYgeCBYIiA9YygiMjUiLCAiMjI1IiwgIjYyNSIsICIxLjIyNSIsICI5MDAiKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQprYWJsZShkYXRhLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJUYWJlbCBEYXRhIEtlbG9tcG9rIHVudHVrIikNCg0KYGBgDQoNCiMjIyMgTWVhbiAoUmF0YS1yYXRhKQ0KVW50dWsgbWVuY2FyaSBtZWFuIGtpdGEgZGFwYXQgbWVuZ2hpdHVuZyBuaWxhaSB0ZW5nZ2FoIHRlcmxlYmloIGRhaHVsdS4gc2VsYW5qdXRueWEga2l0YSBiaXNhIG1lbmdoaXR1bmcgbWVhbg0KDQojIyMjIDEuIE1lYW4gKFJhdGEtcmF0YSkNClJ1bXVzIG1lYW46ICANCg0KMS5UaXRpayBUZW5nYWggKHgpIGFkYWxhaCBuaWxhaSB0ZW5nYWggZGFyaSBzZXRpYXAga2Vsb21wb2suIA0KDQpEaWhpdHVuZyBkZW5nYW4gcnVtdXM6DQoNClxbDQpcdGV4dHt4fSA9IFxmcmFje1wgKEJhdGFzIGF0YXMgKyBCYXRhcyBiYXdhaCl9ezJ9DQpcXQ0KDQpNaXNhbG55YSB1bnR1ayBrZWxvbXBvayAwIC0gMTA6DQoNClxbDQpcdGV4dHt4fSA9IFxmcmFje1wgKDAgKyAxMCl9ezJ9ID0gNQ0KXF0NCg0KVW50dWsga2Vsb21wb2sgMTEgLSAyMDoNCg0KXFsNClx0ZXh0e3h9ID0gXGZyYWN7XCAoMTEgKyAyMCl9ezJ9ID0gMTUNClxdDQoNCg0KMi4gZiDDlyB4IGFkYWxhaCBoYXNpbCBwZXJrYWxpYW4gYW50YXJhIGZyZWt1ZW5zaSAoZikgZGFuIHRpdGlrIHRlbmdhaCAoeCkgdW50dWsgc2V0aWFwIGtlbG9tcG9rOg0KDQpVbnR1ayBrZWxvbXBvayAwIC0gMTA6IA0KDQpmIMOXIHggPSA1IMOXIDUgPSAyNQ0KDQpVbnR1ayBrZWxvbXBvayAxMSAtIDIwOiANCg0KZiDDlyB4ID0gMTUgw5cgMTU9IDIyNQ0KDQpVbnR1ayBrZWxvbXBvayAyMSAtIDMwOiANCg0KZiDDlyB4ID0gMjUgw5cgMjUgPSA2MjUNCg0KVW50dWsga2Vsb21wb2sgMzEgLSA0MDogDQoNCmYgw5cgeCA9IDM1IMOXIDM1ID0gMS4yMjUNCg0KVW50dWsga2Vsb21wb2sgNDEgLSA1MDogDQoNCmYgw5cgeCA9IDIwIMOXIDQ1ID0gOTAwDQoNCjMuSnVtbGFoa2FuIHNlbXVhIGhhc2lsIHBlcmthbGlhbiAozqMgZiDDlyB4KToNCg0KMjUgKyAyMjUgKyA2MjUgKyAxLjIyNSArIDkwMCA9IDMuMDAwDQoNCjQuSnVtbGFoa2FuIHNlbXVhIGZyZWt1ZW5zaSAozqMgZik6DQo1ICsgMTUgKyAyNSsgMzUgKyAyMCA9IDEwMA0KDQo1LiBIaXR1bmcgTWVhbiBkZW5nYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVhbn0gPSBcZnJhY3tcU2lnbWEgKGYgXGNkb3QgeCl9e1xTaWdtYSBmfQ0KXF0NCg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7ICgzLjAwMCl9e1xTaWdtYSAxMDB9ID0gMzANClxdDQoNCkhhc2lsOg0KTWVhbiAocmF0YS1yYXRhKSBqYW0ga2VyamEgcGVyIG1pbmdndSBhZGFsYWggMzAgamFtLg0KDQotLS0NCg0KIyMjIyBNZWRpYW4oTmlsYWkgVGVuZ2FoKQ0Kc2VsYW5qdXRueWEga2l0YSBkYXBhdCBtZW5jYXJpIG1lZGlhbiBueWEgZGVuZ2FuIHJpbmNpYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQojIyMjIDIuIE1lZGlhbg0KTGFuZ2thaCAtIGxhbmdrYWhueWE6DQoNCjEuSGl0dW5nIGZyZWt1ZW5zaSBrdW11bGF0aWYgKEZrdW0pOg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCBkYXRhIGtlbG9tcG9rIEJ1a3UgUGVycHVzdGFrYWFuDQpsaWJyYXJ5KGtuaXRyKQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogICJLZWxvbXBva19KYW0gS2VyamFfKGphbS9taW5nZ3UpIiA9IGMoIjAgLSAxMCIsICIxMSAtIDIwIiwgIjIxIC0gMzAiLCAiMzEgLSA0MCIsICI0MSAtIDUwIiksDQogICJGcmVrdWVuc2kiID0gYygiNSIsICIxNSIsICIyNSIsICIzNSIsICIyMCIpLA0KICAiRmt1bSIgPSBjKCI1IiwgIjIwIiwgIjQ1IiwgIjgwIiwgIjEwMCIpDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwNCmthYmxlKGRhdGEsIGFsaWduID0gImMiLCBjYXB0aW9uID0gIlRhYmVsIERhdGEgS2Vsb21wb2sgdW50dWsiKQ0KDQpgYGANCg0KMi4gVGVudHVrYW4ga2Vsb21wb2sgbWVkaWFuDQoNCi0gVG90YWwgZnJla3VlbnNpID0gMTAwDQoNCl8gTGV0YWsgbWVkaWFuIG4vMiA9IDEwMC8yID0gNTANCg0KXyBLZWxvbXBvayBkZW5nYW4gRmt1bSDiiaUgNTAgYWRhbGFoIDMxIC0gNDAuDQoNCjMuIEd1bmFrYW4gUnVtdXMgTWVkaWFuOg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGZyYWN7KG4vMiAtIGZzZWJlbHVtKX17Zm1lZGlhbn0gXGNkb3QgaQ0KXF0NCg0KLSBMID0gYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuID0gMzANCg0KLSBuID0gdG90YWwgZnJla3VlbnNpID0gMTAwDQoNCi0gRiBzZWJlbHVtID0gRmt1bSBzZWJlbHVtIGtlbGFzIG1lZGlhbiA9IDQ1DQoNCi0gZiBtZWRpYW4gPSBmcmVrdWVuc2kga2VsYXMgbWVkaWFuID0gMzUNCg0KLSBpID0gcGFuamFuZyBrZWxhcyA9IDEwDQoNCnN1YnRpdHVzaSA6DQpcWw0KXHRleHR7TWVkaWFufSA9IDMwICsgXGZyYWN7KDUwIC0gNDUpfXszNX0gXGNkb3QgMTAgDQpcXQ0KDQpcWw0KXHRleHR7TWVkaWFufSA9IDMwICsgXGZyYWN7KDUpfXszNX0gXGNkb3QgMTAgPSAzMCArIDEuNDMgPSAzMS40Mw0KXF0NCg0KSmFkaSwgbWVkaWFuIHlhbmcgZGlwZXJvbGVoID0gMzEuNDMgamFtLg0KDQotLS0NCg0KLS0tDQoNCiMjIyMgTW9kdXMoUGFsaW5nIHNlcmluZyBtdW5jdWwpDQoNCiMjIyMgMy4gTW9kdXMNCg0KTW9kdXMgYWRhbGFoIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpLCB5YWl0dSAzMSAtIDQwIChmcmVrdWVuc2kgMzUpLg0KDQpHdW5ha2FuIHJ1bXVzIG1vZHVzOg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcZnJhY3soZDEpfXtkMSArIGQyfSBcY2RvdCBpDQpcXQ0KDQotIEwgPSBiYXRhcyBiYXdhaCBrZWxhcyBtb2R1cyA9IDMwDQoNCi0gZDEgPSBzZWxpc2loIGZyZWt1ZW5zaSBrZWxhcyBtb2R1cyBkZW5nYW4ga2VsYXMgc2ViZWx1bW55YSA9IA0KDQotIDM1IOKIkiAyNSA9IDEwDQoNCi0gZDIgPSBzZWxpc2loIGZyZWt1ZW5zaSBrZWxhcyBtb2R1cyBkZW5nYW4ga2VsYXMgc2V0ZWxhaG55YSA9IA0KDQotIDM14oiSMjA9MTUNCg0KLSBpID0gcGFuamFuZyBrZWxhcyA9IDEwDQoNClN1YnRpdHVzaToNClxbDQpcdGV4dHtNb2R1c30gPSAzMCArIFxmcmFjeygxMCl9ezEwICsgMTV9IFxjZG90IDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMzAgKyBcZnJhY3soMTApfXsyNX0gXGNkb3QgMTANClxdDQoNCjMwICsgNCA9IDM0DQoNCkphZGksIG1vZHVzIHlhbmcgZGlwZXJvbGVoID0gMzQgamFtLg0KDQpLZXNpbXB1bGFuOg0KDQotIE1lYW4gKFJhdGEtcmF0YSk6IDMwIGphbQ0KDQotIE1lZGlhbiAoTmlsYWkgVGVuZ2FoKTogMzEuNDMgamFtDQoNCi0gTW9kdXMgKFBhbGluZyBTZXJpbmcgTXVuY3VsKTogMzQgamFtDQoNCi0tLQ0KDQo=