Praktikum 1 & 2

Statistika Dasar

Logo

PRAKTIKUM 1

1.1 Mean untuk Data Kelompok

Dalam data kelompok, mean atau rata-rata dihitung dengan mempertimbangkan frekuensi setiap kelas dalam kelompok tersebut. Rumus umum untuk menghitung mean data kelompok adalah:

\[ \bar{x} = \frac{\sum (f_i \cdot x_i)}{\sum f_i} \]

Penjelasan Rumus:

  • \(\bar{x}\) = mean (rata-rata) data kelompok
  • \(f_i\) = frekuensi pada kelas ke-\(i\)
  • \(x_i\) = kelas tengah (midpoint) pada kelas ke-\(i\)
  • \(\sum (f_i \cdot x_i)\) = jumlah dari hasil perkalian antara frekuensi dan kelas tengah
  • \(\sum f_i\) = total frekuensi (jumlah semua frekuensi)

1.1.1 Langkah-langkah:

  1. Tentukan kelas tengah untuk setiap kelas interval
  2. Kalikan kelas tengah dengan frekuensi untuk setiap kelas.
  3. Jumlahkan hasil perkalian tersebut.
  4. Bagi jumlah tersebut dengan total frekuensi.

CONTOH PERHITUNGAN

1.1.2 DATA DENGAN OUTLIER:

Kelas Frekuensi (\(f\))
10 - 20 5
20 - 30 8
30 - 40 7
40 - 50 50
50 - 60 5

1.1.2.1 Langkah-langkah Perhitungan untuk Data dengan Outlier:

  1. Tentukan kelas tengah (\(x_i\)) untuk setiap kelas:
  • Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} = 15\)
  • Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} = 25\)
  • Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} = 35\)
  • Kelas 40 - 50: \(x_4 = \frac{40 + 50}{2} = 45\)
  • Kelas 50 - 60: \(x_5 = \frac{50 + 60}{2} = 55\)
  1. Hitung \(f_i \cdot x_i\) untuk setiap kelas:
  • \(f_1 \cdot x_1 = 5 \cdot 15 = 75\)
  • \(f_2 \cdot x_2 = 8 \cdot 25 = 200\)
  • \(f_3 \cdot x_3 = 7 \cdot 35 = 245\)
  • \(f_4 \cdot x_4 = 50 \cdot 45 = 2250\)
  • \(f_5 \cdot x_5 = 5 \cdot 55 = 275\)
  1. Hitung jumlah \(f_i \cdot x_i\):

\[ 75 + 200 + 245 + 2250 + 275 = 3045 \]

  1. Hitung jumlah total frekuensi:

\[ 5 + 8 + 7 + 50 + 5 = 75 \]

  1. Hitung mean dengan data yang ada outlier:

\[ \bar{x} = \frac{3045}{75} = 40.60 \]

Hasil mean dengan outlier = 40.60.

1.1.3 DATA TANPA OUTLIER:

Untuk menghitung data tanpa outlier, kita akan menghapus kelas interval 40 - 50 dengan frekuensi 50, dan menghitung ulang mean.

Kelas Frekuensi (\(f\))
10 - 20 5
20 - 30 8
30 - 40 7
50 - 60 5

1.1.3.1 Langkah-langkah Perhitungan untuk Data Tanpa Outlier:

  1. Tentukan kelas tengah (\(x_i\)) untuk setiap kelas:
  • Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} = 15\)
  • Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} = 25\)
  • Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} = 35\)
  • Kelas 50 - 60: \(x_4 = \frac{50 + 60}{2} = 55\)
  1. Hitung \(f_i \cdot x_i\) untuk setiap kelas:
  • \(f_1 \cdot x_1 = 5 \cdot 15 = 75\)
  • \(f_2 \cdot x_2 = 8 \cdot 25 = 200\)
  • \(f_3 \cdot x_3 = 7 \cdot 35 = 245\)
  • \(f_4 \cdot x_4 = 5 \cdot 55 = 275\)
  1. Hitung jumlah \(f_i \cdot x_i\):

\[ 75 + 200 + 245 + 275 = 795 \]

  1. Hitung jumlah total frekuensi:

\[ 5 + 8 + 7 + 5 = 25 \]

  1. Hitung mean tanpa outlier:

\[ \bar{x} = \frac{795}{25} = 31.80 \]

Hasil mean tanpa outlier = 31.80.

1.1.4 Kesimpulan:

  • Mean dengan outlier: 40.60
  • Mean tanpa outlier: 31.80

Outlier yang sangat besar pada kelas interval 40 - 50 menyebabkan mean menjadi lebih tinggi daripada ketika outlier dihapus.

1.1.5 Visualisasi Mean dalam Boxplot

1.1.6 Visualisasi Mean dalam Density Plot


1.2 Median untuk Data Kelompok

Untuk menghitung median data kelompok, kita mencari kelas median terlebih dahulu, yang kemudian digunakan untuk menghitung median menggunakan rumus berikut:

\[ \text{Median} = L + \left(\frac{\frac{N}{2} - F}{f}\right) \cdot h \]

Penjelasan Rumus:

  • \(L\) = batas bawah kelas median
  • \(N\) = total frekuensi (jumlah semua frekuensi)
  • \(F\) = jumlah frekuensi kumulatif sebelum kelas median
  • \(f\) = frekuensi kelas median
  • \(h\) = panjang kelas (jarak antara batas bawah dan batas atas kelas)

1.2.1 Langkah-langkah:

  1. Tentukan kelas median (kelas yang memiliki frekuensi kumulatif lebih dari \(\frac{N}{2}\)).
  2. Gunakan rumus di atas untuk menghitung median.

CONTOH PERHITUNGAN

1.2.2 DATA DENGAN OUTLIER:

Kelas Frekuensi (\(f\)) Frekuensi Kumulatif (F)
10 - 20 5 5
20 - 30 8 13
30 - 40 7 20
40 - 50 50 70
50 - 60 5 75
  • Total frekuensi (n) = 75
  • \(\frac{n}{2} = \frac{75}{2} = 37.5\), yang berarti median berada di kelas dengan frekuensi kumulatif lebih besar dari 37.5.
  • Kelas yang mengandung median adalah kelas 40 - 50 (karena frekuensi kumulatifnya adalah 70, yang lebih besar dari 37.5).

1.2.2.1 Langkah-langkah perhitungan median:

  • L (batas bawah kelas median) = 40
  • F (frekuensi kumulatif sebelum kelas median) = 20
  • f (frekuensi kelas median) = 50
  • h (panjang kelas interval) = 10

\[ \text{Median} = 40 + \left( \frac{37.5 - 20}{50} \right) \times 10 = 40 + \left( \frac{17.5}{50} \right) \times 10 = 40 + 3.5 = 43.5 \]

Median untuk data dengan outlier = 43.5.


1.2.3 DATA TANPA OUTLIER:

Kelas Frekuensi (\(f\)) Frekuensi Kumulatif (F)
10 - 20 5 5
20 - 30 8 13
30 - 40 7 20
50 - 60 5 25
  • Total frekuensi (n) = 25
  • \(\frac{n}{2} = \frac{25}{2} = 12.5\), yang berarti median berada di kelas dengan frekuensi kumulatif lebih besar dari 12.5.
  • Kelas yang mengandung median adalah kelas 20 - 30 (karena frekuensi kumulatifnya adalah 13, yang lebih besar dari 12.5).

1.2.3.1 Langkah-langkah perhitungan median:

  • L (batas bawah kelas median) = 20
  • F (frekuensi kumulatif sebelum kelas median) = 5
  • f (frekuensi kelas median) = 8
  • h (panjang kelas interval) = 10

\[ \text{Median} = 20 + \left( \frac{12.5 - 5}{8} \right) \times 10 = 20 + \left( \frac{7.5}{8} \right) \times 10 = 20 + 9.375 = 29.375 \]

Median untuk data tanpa outlier = 29.375.


1.2.4 Kesimpulan:

  • Median dengan outlier: 43.5
  • Median tanpa outlier: 29.375

Outlier pada data menyebabkan median yang lebih tinggi, karena kelas interval dengan frekuensi kumulatif tertinggi (40 - 50) memiliki nilai yang lebih tinggi, memengaruhi posisi median.

1.2.5 Visualisasi Median dalam Boxplot

1.2.6 Visualisasi Median dalam Density Plot


1.3 Modus untuk Data Kelompok

Untuk menghitung modus data kelompok, kita mencari kelas modus, yaitu kelas dengan frekuensi tertinggi, dan menggunakan rumus berikut:

\[ \text{Modus} = L + \left(\frac{f_1 - f_0}{2f_1 - f_0 - f_2}\right) \cdot h \]

Penjelasan Rumus:

  • \(L\) = batas bawah kelas modus
  • \(f_1\) = frekuensi kelas modus
  • \(f_0\) = frekuensi kelas sebelum kelas modus
  • \(f_2\) = frekuensi kelas setelah kelas modus
  • \(h\) = panjang kelas (jarak antara batas bawah dan batas atas kelas)

1.3.1 Langkah-langkah:

  1. Tentukan kelas modus (kelas dengan frekuensi tertinggi).
  2. Hitung modus menggunakan rumus di atas.

CONTOH PERHITUNGAN

1.3.2 DATA DENGAN OUTLIER:

Kelas Frekuensi (\(f\)) Frekuensi Kumulatif (F)
10 - 20 5 5
20 - 30 8 13
30 - 40 7 20
40 - 50 50 70
50 - 60 5 75
  • Kelas dengan frekuensi tertinggi adalah kelas 40 - 50 dengan frekuensi f₁ = 50.
  • L (batas bawah kelas modus) = 40
  • f₀ (frekuensi kelas sebelum kelas modus) = 7 (kelas 30 - 40)
  • f₂ (frekuensi kelas setelah kelas modus) = 5 (kelas 50 - 60)
  • h (panjang kelas interval) = 10

1.3.2.1 Langkah-langkah perhitungan modus:

\[ \text{Modus} = 40 + \left( \frac{50 - 7}{(2 \times 50) - 7 - 5} \right) \times 10 \]

\[ \text{Modus} = 40 + \left( \frac{43}{100 - 7 - 5} \right) \times 10 = 40 + \left( \frac{43}{88} \right) \times 10 \]

\[ \text{Modus} = 40 + 4.886 = 44.89 \]

Modus untuk data dengan outlier = 44.89


1.3.3 DATA TANPA OUTLIER:

Kelas Frekuensi (\(f\)) Frekuensi Kumulatif (F)
10 - 20 5 5
20 - 30 8 13
30 - 40 7 20
50 - 60 5 25
  • Kelas dengan frekuensi tertinggi adalah kelas 20 - 30 dengan frekuensi f₁ = 8.
  • L (batas bawah kelas modus) = 20
  • f₀ (frekuensi kelas sebelum kelas modus) = 5 (kelas 10 - 20)
  • f₂ (frekuensi kelas setelah kelas modus) = 7 (kelas 30 - 40)
  • h (panjang kelas interval) = 10

1.3.3.1 Langkah-langkah perhitungan modus:

\[ \text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right) \times 10 \]

\[ \text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 + \left( \frac{3}{4} \right) \times 10 \]

\[ \text{Modus} = 20 + 7.5 = 27.5 \]

Modus untuk data tanpa outlier = 27.5


1.3.4 Kesimpulan:

  • Modus dengan outlier = 44.89
  • Modus tanpa outlier = 27.5

Perhitungan modus menunjukkan perbedaan yang signifikan, yang disebabkan oleh outlier pada data. Outlier menggeser kelas modus ke kelas dengan frekuensi yang sangat tinggi (kelas 40-50), yang berkontribusi pada nilai modus yang lebih tinggi.

1.3.5 Visualisasi Modus dalam Boxplot

1.3.6 Visualisasi Modus dalam Density Plot


PRAKTIKUM 2

2.1 BIDANG BISNIS

Deskripsi Masalah:

Sebuah perusahaan mengumpulkan data pendapatan bulanan (dalam juta rupiah) dari lima cabangnya selama satu bulan.

Kelas Pendapatan (juta) Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 7
40 - 50 10
50 - 60 3
100 1

2.1.1 DATA DENGAN OUTLIER

Kelas Pendapatan (juta) Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 7
40 - 50 10
50 - 60 3
100 1

2.1.1.1 Menghitung Mean dengan Outlier

  1. Tentukan kelas tengah \(x_i\):

    • Kelas 10 - 20: \(x_1 = 15\)
    • Kelas 20 - 30: \(x_2 = 25\)
    • Kelas 30 - 40: \(x_3 = 35\)
    • Kelas 40 - 50: \(x_4 = 45\)
    • Kelas 50 - 60: \(x_5 = 55\)
    • Kelas 100: \(x_6 = 100\) (untuk outlier)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 5 \cdot 15 = 75\)
    • \(f_2 \cdot x_2 = 8 \cdot 25 = 200\)
    • \(f_3 \cdot x_3 = 7 \cdot 35 = 245\)
    • \(f_4 \cdot x_4 = 10 \cdot 45 = 450\)
    • \(f_5 \cdot x_5 = 3 \cdot 55 = 165\)
    • \(f_6 \cdot x_6 = 1 \cdot 100 = 100\) (untuk outlier)
  3. Hitung jumlah total \(\sum f_i\) dan \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 75 + 200 + 245 + 450 + 165 + 100 = 1235 \] \[ \sum f_i = 5 + 8 + 7 + 10 + 3 + 1 = 34 \]

  4. Hitung mean dengan outlier:

    \[ \bar{x} = \frac{1235}{34} = 36.32 \, \text{juta} \]

2.1.1.2 Menghitung Median dengan Outlier

  1. Tentukan posisi median: \(\frac{33}{2} = 16.5\), jadi kita cari kelas yang mengandung posisi ke-16.5.

  2. Dari tabel, kita dapatkan kelas median adalah kelas 20 - 30 (frekuensi kumulatif 13, kelas selanjutnya dengan kumulatif 20). Maka:

    • L = 20
    • F = 13 (frekuensi kumulatif sebelum kelas median)
    • f = 8 (frekuensi kelas median)
    • h = 10 (panjang kelas interval)
  3. Hitung median: \[ \text{Median} = 20 + \left( \frac{16.5 - 13}{8} \right) \times 10 = 20 + \left( \frac{3.5}{8} \right) \times 10 = 20 + 4.375 = 24.38 \, \text{juta} \]

2.1.1.3 Menghitung Modus dengan Outlier

  1. Kelas modus adalah kelas 20 - 30 dengan frekuensi \(f_1 = 8\), kelas sebelumnya adalah kelas 10 - 20 dengan \(f_0 = 5\), dan kelas setelahnya adalah kelas 30 - 40 dengan \(f_2 = 7\).

  2. L = 20, f₁ = 8, f₀ = 5, f₂ = 7, h = 10

  3. Hitung modus:

\[ \text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right) \times 10 \]

\[ \text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 + \left( \frac{3}{4} \right) \times 10 \]

\[ \text{Modus} = 20 + 7.5 = 27.5, \text{juta} \]


2.1.2 DATA TANPA OUTLIER

Kelas Pendapatan (juta) Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 7
40 - 50 10
50 - 60 3

2.1.2.1 Menghitung Mean Tanpa Outlier

  1. Tentukan kelas tengah \(x_i\):

    • Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} = 15\)
    • Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} = 25\)
    • Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} = 35\)
    • Kelas 40 - 50: \(x_4 = \frac{40 + 50}{2} = 45\)
    • Kelas 50 - 60: \(x_5 = \frac{50 + 60}{2} = 55\)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 5 \cdot 15 = 75\)
    • \(f_2 \cdot x_2 = 8 \cdot 25 = 200\)
    • \(f_3 \cdot x_3 = 7 \cdot 35 = 245\)
    • \(f_4 \cdot x_4 = 10 \cdot 45 = 450\)
    • \(f_5 \cdot x_5 = 3 \cdot 55 = 165\)
  3. Hitung jumlah total \(\sum f_i\) dan \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 75 + 200 + 245 + 450 + 165 = 1135 \] \[ \sum f_i = 5 + 8 + 7 + 10 + 3 = 33 \]

  4. Hitung mean:

    \[ \bar{x} = \frac{1135}{33} = 34.39 \, \text{juta} \]

2.1.2.2 Menghitung Median Tanpa Outlier

  1. Tentukan posisi median: \(\frac{33}{2} = 16.5\), jadi kita cari kelas yang mengandung posisi ke-16.5.

  2. Dari tabel, kita dapatkan kelas median adalah kelas 20 - 30 (frekuensi kumulatif 13, kelas selanjutnya dengan kumulatif 20). Maka:

    • L = 20
    • F = 13 (frekuensi kumulatif sebelum kelas median)
    • f = 8 (frekuensi kelas median)
    • h = 10 (panjang kelas interval)
  3. Hitung median:

    \[ \text{Median} = 20 + \left( \frac{16.5 - 13}{8} \right) \times 10 = 20 + \left( \frac{3.5}{8} \right) \times 10 = 20 + 4.375 = 24.38 \, \text{juta} \]

2.1.2.3 Menghitung Modus Tanpa Outlier

  1. Kelas modus adalah kelas 20 - 30 dengan frekuensi \(f_1 = 8\), kelas sebelumnya adalah kelas 10 - 20 dengan \(f_0 = 5\), dan kelas setelahnya adalah kelas 30 - 40 dengan \(f_2 = 7\).

  2. L = 20, f₁ = 8, f₀ = 5, f₂ = 7, h = 10

  3. Hitung modus:

\[ \text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right) \times 10 \]

\[ \text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 + \left( \frac{3}{4} \right) \times 10 \]

\[ \text{Modus} = 20 + 7.5 = 27.5, \text{juta} \]


2.1.3 Hasil keseluruhan:

  • Dengan outlier:
    • Mean = 36.32 juta
    • Median = 24.38 juta
    • Modus = 27.5 juta
  • Tanpa outlier:
    • Mean = 34.39 juta
    • Median = 24.38 juta
    • Modus = 27.5 juta
  • Pengaruh Outlier:
    • Outlier mempengaruhi mean karena data ekstrem tersebut menggeser rata-rata lebih tinggi, tetapi tidak mempengaruhi median dan modus karena keduanya lebih stabil terhadap data ekstrem.

2.1.4 Presentase Kecocokan

Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan antara mean, median, dan modus.

  • Perbedaan Mean:

\[ \left| \frac{36.32 - 34.39}{34.39} \right| \times 100 \approx 5.25\% \]

  • Perbedaan Median:

\[ \left| \frac{24.38 - 24.38}{30} \right| \times 100 = 0\% \]

  • Perbedaan Modus:

\[ \left| \frac{27.05 - 27.05}{27.05} \right| \times 100 = 0\% \]

  • Rata-rata Persentase Perbedaan:

Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean, median, modus):

\[ \text{Rata-rata Perbedaan} = \frac{5.25\% + 0\% + 0\%}{3} = 1.75\% \]

  • Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[ \text{Kecocokan} = 100\% - 1.75\% = 98.25\% \]

2.1.5 Kesimpulan:

Tingkat kecocokan data yang tinggi (98,25%) menunjukkan bahwa analisis data baik dengan maupun tanpa outlier memberikan hasil yang hampir konsisten. Oleh karena itu, strategi perusahaan berdasarkan analisis ini tetap valid dan dapat diandalkan untuk pengambilan keputusan.


2.2 BIDANG KESEHATAN

Deskripsi Masalah:

Seorang dokter ingin menyesuaikan dosis obat berdasarkan berat badan pasien dalam kelompok usia tertentu. Dosis obat yang diberikan akan dipengaruhi oleh berat badan pasien, dengan rata-rata dosis yang disarankan adalah sekitar 0.5 mg per kg berat badan.

Kelompok Berat Badan (kg) Frekuensi (f)
40 - 50 6
51 - 60 10
61 - 70 8
71 - 80 4
81 - 90 2
100 1

2.2.1 DATA DENGAN OUTLIER

Kelompok Berat Badan (kg) Frekuensi (f)
40 - 50 6
51 - 60 10
61 - 70 8
71 - 80 4
81 - 90 2
100 1

2.2.1.1 Menghitung Mean dengan Outlier

  1. Tentukan kelas tengah (\(x_i\)) untuk setiap kelas:

    • Kelas 40 - 50: \(x_1 = \frac{40 + 50}{2} = 45\)
    • Kelas 51 - 60: \(x_2 = \frac{51 + 60}{2} = 55.5\)
    • Kelas 61 - 70: \(x_3 = \frac{61 + 70}{2} = 65.5\)
    • Kelas 71 - 80: \(x_4 = \frac{71 + 80}{2} = 75.5\)
    • Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} = 85.5\)
    • Kelas 100: \(x_6 = 100\) (karena ini data tunggal dengan nilai 100)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 6 \cdot 45 = 270\)
    • \(f_2 \cdot x_2 = 10 \cdot 55.5 = 555\)
    • \(f_3 \cdot x_3 = 8 \cdot 65.5 = 524\)
    • \(f_4 \cdot x_4 = 4 \cdot 75.5 = 302\)
    • \(f_5 \cdot x_5 = 2 \cdot 85.5 = 171\)
    • \(f_6 \cdot x_6 = 1 \cdot 100 = 100\) (untuk outlier)
  3. Hitung jumlah total \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 270 + 555 + 524 + 302 + 171 + 100 = 1922 \]

  4. Hitung jumlah total frekuensi \(\sum f_i\):

    \[ \sum f_i = 6 + 10 + 8 + 4 + 2 + 1 = 31 \]

  5. Hitung mean dengan rumus:

    \[ \bar{x} = \frac{1922}{31} = 61.96 \, \text{kg} \]

Dosis Obat (dalam mg) = \(61.96 \times 0.5 = 30.98 \, \text{mg}\)

2.2.1.2 Menghitung Median dengan Outlier

  1. Tentukan posisi median: \(\frac{31}{2} = 15.5\). Artinya, posisi median berada pada data ke-15.5.

  2. Dari tabel, kita bisa menghitung frekuensi kumulatif untuk melihat kelas mana yang mengandung posisi ke-15.5.

    • Frekuensi kumulatif setelah kelas 40 - 50 = 6
    • Frekuensi kumulatif setelah kelas 51 - 60 = 16
    • Frekuensi kumulatif setelah kelas 61 - 70 = 24
    • Frekuensi kumulatif setelah kelas 71 - 80 = 28
    • Frekuensi kumulatif setelah kelas 81 - 90 = 30
    • Karena posisi ke-15.5 berada pada kelas 51 - 60, maka kelas median adalah kelas ini.
  3. Menggunakan rumus median:

    • L = 51 (batas bawah kelas median)
    • F = 6 (frekuensi kumulatif sebelum kelas median)
    • f = 10 (frekuensi kelas median)
    • h = 10 (panjang kelas interval)

    \[ \text{Median} = 51 + \left( \frac{15.5 - 6}{10} \right) \times 10 = 51 + \left( \frac{9.5}{10} \right) \times 10 = 51 + 9.5 = 60 \, \text{kg} \]

Dosis Obat (dalam mg) = \(60 \times 0.5 = 30 \, \text{mg}\)

2.2.1.3 Menghitung Modus dengan Outlier

  1. Kelas modus adalah kelas 51 - 60 dengan frekuensi \(f_1 = 10\), kelas sebelumnya adalah kelas 40 - 50 dengan \(f_0 = 6\), dan kelas setelahnya adalah kelas 61 - 70 dengan \(f_2 = 8\).

  2. Menggunakan rumus modus:

    • L = 51 (batas bawah kelas modus)
    • f₁ = 10 (frekuensi kelas modus)
    • f₀ = 6 (frekuensi kelas sebelumnya)
    • f₂ = 8 (frekuensi kelas setelahnya)
    • h = 10 (panjang kelas interval)

\[ \text{Modus} = 51 + \left( \frac{10 - 6}{(2 \times 10) - 6 - 8} \right) \times 10 \]

\[ \text{Modus} = 51 + \left( \frac{4}{20 - 6 - 8} \right) \times 10 \]

\[ \text{Modus} = 51 + \left( \frac{4}{6} \right) \times 10 = 51 + 6.67 = 57.67 \, \text{kg} \]

Dosis Obat (dalam mg) = \(57.67 \times 0.5 = 28.84 \, \text{mg}\)


2.2.2 DATA TANPA OUTLIER

Kelompok Berat Badan (kg) Frekuensi (f)
40 - 50 6
51 - 60 10
61 - 70 8
71 - 80 4
81 - 90 2

2.2.2.1 Menghitung Mean Tanpa Outlier

  1. Tentukan kelas tengah \(x_i\):

    • Kelas 40 - 50: \(x_1 = \frac{40 + 50}{2} = 45\)
    • Kelas 51 - 60: \(x_2 = \frac{51 + 60}{2} = 55.5\)
    • Kelas 61 - 70: \(x_3 = \frac{61 + 70}{2} = 65.5\)
    • Kelas 71 - 80: \(x_4 = \frac{71 + 80}{2} = 75.5\)
    • Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} = 85.5\)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 6 \cdot 45 = 270\)
    • \(f_2 \cdot x_2 = 10 \cdot 55.5 = 555\)
    • \(f_3 \cdot x_3 = 8 \cdot 65.5 = 524\)
    • \(f_4 \cdot x_4 = 4 \cdot 75.5 = 302\)
    • \(f_5 \cdot x_5 = 2 \cdot 85.5 = 171\)
  3. Hitung jumlah total \(\sum f_i\) dan \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 270 + 555 + 524 + 302 + 171 = 1822 \] \[ \sum f_i = 6 + 10 + 8 + 4 + 2 = 30 \]

  4. Hitung mean:

    \[ \bar{x} = \frac{1822}{30} = 60.07 \, \text{kg} \]

Dosis Obat (dalam mg) = \(60.07 \times 0.5 = 30.04 \, \text{mg}\)

2.2.2.2 Menghitung Median Tanpa Outlier

  1. Tentukan posisi median: \(\frac{30}{2} = 15\), jadi kita cari kelas yang mengandung posisi ke-15.

  2. Dari tabel, kita dapatkan kelas median adalah kelas 51 - 60 (frekuensi kumulatif 16). Maka:

    • L = 51
    • F = 6 (frekuensi kumulatif sebelum kelas median)
    • f = 10 (frekuensi kelas median)
    • h = 10 (panjang kelas interval)
  3. Hitung median:

    \[ \text{Median} = 51 + \left( \frac{15 - 6}{10} \right) \times 10 = 51 + \left( \frac{9}{10} \right) \times 10 = 51 + 9 = 60 \, \text{kg} \]

Dosis Obat (dalam mg) = \(60 \times 0.5 = 30 \, \text{mg}\)

2.2.2.3 Menghitung Modus Tanpa Outlier

  1. Kelas modus adalah kelas 51 - 60 dengan frekuensi \(f_1 = 10\), kelas sebelumnya adalah kelas 40 - 50 dengan \(f_0 = 6\), dan kelas setelahnya adalah kelas 61 - 70 dengan \(f_2 = 8\).

  2. L = 51, f₁ = 10, f₀ = 6, f₂ = 8, h = 10

  3. Hitung modus:

\[ \text{Modus} = 51 + \left( \frac{10 - 6}{(2 \times 10) - 6 - 8} \right) \times 10 \]

\[ \text{Modus} = 51 + \left( \frac{4}{20 - 6 - 8} \right) \times 10 \]

\[ \text{Modus} = 51 + \left( \frac{4}{6} \right) \times 10 = 51 + 6.67 = 57.67 \, \text{kg} \]

Dosis Obat (dalam mg) = \(57.67 \times 0.5 = 28.84 \, \text{mg}\)


2.2.3 Hasil keseluruhan:

  • Dengan Outlier:
    • Mean = 61.96 kg → Dosis Obat = 30.98 mg
    • Median = 60 kg → Dosis Obat = 30 mg
    • Modus = 57.67 kg → Dosis Obat = 28.84 mg
  • Tanpa Outlier:
    • Mean = 60.07 kg → Dosis Obat = 30.04 mg
    • Median = 60 kg → Dosis Obat = 30 mg
    • Modus = 57.67 kg → Dosis Obat = 28.84 mg
  • Pengaruh Outlier:
    • Mean dipengaruhi oleh outlier
    • median dan modus tetap stabil dan tidak terpengaruh oleh outlier.

2.2.4 Presentase Kecocokan

Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan antara mean, median, dan modus.

  • Perbedaan Mean:

\[ \left| \frac{30.98 - 30.04}{30.04} \right| \times 100 \approx 3.13\% \]

  • Perbedaan Median:

\[ \left| \frac{30 - 30}{30} \right| \times 100 = 0\% \]

  • Perbedaan Modus:

\[ \left| \frac{28.84 - 28.84}{28.84} \right| \times 100 = 0\% \]

  • Rata-rata Persentase Perbedaan:

Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean, median, modus):

\[ \text{Rata-rata Perbedaan} = \frac{3.13\% + 0\% + 0\%}{3} = 1.04\% \]

  • Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[ \text{Kecocokan} = 100\% - 1.04\% = 98.96\% \]

2.2.5 Kesimpulan:

Dapat disimpulkan bahwa dosis obat yang diberikan sudah sangat sesuai dengan kondisi pasien. Perbandingan antara data dengan outlier dan tanpa outlier menunjukkan kecocokan yang hampir mencapai 99%, dengan perbedaan rata-rata hanya sekitar 1.04%. Hal ini menunjukkan bahwa meskipun ada sedikit pengaruh dari adanya outlier (data yang jauh berbeda), perbedaan tersebut tidak signifikan dan dosis yang dihitung tetap konsisten, baik dengan maupun tanpa outlier.

Dengan demikian, dosis obat yang disarankan berdasarkan berat badan pasien dapat dianggap tepat dan dapat diterapkan secara umum, karena hasil perhitungan dosis tetap stabil dan hampir identik dalam kedua kondisi data tersebut.


2.3 BIDANG PENDIDIKAN

Deskripsi Masalah:

Analisis prestasi akademik siswa berdasarkan data nilai ujian yang digunakan untuk mengevaluasi efektivitas proses pembelajaran di sekolah.

Kelompok Nilai Ujian Frekuensi (f)
0 - 20 2
21 - 40 4
41 - 60 6
61 - 80 5
81 - 90 3
95 1

2.3.1 DATA DENGAN OUTLIER

Tabel berikut menunjukkan data nilai ujian yang dicatat dalam kelompok interval nilai, dengan outlier pada nilai 95.

Kelompok Nilai Ujian Frekuensi (f)
0 - 20 2
21 - 40 4
41 - 60 6
61 - 80 5
81 - 90 3
95 1

2.3.1.1 Menghitung Mean dengan Outlier

  1. Tentukan kelas tengah (\(x_i\)) untuk setiap kelas:

    • Kelas 0 - 20: \(x_1 = \frac{0 + 20}{2} = 10\)
    • Kelas 21 - 40: \(x_2 = \frac{21 + 40}{2} = 30.5\)
    • Kelas 41 - 60: \(x_3 = \frac{41 + 60}{2} = 50.5\)
    • Kelas 61 - 80: \(x_4 = \frac{61 + 80}{2} = 70.5\)
    • Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} = 85.5\)
    • Kelas 95: \(x_6 = 95\) (karena ini adalah data tunggal dengan nilai 95)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 2 \cdot 10 = 20\)
    • \(f_2 \cdot x_2 = 4 \cdot 30.5 = 122\)
    • \(f_3 \cdot x_3 = 6 \cdot 50.5 = 303\)
    • \(f_4 \cdot x_4 = 5 \cdot 70.5 = 352.5\)
    • \(f_5 \cdot x_5 = 3 \cdot 85.5 = 256.5\)
    • \(f_6 \cdot x_6 = 1 \cdot 95 = 95\) (untuk outlier)
  3. Hitung jumlah total \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 20 + 122 + 303 + 352.5 + 256.5 + 95 = 1149 \]

  4. Hitung jumlah total frekuensi \(\sum f_i\):

    \[ \sum f_i = 2 + 4 + 6 + 5 + 3 + 1 = 21 \]

  5. Hitung mean dengan rumus:

    \[ \bar{x} = \frac{1149}{21} = 54.71 \]

Hasil Mean (dengan outlier) = 54.71

2.3.1.2 Menghitung Median dengan Outlier

  1. Tentukan posisi median: \(\frac{21}{2} = 10.5\). Artinya, posisi median berada pada data ke-10.5.
  2. Dari tabel, kita bisa menghitung frekuensi kumulatif untuk melihat kelas mana yang mengandung posisi ke-10.5.
    • Frekuensi kumulatif setelah kelas 0 - 20 = 2
    • Frekuensi kumulatif setelah kelas 21 - 40 = 6
    • Frekuensi kumulatif setelah kelas 41 - 60 = 12
    • Frekuensi kumulatif setelah kelas 61 - 80 = 17
    • Frekuensi kumulatif setelah kelas 81 - 90 = 20
    • Karena posisi ke-10.5 berada pada kelas 41 - 60, maka kelas median adalah kelas ini.
  3. Menggunakan rumus median:
    • L = 41 (batas bawah kelas median)
    • F = 6 (frekuensi kumulatif sebelum kelas median)
    • f = 6 (frekuensi kelas median)
    • h = 20 - 40 = 20 (panjang kelas interval)
    \[ \text{Median} = 41 + \left( \frac{10.5 - 6}{6} \right) \times 20 = 41 + \left( \frac{4.5}{6} \right) \times 20 = 41 + 15 = 56 \, \text{(dengan outlier)} \]

Hasil Median (dengan outlier) = 56

2.3.1.3 Menghitung Modus dengan Outlier

  1. Kelas modus adalah kelas 41 - 60 dengan frekuensi \(f_1 = 6\), kelas sebelumnya adalah kelas 21 - 40 dengan \(f_0 = 4\), dan kelas setelahnya adalah kelas 61 - 80 dengan \(f_2 = 5\).

  2. Menggunakan rumus modus:

    • L = 41 (batas bawah kelas modus)
    • f₁ = 6 (frekuensi kelas modus)
    • f₀ = 4 (frekuensi kelas sebelumnya)
    • f₂ = 5 (frekuensi kelas setelahnya)
    • h = 20 (panjang kelas interval)

\[ \text{Modus} = 41 + \left( \frac{6 - 4}{(2 \times 6) - 4 - 5} \right) \times 20 \]

\[ \text{Modus} = 41 + \left( \frac{2}{12 - 4 - 5} \right) \times 20 \]

\[ \text{Modus} = 41 + \left( \frac{2}{3} \right) \times 20 = 41 + 13.33 = 54.33 \]

Hasil Modus (dengan outlier) = 54.33

2.3.2 DATA TANPA OUTLIER

Untuk menghitung nilai tanpa outlier, kita akan mengabaikan nilai 95, yang merupakan outlier, sehingga data yang digunakan adalah:

Kelompok Nilai Ujian Frekuensi (f)
0 - 20 2
21 - 40 4
41 - 60 6
61 - 80 5
81 - 90 3

2.3.2.1 Menghitung Mean Tanpa Outlier

  1. Tentukan kelas tengah (\(x_i\)) untuk setiap kelas:

    • Kelas 0 - 20: \(x_1 = \frac{0 + 20}{2} = 10\)
    • Kelas 21 - 40: \(x_2 = \frac{21 + 40}{2} = 30.5\)
    • Kelas 41 - 60: \(x_3 = \frac{41 + 60}{2} = 50.5\)
    • Kelas 61 - 80: \(x_4 = \frac{61 + 80}{2} = 70.5\)
    • Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} = 85.5\)
  2. Hitung \(f_i \cdot x_i\) untuk setiap kelas:

    • \(f_1 \cdot x_1 = 2 \cdot 10 = 20\)
    • \(f_2 \cdot x_2 = 4 \cdot 30.5 = 122\)
    • \(f_3 \cdot x_3 = 6 \cdot 50.5 = 303\)
    • \(f_4 \cdot x_4 = 5 \cdot 70.5 = 352.5\)
    • \(f_5 \cdot x_5 = 3 \cdot 85.5 = 256.5\)
  3. Hitung jumlah total \(\sum (f_i \cdot x_i)\):

    \[ \sum (f_i \cdot x_i) = 20 + 122 + 303 + 352.5 + 256.5 = 1054 \]

  4. Hitung jumlah total frekuensi \(\sum f_i\):

    \[ \sum f_i = 2 + 4 + 6 + 5 + 3 = 20 \]

  5. Hitung mean tanpa outlier:

    \[ \bar{x} = \frac{1054}{20} = 52.7 \]

Hasil Mean (tanpa outlier) = 52.7

2.3.2.2 Menghitung Median Tanpa Outlier

  1. Tentukan posisi median: \(\frac{20}{2} = 10\). Artinya, posisi median berada pada data ke-10.

  2. Frekuensi kumulatif:

    • Frekuensi kumulatif setelah kelas 0 - 20 = 2
    • Frekuensi kumulatif setelah kelas 21 - 40 = 6
    • Frekuensi kumulatif setelah kelas 41 - 60 = 12
    • Karena posisi ke-10 berada pada kelas 41 - 60, maka kelas median adalah kelas ini.
  3. Menggunakan rumus median:

    • L = 41
    • F = 6
    • f = 6
    • h = 20

    \[ \text{Median} = 41 + \left( \frac{10 - 6}{6} \right) \times 20 = 41 + \left( \frac{4}{6} \right) \times 20 = 41 + 13.33 = 54.33 \]

Hasil Median (tanpa outlier) = 54.33

2.3.2.3 Menghitung Modus Tanpa Outlier

  1. Kelas modus adalah kelas 41 - 60 dengan frekuensi \(f_1 = 6\), kelas sebelumnya adalah kelas 21 - 40 dengan \(f_0 = 4\), dan kelas setelahnya adalah kelas 61 - 80 dengan \(f_2 = 5\).

  2. Menggunakan rumus modus:

    • L = 41
    • f₁ = 6
    • f₀ = 4
    • f₂ = 5
    • h = 20

\[ \text{Modus} = 41 + \left( \frac{6 - 4}{(2 \times 6) - 4 - 5} \right) \times 20 \]

\[ \text{Modus} = 41 + \left( \frac{2}{12 - 4 - 5} \right) \times 20 \]

\[ \text{Modus} = 41 + \left( \frac{2}{3} \right) \times 20 = 41 + 13.33 = 54.33 \]

Hasil Modus (tanpa outlier) = 54.33


2.3.3 Hasil keseluruhan:

  • Dengan Outlier:
    • Mean = 54.71
    • Median = 56
    • Modus = 54.33
  • Tanpa Outlier:
    • Mean = 52.7
    • Median = 54.33
    • Modus = 54.33
  • Pengaruh Outlier:
    • Mean terpengaruh oleh outlier dan sedikit lebih tinggi dibandingkan tanpa outlier.
    • Median tetap relatif stabil meskipun ada outlier.
    • Modus juga tetap stabil meskipun ada outlier.

2.3.4 Presentase Kecocokan

Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan antara mean, median, dan modus.

  • Perbedaan Mean:

\[ \left| \frac{54.71 - 52.07}{52.07} \right| \times 100 \approx 3.81\% \]

  • Perbedaan Median:

\[ \left| \frac{56 - 54.33}{54.33} \right| \times 100 = 3.07\% \]

  • Perbedaan Modus:

\[ \left| \frac{54.33 - 54.33}{54.33} \right| \times 100 = 0.0\% \]

  • Rata-rata Persentase Perbedaan:

Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean, median, modus):

\[ \text{Rata-rata Perbedaan} = \frac{3.81\% + 3.07\% + 0.0\%}{3} = 2.29\% \]

  • Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[ \text{Kecocokan} = 100\% - 2.29\% = 97.71\% \]

2.3.5 Kesimpulan:

Konsistensi data yang menunjukkan kecocokan antara dengan dan tanpa outlier menandakan bahwa performa akademik siswa terdistribusi cukup merata, dengan sebagian besar siswa berada pada tingkat nilai yang mencerminkan pemahaman yang memadai terhadap materi yang diajarkan. Ini menunjukkan bahwa kurikulum dan metode pengajaran yang digunakan dapat menjangkau sebagian besar siswa, meskipun beberapa siswa mungkin mengalami kesulitan, seperti yang tercermin dari nilai-nilai di bawah rata-rata.

LS0tDQp0aXRsZTogIlByYWt0aWt1bSAxICYgMiINCnN1YnRpdGxlOiAiU3RhdGlzdGlrYSBEYXNhciINCmF1dGhvcjogIkFseWEgTWF1cmEgUmFkaXRoYSAoNTIyNDAwMDMpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJDOi9Vc2Vycy9EZWxsL09uZURyaXZlL0RvY3VtZW50cy9zdGF0aXMvc3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgaWQ9ImFseWFhIiBzcmM9IkM6XFVzZXJzXERlbGxcT25lRHJpdmVcRG9jdW1lbnRzXHN0YXRpc1xpbWcvYWx5YWEuanBnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPg0KDQoNCiMgUFJBS1RJS1VNIDENCg0KIyMgMS4xIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpEYWxhbSBkYXRhIGtlbG9tcG9rLCAqKm1lYW4qKiBhdGF1IHJhdGEtcmF0YSBkaWhpdHVuZyBkZW5nYW4gbWVtcGVydGltYmFuZ2thbiBmcmVrdWVuc2kgc2V0aWFwIGtlbGFzIGRhbGFtIGtlbG9tcG9rIHRlcnNlYnV0LiBSdW11cyB1bXVtIHVudHVrIG1lbmdoaXR1bmcgbWVhbiBkYXRhIGtlbG9tcG9rIGFkYWxhaDoNCg0KXFsNClxiYXJ7eH0gPSBcZnJhY3tcc3VtIChmX2kgXGNkb3QgeF9pKX17XHN1bSBmX2l9DQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIFxiYXJ7eH0gXCkgPSBtZWFuIChyYXRhLXJhdGEpIGRhdGEga2Vsb21wb2sNCi0gXCggZl9pIFwpID0gZnJla3VlbnNpIHBhZGEga2VsYXMga2UtXChpXCkNCi0gXCggeF9pIFwpID0ga2VsYXMgdGVuZ2FoIChtaWRwb2ludCkgcGFkYSBrZWxhcyBrZS1cKGlcKQ0KLSBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKSA9IGp1bWxhaCBkYXJpIGhhc2lsIHBlcmthbGlhbiBhbnRhcmEgZnJla3VlbnNpIGRhbiBrZWxhcyB0ZW5nYWgNCi0gXCggXHN1bSBmX2kgXCkgPSB0b3RhbCBmcmVrdWVuc2kgKGp1bWxhaCBzZW11YSBmcmVrdWVuc2kpDQoNCiMjIyAxLjEuMSBMYW5na2FoLWxhbmdrYWg6DQoNCjEuIFRlbnR1a2FuICoqa2VsYXMgdGVuZ2FoKiogdW50dWsgc2V0aWFwIGtlbGFzIGludGVydmFsIA0KMi4gS2FsaWthbiAqKmtlbGFzIHRlbmdhaCoqIGRlbmdhbiAqKmZyZWt1ZW5zaSoqIHVudHVrIHNldGlhcCBrZWxhcy4NCjMuIEp1bWxhaGthbiBoYXNpbCBwZXJrYWxpYW4gdGVyc2VidXQuDQo0LiBCYWdpIGp1bWxhaCB0ZXJzZWJ1dCBkZW5nYW4gdG90YWwgZnJla3VlbnNpLg0KDQotLS0gDQoNCiMjIyBDT05UT0ggUEVSSElUVU5HQU4NCg0KIyMjIDEuMS4yIERBVEEgREVOR0FOIE9VVExJRVI6DQoNCnwgS2VsYXMgICAgICAgICB8IEZyZWt1ZW5zaSAoXChmXCkpICB8DQp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgIHwNCnwgMjAgLSAzMCAgICAgICB8IDggICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gNDAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgIHwNCnwgNTAgLSA2MCAgICAgICB8IDUgICAgICAgICAgICAgICAgICB8DQoNCiMjIyMgMS4xLjIuMSBMYW5na2FoLWxhbmdrYWggUGVyaGl0dW5nYW4gdW50dWsgRGF0YSBkZW5nYW4gT3V0bGllcjoNCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gS2VsYXMgMTAgLSAyMDogXCggeF8xID0gXGZyYWN7MTAgKyAyMH17Mn0gPSAxNSBcKQ0KLSBLZWxhcyAyMCAtIDMwOiBcKCB4XzIgPSBcZnJhY3syMCArIDMwfXsyfSA9IDI1IFwpDQotIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IFxmcmFjezMwICsgNDB9ezJ9ID0gMzUgXCkNCi0gS2VsYXMgNDAgLSA1MDogXCggeF80ID0gXGZyYWN7NDAgKyA1MH17Mn0gPSA0NSBcKQ0KLSBLZWxhcyA1MCAtIDYwOiBcKCB4XzUgPSBcZnJhY3s1MCArIDYwfXsyfSA9IDU1IFwpDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KLSBcKCBmXzEgXGNkb3QgeF8xID0gNSBcY2RvdCAxNSA9IDc1IFwpDQotIFwoIGZfMiBcY2RvdCB4XzIgPSA4IFxjZG90IDI1ID0gMjAwIFwpDQotIFwoIGZfMyBcY2RvdCB4XzMgPSA3IFxjZG90IDM1ID0gMjQ1IFwpDQotIFwoIGZfNCBcY2RvdCB4XzQgPSA1MCBcY2RvdCA0NSA9IDIyNTAgXCkNCi0gXCggZl81IFxjZG90IHhfNSA9IDUgXGNkb3QgNTUgPSAyNzUgXCkNCg0KMy4gSGl0dW5nIGp1bWxhaCBcKCBmX2kgXGNkb3QgeF9pIFwpOg0KDQpcWw0KNzUgKyAyMDAgKyAyNDUgKyAyMjUwICsgMjc1ID0gMzA0NQ0KXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNClxbDQo1ICsgOCArIDcgKyA1MCArIDUgPSA3NQ0KXF0NCg0KNS4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBkYXRhIHlhbmcgYWRhIG91dGxpZXI6DQoNClxbDQpcYmFye3h9ID0gXGZyYWN7MzA0NX17NzV9ID0gNDAuNjANClxdDQoNCioqSGFzaWwgbWVhbiBkZW5nYW4gb3V0bGllcioqID0gNDAuNjAuDQoNCiMjIyAxLjEuMyBEQVRBIFRBTlBBIE9VVExJRVI6DQoNClVudHVrIG1lbmdoaXR1bmcgZGF0YSB0YW5wYSBvdXRsaWVyLCBraXRhIGFrYW4gbWVuZ2hhcHVzIGtlbGFzIGludGVydmFsIDQwIC0gNTAgZGVuZ2FuIGZyZWt1ZW5zaSA1MCwgZGFuIG1lbmdoaXR1bmcgdWxhbmcgbWVhbi4NCg0KfCBLZWxhcyAgICAgICAgIHwgRnJla3VlbnNpIChcKGZcKSkgIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDEwIC0gMjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgIHwgOCAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgfA0KDQojIyMjIDEuMS4zLjEgTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuIHVudHVrIERhdGEgVGFucGEgT3V0bGllcjoNCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gS2VsYXMgMTAgLSAyMDogXCggeF8xID0gXGZyYWN7MTAgKyAyMH17Mn0gPSAxNSBcKQ0KLSBLZWxhcyAyMCAtIDMwOiBcKCB4XzIgPSBcZnJhY3syMCArIDMwfXsyfSA9IDI1IFwpDQotIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IFxmcmFjezMwICsgNDB9ezJ9ID0gMzUgXCkNCi0gS2VsYXMgNTAgLSA2MDogXCggeF80ID0gXGZyYWN7NTAgKyA2MH17Mn0gPSA1NSBcKQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gXCggZl8xIFxjZG90IHhfMSA9IDUgXGNkb3QgMTUgPSA3NSBcKQ0KLSBcKCBmXzIgXGNkb3QgeF8yID0gOCBcY2RvdCAyNSA9IDIwMCBcKQ0KLSBcKCBmXzMgXGNkb3QgeF8zID0gNyBcY2RvdCAzNSA9IDI0NSBcKQ0KLSBcKCBmXzQgXGNkb3QgeF80ID0gNSBcY2RvdCA1NSA9IDI3NSBcKQ0KDQozLiBIaXR1bmcganVtbGFoIFwoIGZfaSBcY2RvdCB4X2kgXCk6DQoNClxbDQo3NSArIDIwMCArIDI0NSArIDI3NSA9IDc5NQ0KXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNClxbDQo1ICsgOCArIDcgKyA1ID0gMjUNClxdDQoNCjUuIEhpdHVuZyAqKm1lYW4qKiB0YW5wYSBvdXRsaWVyOg0KDQpcWw0KXGJhcnt4fSA9IFxmcmFjezc5NX17MjV9ID0gMzEuODANClxdDQoNCioqSGFzaWwgbWVhbiB0YW5wYSBvdXRsaWVyKiogPSAzMS44MC4NCg0KIyMjIDEuMS40IEtlc2ltcHVsYW46DQotICoqTWVhbiBkZW5nYW4gb3V0bGllcioqOiA0MC42MA0KLSAqKk1lYW4gdGFucGEgb3V0bGllcioqOiAzMS44MA0KDQpPdXRsaWVyIHlhbmcgc2FuZ2F0IGJlc2FyIHBhZGEga2VsYXMgaW50ZXJ2YWwgNDAgLSA1MCBtZW55ZWJhYmthbiAqKm1lYW4qKiBtZW5qYWRpIGxlYmloIHRpbmdnaSBkYXJpcGFkYSBrZXRpa2Egb3V0bGllciBkaWhhcHVzLg0KDQojIyMgMS4xLjUgVmlzdWFsaXNhc2kgTWVhbiBkYWxhbSBCb3hwbG90DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGZyZWt1ZW5zaSB1bnR1ayBtYXNpbmctbWFzaW5nIGtlbGFzDQprZWxhcyA8LSBjKCIxMCAtIDIwIiwgIjIwIC0gMzAiLCAiMzAgLSA0MCIsICI0MCAtIDUwIiwgIjUwIC0gNjAiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDUsIDgsIDcsIDUwLCA1KSAjIEZyZWt1ZW5zaSBkZW5nYW4gb3V0bGllcg0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoNSwgOCwgNywgMCwgNSkgICAjIEZyZWt1ZW5zaSB0YW5wYSBvdXRsaWVyICg0MC01MCBkaWhpbGFuZ2thbikNCg0KIyBLZWxhcyB0ZW5nYWggKG1pZHBvaW50KQ0Ka2VsYXNfdGVuZ2FoIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KQ0KDQojIFBlcmhpdHVuZ2FuIG1lYW4gdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcg0KZmlfeGlfZGVuZ2FuX291dGxpZXJzIDwtIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMgKiBrZWxhc190ZW5nYWgNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmaV94aV9kZW5nYW5fb3V0bGllcnMpIC8gc3VtKGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgUGVyaGl0dW5nYW4gbWVhbiB1bnR1ayBkYXRhIHRhbnBhIG91dGxpZXINCmZpX3hpX3RhbnBhX291dGxpZXJzIDwtIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIGtlbGFzX3RlbmdhaA0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBzdW0oZmlfeGlfdGFucGFfb3V0bGllcnMpIC8gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdW50dWsgcGxvdA0KZGF0YV9ib3hwbG90IDwtIGRhdGEuZnJhbWUoDQogIEtlbGFzX1RlbmdhaCA9IHJlcChrZWxhc190ZW5nYWgsIDIpLA0KICBGcmVrdWVuc2kgPSBjKGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMsIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCBlYWNoID0gbGVuZ3RoKGtlbGFzX3RlbmdhaCkpDQopDQoNCiMgTWVuZ2dhbmRha2FuIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kgYm94cGxvdA0KZGF0YV9wbG90IDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gcmVwKGRhdGFfYm94cGxvdCRLZWxhc19UZW5nYWgsIHRpbWVzID0gZGF0YV9ib3hwbG90JEZyZWt1ZW5zaSksDQogIEtlbG9tcG9rID0gcmVwKGRhdGFfYm94cGxvdCRLZWxvbXBvaywgdGltZXMgPSBkYXRhX2JveHBsb3QkRnJla3VlbnNpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSA9IGRhdGFfcGxvdCwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIHR5cGUgPSAiYm94IiwNCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIg0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIGRlbmdhbiBvdXRsaWVyDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIHRhbnBhIG91dGxpZXINCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCA5MSwgMC44KSIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCmBgYA0KDQojIyMgMS4xLjYgVmlzdWFsaXNhc2kgTWVhbiBkYWxhbSBEZW5zaXR5IFBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEga2Vsb21wb2sgKGZyZWt1ZW5zaSkgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXINCiMgRGF0YSBkZW5nYW4gb3V0bGllcg0Ka2VsYXMgPC0gYygiMTAtMjAiLCAiMjAtMzAiLCAiMzAtNDAiLCAiNDAtNTAiLCAiNTAtNjAiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDUsIDgsIDcsIDUwLCA1KQ0KdGVuZ2FoX2tlbGFzIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KSAjIFRpdGlrIHRlbmdhaCBzZXRpYXAga2VsYXMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIHJlcCh0ZW5nYWhfa2VsYXMsIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgRGF0YSB0YW5wYSBvdXRsaWVyDQpmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMgPC0gYyg1LCA4LCA3LCAwLCA1KSAjIEtlbGFzIDQwLTUwIGRpaGFwdXMgKGZyZWt1ZW5zaSA9IDApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIHJlcCh0ZW5nYWhfa2VsYXMsIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fZGVuZ2FuX291dGxpZXJzLCBtZWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl90YW5wYV9vdXRsaWVycywgbWVhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgKFRlbmdhaCBLZWxhcykiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgcmF0YS1yYXRhIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCmBgYA0KDQotLS0gDQoNCiMjIDEuMiBNZWRpYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpVbnR1ayBtZW5naGl0dW5nICoqbWVkaWFuKiogZGF0YSBrZWxvbXBvaywga2l0YSBtZW5jYXJpICoqa2VsYXMgbWVkaWFuKiogdGVybGViaWggZGFodWx1LCB5YW5nIGtlbXVkaWFuIGRpZ3VuYWthbiB1bnR1ayBtZW5naGl0dW5nIG1lZGlhbiBtZW5nZ3VuYWthbiBydW11cyBiZXJpa3V0Og0KDQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdChcZnJhY3tcZnJhY3tOfXsyfSAtIEZ9e2Z9XHJpZ2h0KSBcY2RvdCBoDQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIEwgXCkgPSBiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4NCi0gXCggTiBcKSA9IHRvdGFsIGZyZWt1ZW5zaSAoanVtbGFoIHNlbXVhIGZyZWt1ZW5zaSkNCi0gXCggRiBcKSA9IGp1bWxhaCBmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuDQotIFwoIGYgXCkgPSBmcmVrdWVuc2kga2VsYXMgbWVkaWFuDQotIFwoIGggXCkgPSBwYW5qYW5nIGtlbGFzIChqYXJhayBhbnRhcmEgYmF0YXMgYmF3YWggZGFuIGJhdGFzIGF0YXMga2VsYXMpDQoNCiMjIyAxLjIuMSBMYW5na2FoLWxhbmdrYWg6DQoNCjEuIFRlbnR1a2FuICoqa2VsYXMgbWVkaWFuKiogKGtlbGFzIHlhbmcgbWVtaWxpa2kgZnJla3VlbnNpIGt1bXVsYXRpZiBsZWJpaCBkYXJpIFwoIFxmcmFje059ezJ9IFwpKS4NCjIuIEd1bmFrYW4gcnVtdXMgZGkgYXRhcyB1bnR1ayBtZW5naGl0dW5nICoqbWVkaWFuKiouDQoNCi0tLQ0KDQojIyMgQ09OVE9IIFBFUkhJVFVOR0FODQoNCiMjIyAxLjIuMiBEQVRBIERFTkdBTiBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgfCA3MCAgICAgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICB8IDc1ICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLSAqKlRvdGFsIGZyZWt1ZW5zaSAobikqKiA9IDc1DQotICoqXCggXGZyYWN7bn17Mn0gPSBcZnJhY3s3NX17Mn0gPSAzNy41IFwpKiosIHlhbmcgYmVyYXJ0aSBtZWRpYW4gYmVyYWRhIGRpIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kga3VtdWxhdGlmIGxlYmloIGJlc2FyIGRhcmkgMzcuNS4NCi0gS2VsYXMgeWFuZyBtZW5nYW5kdW5nIG1lZGlhbiBhZGFsYWgga2VsYXMgKio0MCAtIDUwKiogKGthcmVuYSBmcmVrdWVuc2kga3VtdWxhdGlmbnlhIGFkYWxhaCA3MCwgeWFuZyBsZWJpaCBiZXNhciBkYXJpIDM3LjUpLg0KDQojIyMjIDEuMi4yLjEgTGFuZ2thaC1sYW5na2FoIHBlcmhpdHVuZ2FuIG1lZGlhbjoNCg0KLSAqKkwqKiAoYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuKSA9IDQwDQotICoqRioqIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKSA9IDIwDQotICoqZioqIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKSA9IDUwDQotICoqaCoqIChwYW5qYW5nIGtlbGFzIGludGVydmFsKSA9IDEwDQoNClxbDQpcdGV4dHtNZWRpYW59ID0gNDAgKyBcbGVmdCggXGZyYWN7MzcuNSAtIDIwfXs1MH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIFxsZWZ0KCBcZnJhY3sxNy41fXs1MH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIDMuNSA9IDQzLjUNClxdDQoNCioqTWVkaWFuIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXIqKiA9IDQzLjUuDQoNCi0tLQ0KDQojIyMgMS4yLjMgREFUQSBUQU5QQSBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICB8DQoNCi0gKipUb3RhbCBmcmVrdWVuc2kgKG4pKiogPSAyNQ0KLSAqKlwoIFxmcmFje259ezJ9ID0gXGZyYWN7MjV9ezJ9ID0gMTIuNSBcKSoqLCB5YW5nIGJlcmFydGkgbWVkaWFuIGJlcmFkYSBkaSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIGt1bXVsYXRpZiBsZWJpaCBiZXNhciBkYXJpIDEyLjUuDQotIEtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBtZWRpYW4gYWRhbGFoIGtlbGFzICoqMjAgLSAzMCoqIChrYXJlbmEgZnJla3VlbnNpIGt1bXVsYXRpZm55YSBhZGFsYWggMTMsIHlhbmcgbGViaWggYmVzYXIgZGFyaSAxMi41KS4NCg0KIyMjIyAxLjIuMy4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtZWRpYW46DQoNCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbikgPSAyMA0KLSAqKkYqKiAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikgPSA1DQotICoqZioqIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKSA9IDgNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KXFsNClx0ZXh0e01lZGlhbn0gPSAyMCArIFxsZWZ0KCBcZnJhY3sxMi41IC0gNX17OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3s3LjV9ezh9IFxyaWdodCkgXHRpbWVzIDEwID0gMjAgKyA5LjM3NSA9IDI5LjM3NQ0KXF0NCg0KKipNZWRpYW4gdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVyKiogPSAyOS4zNzUuDQoNCi0tLQ0KDQojIyMgMS4yLjQgS2VzaW1wdWxhbjoNCi0gKipNZWRpYW4gZGVuZ2FuIG91dGxpZXIqKjogNDMuNQ0KLSAqKk1lZGlhbiB0YW5wYSBvdXRsaWVyKio6IDI5LjM3NQ0KDQpPdXRsaWVyIHBhZGEgZGF0YSBtZW55ZWJhYmthbiBtZWRpYW4geWFuZyBsZWJpaCB0aW5nZ2ksIGthcmVuYSBrZWxhcyBpbnRlcnZhbCBkZW5nYW4gZnJla3VlbnNpIGt1bXVsYXRpZiB0ZXJ0aW5nZ2kgKDQwIC0gNTApIG1lbWlsaWtpIG5pbGFpIHlhbmcgbGViaWggdGluZ2dpLCBtZW1lbmdhcnVoaSBwb3Npc2kgbWVkaWFuLg0KDQojIyMgMS4yLjUgVmlzdWFsaXNhc2kgTWVkaWFuIGRhbGFtIEJveHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IG5pbGFpIGJlcmRhc2Fya2FuIGtlbGFzIChkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXIpDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBLZWxhcyAxMC0yMCwgZnJla3VlbnNpIDUNCiAgcmVwKDI1LCA4KSwgICMgS2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIEtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNDUsIDUwKSwgIyBLZWxhcyA0MC01MCwgZnJla3VlbnNpIDUwDQogIHJlcCg1NSwgNSkgICAjIEtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoDQogIHJlcCgxNSwgNSksICAjIEtlbGFzIDEwLTIwLCBmcmVrdWVuc2kgNQ0KICByZXAoMjUsIDgpLCAgIyBLZWxhcyAyMC0zMCwgZnJla3VlbnNpIDgNCiAgcmVwKDM1LCA3KSwgICMgS2VsYXMgMzAtNDAsIGZyZWt1ZW5zaSA3DQogIHJlcCg1NSwgNSkgICAjIEtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQojIE1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fZGVuZ2FuX291dGxpZXJzIDwtIDQzLjUgICMgTWVkaWFuIGRpaGl0dW5nIHNlYmVsdW1ueWENCm1lZGlhbl90YW5wYV9vdXRsaWVycyA8LSAyOS4zNzUgICMgTWVkaWFuIGRpaGl0dW5nIHNlYmVsdW1ueWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW5lbnR1a2FuIHdhcm5hIHNlY2FyYSBla3NwbGlzaXQgdW50dWsgc2V0aWFwIGtlbG9tcG9rIChkYWxhbSBmb3JtYXQgaGV4KQ0Kd2FybmFfZGVuZ2FuX291dGxpZXJzIDwtICcjREUyRDI2JyAgIyBNZXJhaA0Kd2FybmFfdGFucGFfb3V0bGllcnMgPC0gJyMyNkE2NUInICAgIyBIaWphdQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIGNvbG9ycyA9IGMoIkRlbmdhbiBPdXRsaWVycyIgPSB3YXJuYV9kZW5nYW5fb3V0bGllcnMsICJUYW5wYSBPdXRsaWVycyIgPSB3YXJuYV90YW5wYV9vdXRsaWVycyksICMgTWVuZ2F0dXIgd2FybmEgc2VjYXJhIGVrc3BsaXNpdA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAicmVkIikNCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImdyZWVuIikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KIyMjIDEuMi42IFZpc3VhbGlzYXNpIE1lZGlhbiBkYWxhbSBEZW5zaXR5IFBsb3QNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBuaWxhaSBiZXJkYXNhcmthbiBrZWxhcyAoZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyKQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgS2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIEtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBLZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDQ1LCA1MCksICMgS2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBLZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBLZWxhcyAxMC0yMCwgZnJla3VlbnNpIDUNCiAgcmVwKDI1LCA4KSwgICMgS2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIEtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNTUsIDUpICAgIyBLZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSA0My41ICAjIE1lZGlhbiBkaWhpdHVuZyBzZWJlbHVtbnlhDQptZWRpYW5fdGFucGFfb3V0bGllcnMgPC0gMjkuMzc1ICAjIE1lZGlhbiBkaWhpdHVuZyBzZWJlbHVtbnlhDQoNCiMgTWVuZ2hpdHVuZyBkZW5zaXR5DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIG1lZGlhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl90YW5wYV9vdXRsaWVycywgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lZGlhbiBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgUGVuamVsYXNhbiB1bnR1ayBtZWRpYW4gZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIFBlbmplbGFzYW4gdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KLS0tDQoNCiMjIDEuMyBNb2R1cyB1bnR1ayBEYXRhIEtlbG9tcG9rDQoNClVudHVrIG1lbmdoaXR1bmcgKiptb2R1cyoqIGRhdGEga2Vsb21wb2ssIGtpdGEgbWVuY2FyaSAqKmtlbGFzIG1vZHVzKiosIHlhaXR1IGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpLCBkYW4gbWVuZ2d1bmFrYW4gcnVtdXMgYmVyaWt1dDoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcbGVmdChcZnJhY3tmXzEgLSBmXzB9ezJmXzEgLSBmXzAgLSBmXzJ9XHJpZ2h0KSBcY2RvdCBoDQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIEwgXCkgPSBiYXRhcyBiYXdhaCBrZWxhcyBtb2R1cw0KLSBcKCBmXzEgXCkgPSBmcmVrdWVuc2kga2VsYXMgbW9kdXMNCi0gXCggZl8wIFwpID0gZnJla3VlbnNpIGtlbGFzIHNlYmVsdW0ga2VsYXMgbW9kdXMNCi0gXCggZl8yIFwpID0gZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMNCi0gXCggaCBcKSA9IHBhbmphbmcga2VsYXMgKGphcmFrIGFudGFyYSBiYXRhcyBiYXdhaCBkYW4gYmF0YXMgYXRhcyBrZWxhcykNCg0KIyMjIDEuMy4xIExhbmdrYWgtbGFuZ2thaDoNCg0KMS4gVGVudHVrYW4gKiprZWxhcyBtb2R1cyoqIChrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSkuDQoyLiBIaXR1bmcgKiptb2R1cyoqIG1lbmdndW5ha2FuIHJ1bXVzIGRpIGF0YXMuDQoNCi0tLQ0KDQojIyMgQ09OVE9IIFBFUkhJVFVOR0FODQoNCiMjIyAxLjMuMiBEQVRBIERFTkdBTiBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgfCA3MCAgICAgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICB8IDc1ICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLSAqKktlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpKiogYWRhbGFoIGtlbGFzICoqNDAgLSA1MCoqIGRlbmdhbiAqKmZyZWt1ZW5zaSBm4oKBID0gNTAqKi4NCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKSA9IDQwDQotICoqZuKCgCoqIChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cykgPSA3IChrZWxhcyAzMCAtIDQwKQ0KLSAqKmbigoIqKiAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMpID0gNSAoa2VsYXMgNTAgLSA2MCkNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KIyMjIyAxLjMuMi4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtb2R1czoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQwICsgXGxlZnQoIFxmcmFjezUwIC0gN317KDIgXHRpbWVzIDUwKSAtIDcgLSA1fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQwICsgXGxlZnQoIFxmcmFjezQzfXsxMDAgLSA3IC0gNX0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIFxsZWZ0KCBcZnJhY3s0M317ODh9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDAgKyA0Ljg4NiA9IDQ0Ljg5DQpcXQ0KDQoqKk1vZHVzIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXIqKiA9IDQ0Ljg5DQoNCi0tLQ0KDQojIyMgMS4zLjMgREFUQSBUQU5QQSBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICB8DQoNCi0gKipLZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSoqIGFkYWxhaCBrZWxhcyAqKjIwIC0gMzAqKiBkZW5nYW4gKipmcmVrdWVuc2kgZuKCgSA9IDgqKi4NCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKSA9IDIwDQotICoqZuKCgCoqIChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cykgPSA1IChrZWxhcyAxMCAtIDIwKQ0KLSAqKmbigoIqKiAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMpID0gNyAoa2VsYXMgMzAgLSA0MCkNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KIyMjIyAxLjMuMy4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtb2R1czoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgXGxlZnQoIFxmcmFjezggLSA1fXsoMiBcdGltZXMgOCkgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3szfXsxNiAtIDUgLSA3fSBccmlnaHQpIFx0aW1lcyAxMCA9IDIwICsgXGxlZnQoIFxmcmFjezN9ezR9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyA3LjUgPSAyNy41DQpcXQ0KDQoqKk1vZHVzIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcioqID0gMjcuNQ0KDQotLS0NCg0KIyMjIDEuMy40IEtlc2ltcHVsYW46DQoNCi0gKipNb2R1cyBkZW5nYW4gb3V0bGllcioqID0gNDQuODkNCi0gKipNb2R1cyB0YW5wYSBvdXRsaWVyKiogPSAyNy41DQoNClBlcmhpdHVuZ2FuIG1vZHVzIG1lbnVuanVra2FuIHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4sIHlhbmcgZGlzZWJhYmthbiBvbGVoICoqb3V0bGllcioqIHBhZGEgZGF0YS4gT3V0bGllciBtZW5nZ2VzZXIga2VsYXMgbW9kdXMga2Uga2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB5YW5nIHNhbmdhdCB0aW5nZ2kgKGtlbGFzIDQwLTUwKSwgeWFuZyBiZXJrb250cmlidXNpIHBhZGEgbmlsYWkgbW9kdXMgeWFuZyBsZWJpaCB0aW5nZ2kuDQoNCg0KIyMjIDEuMy41IFZpc3VhbGlzYXNpIE1vZHVzIGRhbGFtIEJveHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIE1lbWJ1YXQgZGF0YSBiZXJiYXNpcyBmcmVrdWVuc2kNCiMgRGF0YSBkZW5nYW4gb3V0bGllcg0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgZGkga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIGRpIGtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBOaWxhaSBkaSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDQ1LCA1MCksICMgTmlsYWkgZGkga2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBOaWxhaSBkaSBrZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KIyBEYXRhIHRhbnBhIG91dGxpZXINCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgZGkga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIGRpIGtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBOaWxhaSBkaSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDU1LCA1KSAgICMgTmlsYWkgZGkga2VsYXMgNTAtNjAsIGZyZWt1ZW5zaSA1DQopDQoNCiMgTWVuZ2hpdHVuZyBtb2R1cyBzZWNhcmEgbWFudWFsDQptb2R1c19kZW5nYW5fb3V0bGllcnMgPC0gNDQuODkgICMgRGloaXR1bmcgc2ViZWx1bW55YQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMjcuNSAgICAjIERpaGl0dW5nIHNlYmVsdW1ueWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVuZW50dWthbiB3YXJuYSB1bnR1ayBzZXRpYXAga2Vsb21wb2sNCndhcm5hX2Rlbmdhbl9vdXRsaWVycyA8LSAnI0RFMkQyNicgICMgTWVyYWgNCndhcm5hX3RhbnBhX291dGxpZXJzIDwtICcjMjZBNjVCJyAgICMgSGlqYXUNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICBjb2xvcnMgPSBjKCJEZW5nYW4gT3V0bGllcnMiID0gd2FybmFfZGVuZ2FuX291dGxpZXJzLCAiVGFucGEgT3V0bGllcnMiID0gd2FybmFfdGFucGFfb3V0bGllcnMpLCAjIE1lbmdhdHVyIHdhcm5hIHNlY2FyYSBla3NwbGlzaXQNCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c19kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gd2FybmFfZGVuZ2FuX291dGxpZXJzKSAgIyBNZW5lbnR1a2FuIHdhcm5hIHRla3MgdW50dWsgYW5vdGFzaQ0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbW9kdXNfdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSB3YXJuYV90YW5wYV9vdXRsaWVycykgICMgTWVuZW50dWthbiB3YXJuYSB0ZWtzIHVudHVrIGFub3Rhc2kNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KIyMjIDEuMy42IFZpc3VhbGlzYXNpIE1vZHVzIGRhbGFtIERlbnNpdHkgUGxvdA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBkZW5nYW4ga2VsYXMgZnJla3VlbnNpIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIHJhdGEtcmF0YSBrZWxhcyAyMC0zMCwgZnJla3VlbnNpIDgNCiAgcmVwKDM1LCA3KSwgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNDUsIDUwKSwgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgNTAtNjAsIGZyZWt1ZW5zaSA1DQopDQoNCiMgRGF0YSBkZW5nYW4ga2VsYXMgZnJla3VlbnNpIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDEwLTIwLCBmcmVrdWVuc2kgNQ0KICByZXAoMjUsIDgpLCAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIE5pbGFpIHJhdGEtcmF0YSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDU1LCA1KSAgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQojIE1vZHVzIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXINCm1vZHVzX2Rlbmdhbl9vdXRsaWVycyA8LSA0MCArICg1MCAtIDcpIC8gKDEwMCAtIDcgLSA1KSAqIDEwDQojIE1vZHVzIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcg0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMjAgKyAoOCAtIDUpIC8gKDE2IC0gNSAtIDcpICogMTANCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX2Rlbmdhbl9vdXRsaWVycywgbW9kdXNfZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kdXNfdGFucGFfb3V0bGllcnMsIG1vZHVzX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgRGVuc2l0eSBQbG90IGRhbiBNb2R1cyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c19kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbW9kdXMgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KYGBgDQotLS0NCg0KIyBQUkFLVElLVU0gMg0KDQojIyAyLjEgQklEQU5HIEJJU05JUw0KDQoqKkRlc2tyaXBzaSBNYXNhbGFoOioqICANCg0KU2VidWFoIHBlcnVzYWhhYW4gbWVuZ3VtcHVsa2FuIGRhdGEgcGVuZGFwYXRhbiBidWxhbmFuIChkYWxhbSBqdXRhIHJ1cGlhaCkgZGFyaSBsaW1hIGNhYmFuZ255YSBzZWxhbWEgc2F0dSBidWxhbi4gIA0KDQp8IEtlbGFzIFBlbmRhcGF0YW4gKGp1dGEpIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDEwIC0gMjAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICB8DQp8IDMwIC0gNDAgICAgICAgICAgICAgICAgIHwgNyAgICAgICAgICAgICB8DQp8IDQwIC0gNTAgICAgICAgICAgICAgICAgIHwgMTAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICB8DQp8IDEwMCAgICAgICAgICAgICAgICAgICAgIHwgMSAgICAgICAgICAgICB8IA0KDQotLS0NCg0KIyMjIDIuMS4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KfCBLZWxhcyBQZW5kYXBhdGFuIChqdXRhKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICAgICAgICB8IDcgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgICAgICAgICAgICB8IDMgICAgICAgICAgICAgfA0KfCAxMDAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgfCAgKihvdXRsaWVyKSoNCg0KIyMjIyAyLjEuMS4xIE1lbmdoaXR1bmcgTWVhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBrZWxhcyB0ZW5nYWggXCggeF9pIFwpOg0KDQogICAtIEtlbGFzIDEwIC0gMjA6IFwoIHhfMSA9IDE1IFwpDQogICAtIEtlbGFzIDIwIC0gMzA6IFwoIHhfMiA9IDI1IFwpDQogICAtIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IDM1IFwpDQogICAtIEtlbGFzIDQwIC0gNTA6IFwoIHhfNCA9IDQ1IFwpDQogICAtIEtlbGFzIDUwIC0gNjA6IFwoIHhfNSA9IDU1IFwpDQogICAtIEtlbGFzIDEwMDogXCggeF82ID0gMTAwIFwpICoodW50dWsgb3V0bGllcikqDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gNSBcY2RvdCAxNSA9IDc1IFwpDQogICAtIFwoIGZfMiBcY2RvdCB4XzIgPSA4IFxjZG90IDI1ID0gMjAwIFwpDQogICAtIFwoIGZfMyBcY2RvdCB4XzMgPSA3IFxjZG90IDM1ID0gMjQ1IFwpDQogICAtIFwoIGZfNCBcY2RvdCB4XzQgPSAxMCBcY2RvdCA0NSA9IDQ1MCBcKQ0KICAgLSBcKCBmXzUgXGNkb3QgeF81ID0gMyBcY2RvdCA1NSA9IDE2NSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCAxMDAgPSAxMDAgXCkgKih1bnR1ayBvdXRsaWVyKSoNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIGZfaSBcKSBkYW4gXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDc1ICsgMjAwICsgMjQ1ICsgNDUwICsgMTY1ICsgMTAwID0gMTIzNQ0KICAgXF0NCiAgIFxbDQogICBcc3VtIGZfaSA9IDUgKyA4ICsgNyArIDEwICsgMyArIDEgPSAzNA0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBvdXRsaWVyOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezEyMzV9ezM0fSA9IDM2LjMyIFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KDQoNCiMjIyMgMi4xLjEuMiBNZW5naGl0dW5nIE1lZGlhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBwb3Npc2kgbWVkaWFuOiBcKCBcZnJhY3szM317Mn0gPSAxNi41IFwpLCBqYWRpIGtpdGEgY2FyaSBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgcG9zaXNpIGtlLTE2LjUuDQoNCjIuIERhcmkgdGFiZWwsIGtpdGEgZGFwYXRrYW4gKiprZWxhcyBtZWRpYW4qKiBhZGFsYWggKiprZWxhcyAyMCAtIDMwKiogKGZyZWt1ZW5zaSBrdW11bGF0aWYgMTMsIGtlbGFzIHNlbGFuanV0bnlhIGRlbmdhbiBrdW11bGF0aWYgMjApLiBNYWthOg0KDQogICAtICoqTCoqID0gMjANCiAgIC0gKipGKiogPSAxMyAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikNCiAgIC0gKipmKiogPSA4IChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmgqKiA9IDEwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQozLiBIaXR1bmcgKiptZWRpYW4qKjoNCiAgIFxbDQogICBcdGV4dHtNZWRpYW59ID0gMjAgKyBcbGVmdCggXGZyYWN7MTYuNSAtIDEzfXs4fSBccmlnaHQpIFx0aW1lcyAxMCA9IDIwICsgXGxlZnQoIFxmcmFjezMuNX17OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIDQuMzc1ID0gMjQuMzggXCwgXHRleHR7anV0YX0NCiAgIFxdDQoNCg0KIyMjIyAyLjEuMS4zIE1lbmdoaXR1bmcgTW9kdXMgZGVuZ2FuIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgMjAgLSAzMCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gOCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMTAgLSAyMCBkZW5nYW4gXCggZl8wID0gNSBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDMwIC0gNDAgZGVuZ2FuIFwoIGZfMiA9IDcgXCkuDQoyLiAqKkwqKiA9IDIwLCAqKmbigoEqKiA9IDgsICoqZuKCgCoqID0gNSwgKipm4oKCKiogPSA3LCAqKmgqKiA9IDEwDQoNCjMuIEhpdHVuZyAqKm1vZHVzKio6DQoNClxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3s4IC0gNX17KDIgXHRpbWVzIDgpIC0gNSAtIDd9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyBcbGVmdCggXGZyYWN7M317MTYgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szfXs0fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgNy41ID0gMjcuNSwgXHRleHR7anV0YX0NClxdDQoNCg0KLS0tDQoNCiMjIyAyLjEuMiBEQVRBIFRBTlBBIE9VVExJRVINCg0KfCBLZWxhcyBQZW5kYXBhdGFuIChqdXRhKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICAgICAgICB8IDcgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgICAgICAgICAgICB8IDMgICAgICAgICAgICAgfA0KDQojIyMjIDIuMS4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIFwoIHhfaSBcKToNCg0KICAgLSBLZWxhcyAxMCAtIDIwOiBcKCB4XzEgPSBcZnJhY3sxMCArIDIwfXsyfSA9IDE1IFwpDQogICAtIEtlbGFzIDIwIC0gMzA6IFwoIHhfMiA9IFxmcmFjezIwICsgMzB9ezJ9ID0gMjUgXCkNCiAgIC0gS2VsYXMgMzAgLSA0MDogXCggeF8zID0gXGZyYWN7MzAgKyA0MH17Mn0gPSAzNSBcKQ0KICAgLSBLZWxhcyA0MCAtIDUwOiBcKCB4XzQgPSBcZnJhY3s0MCArIDUwfXsyfSA9IDQ1IFwpDQogICAtIEtlbGFzIDUwIC0gNjA6IFwoIHhfNSA9IFxmcmFjezUwICsgNjB9ezJ9ID0gNTUgXCkNCg0KMi4gSGl0dW5nIFwoIGZfaSBcY2RvdCB4X2kgXCkgdW50dWsgc2V0aWFwIGtlbGFzOg0KDQogICAtIFwoIGZfMSBcY2RvdCB4XzEgPSA1IFxjZG90IDE1ID0gNzUgXCkNCiAgIC0gXCggZl8yIFxjZG90IHhfMiA9IDggXGNkb3QgMjUgPSAyMDAgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDcgXGNkb3QgMzUgPSAyNDUgXCkNCiAgIC0gXCggZl80IFxjZG90IHhfNCA9IDEwIFxjZG90IDQ1ID0gNDUwIFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAzIFxjZG90IDU1ID0gMTY1IFwpDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSBmX2kgXCkgZGFuIFwoIFxzdW0gKGZfaSBcY2RvdCB4X2kpIFwpOg0KDQogICBcWw0KICAgXHN1bSAoZl9pIFxjZG90IHhfaSkgPSA3NSArIDIwMCArIDI0NSArIDQ1MCArIDE2NSA9IDExMzUNCiAgIFxdDQogICBcWw0KICAgXHN1bSBmX2kgPSA1ICsgOCArIDcgKyAxMCArIDMgPSAzMw0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezExMzV9ezMzfSA9IDM0LjM5IFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KICAgDQoNCiMjIyMgMi4xLjIuMiBNZW5naGl0dW5nIE1lZGlhbiBUYW5wYSBPdXRsaWVyDQoNCjEuIFRlbnR1a2FuIHBvc2lzaSBtZWRpYW46IFwoIFxmcmFjezMzfXsyfSA9IDE2LjUgXCksIGphZGkga2l0YSBjYXJpIGtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTYuNS4NCg0KMi4gRGFyaSB0YWJlbCwga2l0YSBkYXBhdGthbiAqKmtlbGFzIG1lZGlhbioqIGFkYWxhaCAqKmtlbGFzIDIwIC0gMzAqKiAoZnJla3VlbnNpIGt1bXVsYXRpZiAxMywga2VsYXMgc2VsYW5qdXRueWEgZGVuZ2FuIGt1bXVsYXRpZiAyMCkuIE1ha2E6DQoNCiAgIC0gKipMKiogPSAyMA0KICAgLSAqKkYqKiA9IDEzIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDggKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pDQogICAtICoqaCoqID0gMTAgKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpDQoNCjMuIEhpdHVuZyAqKm1lZGlhbioqOg0KDQogICBcWw0KICAgXHRleHR7TWVkaWFufSA9IDIwICsgXGxlZnQoIFxmcmFjezE2LjUgLSAxM317OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szLjV9ezh9IFxyaWdodCkgXHRpbWVzIDEwID0gMjAgKyA0LjM3NSA9IDI0LjM4IFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KICAgDQoNCiMjIyMgMi4xLjIuMyBNZW5naGl0dW5nIE1vZHVzIFRhbnBhIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgMjAgLSAzMCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gOCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMTAgLSAyMCBkZW5nYW4gXCggZl8wID0gNSBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDMwIC0gNDAgZGVuZ2FuIFwoIGZfMiA9IDcgXCkuDQoNCjIuICoqTCoqID0gMjAsICoqZuKCgSoqID0gOCwgKipm4oKAKiogPSA1LCAqKmbigoIqKiA9IDcsICoqaCoqID0gMTANCg0KMy4gSGl0dW5nICoqbW9kdXMqKjoNCg0KIFxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3s4IC0gNX17KDIgXHRpbWVzIDgpIC0gNSAtIDd9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyBcbGVmdCggXGZyYWN7M317MTYgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szfXs0fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgNy41ID0gMjcuNSwgXHRleHR7anV0YX0NClxdDQoNCi0tLQ0KDQojIyMgMi4xLjMgSGFzaWwga2VzZWx1cnVoYW46DQotICoqRGVuZ2FuIG91dGxpZXIqKjoNCiAgLSBNZWFuID0gMzYuMzIganV0YQ0KICAtIE1lZGlhbiA9IDI0LjM4IGp1dGENCiAgLSBNb2R1cyA9IDI3LjUganV0YQ0KLSAqKlRhbnBhIG91dGxpZXIqKjogDQogIC0gTWVhbiA9IDM0LjM5IGp1dGENCiAgLSBNZWRpYW4gPSAyNC4zOCBqdXRhDQogIC0gTW9kdXMgPSAyNy41IGp1dGENCi0gKipQZW5nYXJ1aCBPdXRsaWVyKio6DQogIC0gT3V0bGllciAqKm1lbXBlbmdhcnVoaSBtZWFuKioga2FyZW5hIGRhdGEgZWtzdHJlbSB0ZXJzZWJ1dCBtZW5nZ2VzZXIgcmF0YS1yYXRhIGxlYmloIHRpbmdnaSwgdGV0YXBpIHRpZGFrIG1lbXBlbmdhcnVoaSAqKm1lZGlhbioqIGRhbiAqKm1vZHVzKioga2FyZW5hIGtlZHVhbnlhIGxlYmloIHN0YWJpbCB0ZXJoYWRhcCBkYXRhIGVrc3RyZW0uDQoNCi0tLQ0KDQojIyMgMi4xLjQgUHJlc2VudGFzZSBLZWNvY29rYW4NCg0KVW50dWsgbWVuZ2hpdHVuZyBrZWNvY29rYW4ga2VzZWx1cnVoYW4gYW50YXJhIGRhdGEgZGVuZ2FuIG91dGxpZXIgZGFuIHRhbnBhIG91dGxpZXIsIGtpdGEgYmlzYSBtZW5nZ3VuYWthbiByYXRhLXJhdGEgcGVyc2VudGFzZSBwZXJiZWRhYW4gYW50YXJhICoqbWVhbioqLCAqKm1lZGlhbioqLCBkYW4gKiptb2R1cyoqLg0KDQotIFBlcmJlZGFhbiBNZWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezM2LjMyIC0gMzQuMzl9ezM0LjM5fSBccmlnaHR8IFx0aW1lcyAxMDAgXGFwcHJveCA1LjI1XCUNClxdDQoNCi0gUGVyYmVkYWFuIE1lZGlhbjoNCg0KXFsNClxsZWZ0fCBcZnJhY3syNC4zOCAtIDI0LjM4fXszMH0gXHJpZ2h0fCBcdGltZXMgMTAwID0gMFwlDQpcXQ0KDQotIFBlcmJlZGFhbiBNb2R1czogDQoNClxbDQpcbGVmdHwgXGZyYWN7MjcuMDUgLSAyNy4wNX17MjcuMDV9IFxyaWdodHwgXHRpbWVzIDEwMCA9IDBcJQ0KXF0NCg0KLSBSYXRhLXJhdGEgUGVyc2VudGFzZSBQZXJiZWRhYW46DQoNClVudHVrIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHBlcmJlZGFhbiBhbnRhcmEga2V0aWdhIG5pbGFpIChtZWFuLCBtZWRpYW4sIG1vZHVzKToNCg0KXFsNClx0ZXh0e1JhdGEtcmF0YSBQZXJiZWRhYW59ID0gXGZyYWN7NS4yNVwlICsgMFwlICsgMFwlfXszfSA9IDEuNzVcJQ0KXF0NCg0KLSBQZXJzZW50YXNlIEtlY29jb2thbjoNCktlY29jb2thbiBkYXRhIGRhcGF0IGRpaGl0dW5nIGRlbmdhbjoNClxbDQpcdGV4dHtLZWNvY29rYW59ID0gMTAwXCUgLSAxLjc1XCUgPSA5OC4yNVwlDQpcXQ0KDQojIyMgMi4xLjUgS2VzaW1wdWxhbjoNCg0KVGluZ2thdCBrZWNvY29rYW4gZGF0YSB5YW5nIHRpbmdnaSAoOTgsMjUlKSBtZW51bmp1a2thbiBiYWh3YSBhbmFsaXNpcyBkYXRhIGJhaWsgZGVuZ2FuIG1hdXB1biB0YW5wYSBvdXRsaWVyIG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBoYW1waXIga29uc2lzdGVuLiBPbGVoIGthcmVuYSBpdHUsIHN0cmF0ZWdpIHBlcnVzYWhhYW4gYmVyZGFzYXJrYW4gYW5hbGlzaXMgaW5pIHRldGFwIHZhbGlkIGRhbiBkYXBhdCBkaWFuZGFsa2FuIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbi4NCg0KLS0tDQoNCiMjIDIuMiBCSURBTkcgS0VTRUhBVEFODQoNCioqRGVza3JpcHNpIE1hc2FsYWg6KioNCg0KU2VvcmFuZyBkb2t0ZXIgaW5naW4gbWVueWVzdWFpa2FuIGRvc2lzIG9iYXQgYmVyZGFzYXJrYW4gYmVyYXQgYmFkYW4gcGFzaWVuIGRhbGFtIGtlbG9tcG9rIHVzaWEgdGVydGVudHUuIERvc2lzIG9iYXQgeWFuZyBkaWJlcmlrYW4gYWthbiBkaXBlbmdhcnVoaSBvbGVoIGJlcmF0IGJhZGFuIHBhc2llbiwgZGVuZ2FuICoqcmF0YS1yYXRhIGRvc2lzIHlhbmcgZGlzYXJhbmthbioqIGFkYWxhaCBzZWtpdGFyICoqMC41IG1nIHBlciBrZyBiZXJhdCBiYWRhbioqLg0KDQp8IEtlbG9tcG9rIEJlcmF0IEJhZGFuIChrZykgfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICAgIHwgNiAgICAgICAgICAgICB8DQp8IDUxIC0gNjAgICAgICAgICAgICAgICAgICAgfCAxMCAgICAgICAgICAgIHwNCnwgNjEgLSA3MCAgICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCA3MSAtIDgwICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICB8DQp8IDgxIC0gOTAgICAgICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMTAwICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgfA0KDQotLS0NCg0KIyMjIDIuMi4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KfCBLZWxvbXBvayBCZXJhdCBCYWRhbiAoa2cpIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgNDAgLSA1MCAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgfA0KfCA1MSAtIDYwICAgICAgICAgICAgICAgICAgIHwgMTAgICAgICAgICAgICB8DQp8IDYxIC0gNzAgICAgICAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgIHwNCnwgNzEgLSA4MCAgICAgICAgICAgICAgICAgICB8IDQgICAgICAgICAgICAgfA0KfCA4MSAtIDkwICAgICAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICB8DQp8IDEwMCAgICAgICAgICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgIHwgICoob3V0bGllcikqDQoNCiMjIyMgMi4yLjEuMSBNZW5naGl0dW5nIE1lYW4gZGVuZ2FuIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gS2VsYXMgNDAgLSA1MDogXCggeF8xID0gXGZyYWN7NDAgKyA1MH17Mn0gPSA0NSBcKQ0KICAgLSBLZWxhcyA1MSAtIDYwOiBcKCB4XzIgPSBcZnJhY3s1MSArIDYwfXsyfSA9IDU1LjUgXCkNCiAgIC0gS2VsYXMgNjEgLSA3MDogXCggeF8zID0gXGZyYWN7NjEgKyA3MH17Mn0gPSA2NS41IFwpDQogICAtIEtlbGFzIDcxIC0gODA6IFwoIHhfNCA9IFxmcmFjezcxICsgODB9ezJ9ID0gNzUuNSBcKQ0KICAgLSBLZWxhcyA4MSAtIDkwOiBcKCB4XzUgPSBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUgXCkNCiAgIC0gS2VsYXMgMTAwOiBcKCB4XzYgPSAxMDAgXCkgKGthcmVuYSBpbmkgZGF0YSB0dW5nZ2FsIGRlbmdhbiBuaWxhaSAxMDApDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gNiBcY2RvdCA0NSA9IDI3MCBcKQ0KICAgLSBcKCBmXzIgXGNkb3QgeF8yID0gMTAgXGNkb3QgNTUuNSA9IDU1NSBcKQ0KICAgLSBcKCBmXzMgXGNkb3QgeF8zID0gOCBcY2RvdCA2NS41ID0gNTI0IFwpDQogICAtIFwoIGZfNCBcY2RvdCB4XzQgPSA0IFxjZG90IDc1LjUgPSAzMDIgXCkNCiAgIC0gXCggZl81IFxjZG90IHhfNSA9IDIgXGNkb3QgODUuNSA9IDE3MSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCAxMDAgPSAxMDAgXCkgKih1bnR1ayBvdXRsaWVyKSoNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKToNCg0KICAgXFsNCiAgIFxzdW0gKGZfaSBcY2RvdCB4X2kpID0gMjcwICsgNTU1ICsgNTI0ICsgMzAyICsgMTcxICsgMTAwID0gMTkyMg0KICAgXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2kgXCggXHN1bSBmX2kgXCk6DQoNCiAgIFxbDQogICBcc3VtIGZfaSA9IDYgKyAxMCArIDggKyA0ICsgMiArIDEgPSAzMQ0KICAgXF0NCg0KNS4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBydW11czoNCg0KICAgXFsNCiAgIFxiYXJ7eH0gPSBcZnJhY3sxOTIyfXszMX0gPSA2MS45NiBcLCBcdGV4dHtrZ30NCiAgIFxdDQoNCioqRG9zaXMgT2JhdCAoZGFsYW0gbWcpKiogPSBcKCA2MS45NiBcdGltZXMgMC41ID0gMzAuOTggXCwgXHRleHR7bWd9IFwpDQoNCg0KIyMjIyAyLjIuMS4yIE1lbmdoaXR1bmcgTWVkaWFuIGRlbmdhbiBPdXRsaWVyDQoNCjEuIFRlbnR1a2FuIHBvc2lzaSBtZWRpYW46IFwoIFxmcmFjezMxfXsyfSA9IDE1LjUgXCkuIEFydGlueWEsIHBvc2lzaSBtZWRpYW4gYmVyYWRhIHBhZGEgZGF0YSBrZS0xNS41Lg0KMi4gRGFyaSB0YWJlbCwga2l0YSBiaXNhIG1lbmdoaXR1bmcgKipmcmVrdWVuc2kga3VtdWxhdGlmKiogdW50dWsgbWVsaWhhdCBrZWxhcyBtYW5hIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTUuNS4NCg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNDAgLSA1MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDUxIC0gNjAgPSAxNg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNjEgLSA3MCA9IDI0DQogICAtIEZyZWt1ZW5zaSBrdW11bGF0aWYgc2V0ZWxhaCBrZWxhcyA3MSAtIDgwID0gMjgNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDgxIC0gOTAgPSAzMA0KICAgLSBLYXJlbmEgcG9zaXNpIGtlLTE1LjUgYmVyYWRhIHBhZGEgKiprZWxhcyA1MSAtIDYwKiosIG1ha2Ega2VsYXMgbWVkaWFuIGFkYWxhaCBrZWxhcyBpbmkuDQogICANCjMuIE1lbmdndW5ha2FuIHJ1bXVzIG1lZGlhbjoNCg0KICAgLSAqKkwqKiA9IDUxIChiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4pDQogICAtICoqRioqID0gNiAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikNCiAgIC0gKipmKiogPSAxMCAoZnJla3VlbnNpIGtlbGFzIG1lZGlhbikNCiAgIC0gKipoKiogPSAxMCAocGFuamFuZyBrZWxhcyBpbnRlcnZhbCkNCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA1MSArIFxsZWZ0KCBcZnJhY3sxNS41IC0gNn17MTB9IFxyaWdodCkgXHRpbWVzIDEwID0gNTEgKyBcbGVmdCggXGZyYWN7OS41fXsxMH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA1MSArIDkuNSA9IDYwIFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwIFx0aW1lcyAwLjUgPSAzMCBcLCBcdGV4dHttZ30gXCkNCg0KDQojIyMjIDIuMi4xLjMgTWVuZ2hpdHVuZyBNb2R1cyBkZW5nYW4gT3V0bGllcg0KDQoxLiBLZWxhcyBtb2R1cyBhZGFsYWggKiprZWxhcyA1MSAtIDYwKiogZGVuZ2FuIGZyZWt1ZW5zaSBcKCBmXzEgPSAxMCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgNDAgLSA1MCBkZW5nYW4gXCggZl8wID0gNiBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDYxIC0gNzAgZGVuZ2FuIFwoIGZfMiA9IDggXCkuDQoNCjIuIE1lbmdndW5ha2FuIHJ1bXVzIG1vZHVzOg0KDQogICAtICoqTCoqID0gNTEgKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKQ0KICAgLSAqKmbigoEqKiA9IDEwIChmcmVrdWVuc2kga2VsYXMgbW9kdXMpDQogICAtICoqZuKCgCoqID0gNiAoZnJla3VlbnNpIGtlbGFzIHNlYmVsdW1ueWEpDQogICAtICoqZuKCgioqID0gOCAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWhueWEpDQogICAtICoqaCoqID0gMTAgKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3sxMCAtIDZ9eygyIFx0aW1lcyAxMCkgLSA2IC0gOH0gXHJpZ2h0KSBcdGltZXMgMTAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNTEgKyBcbGVmdCggXGZyYWN7NH17MjAgLSA2IC0gOH0gXHJpZ2h0KSBcdGltZXMgMTAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNTEgKyBcbGVmdCggXGZyYWN7NH17Nn0gXHJpZ2h0KSBcdGltZXMgMTAgPSA1MSArIDYuNjcgPSA1Ny42NyBcLCBcdGV4dHtrZ30NClxdDQoNCioqRG9zaXMgT2JhdCAoZGFsYW0gbWcpKiogPSBcKCA1Ny42NyBcdGltZXMgMC41ID0gMjguODQgXCwgXHRleHR7bWd9IFwpDQoNCi0tLQ0KDQojIyMgMi4yLjIgREFUQSBUQU5QQSBPVVRMSUVSDQoNCnwgS2Vsb21wb2sgQmVyYXQgQmFkYW4gKGtnKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDQwIC0gNTAgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNTEgLSA2MCAgICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA2MSAtIDcwICAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICB8DQp8IDcxIC0gODAgICAgICAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgICAgICB8IDIgICAgICAgICAgICAgfA0KDQojIyMjIDIuMi4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIFwoIHhfaSBcKToNCg0KICAgLSBLZWxhcyA0MCAtIDUwOiBcKCB4XzEgPSBcZnJhY3s0MCArIDUwfXsyfSA9IDQ1IFwpDQogICAtIEtlbGFzIDUxIC0gNjA6IFwoIHhfMiA9IFxmcmFjezUxICsgNjB9ezJ9ID0gNTUuNSBcKQ0KICAgLSBLZWxhcyA2MSAtIDcwOiBcKCB4XzMgPSBcZnJhY3s2MSArIDcwfXsyfSA9IDY1LjUgXCkNCiAgIC0gS2VsYXMgNzEgLSA4MDogXCggeF80ID0gXGZyYWN7NzEgKyA4MH17Mn0gPSA3NS41IFwpDQogICAtIEtlbGFzIDgxIC0gOTA6IFwoIHhfNSA9IFxmcmFjezgxICsgOTB9ezJ9ID0gODUuNSBcKQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gXCggZl8xIFxjZG90IHhfMSA9IDYgXGNkb3QgNDUgPSAyNzAgXCkNCiAgIC0gXCggZl8yIFxjZG90IHhfMiA9IDEwIFxjZG90IDU1LjUgPSA1NTUgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDggXGNkb3QgNjUuNSA9IDUyNCBcKQ0KICAgLSBcKCBmXzQgXGNkb3QgeF80ID0gNCBcY2RvdCA3NS41ID0gMzAyIFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAyIFxjZG90IDg1LjUgPSAxNzEgXCkNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIGZfaSBcKSBkYW4gXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDI3MCArIDU1NSArIDUyNCArIDMwMiArIDE3MSA9IDE4MjINCiAgIFxdDQogICBcWw0KICAgXHN1bSBmX2kgPSA2ICsgMTAgKyA4ICsgNCArIDIgPSAzMA0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezE4MjJ9ezMwfSA9IDYwLjA3IFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwLjA3IFx0aW1lcyAwLjUgPSAzMC4wNCBcLCBcdGV4dHttZ30gXCkNCg0KIyMjIyAyLjIuMi4yIE1lbmdoaXR1bmcgTWVkaWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MzB9ezJ9ID0gMTUgXCksIGphZGkga2l0YSBjYXJpIGtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTUuDQoNCjIuIERhcmkgdGFiZWwsIGtpdGEgZGFwYXRrYW4gKiprZWxhcyBtZWRpYW4qKiBhZGFsYWggKiprZWxhcyA1MSAtIDYwKiogKGZyZWt1ZW5zaSBrdW11bGF0aWYgMTYpLiBNYWthOg0KDQogICAtICoqTCoqID0gNTENCiAgIC0gKipGKiogPSA2IChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDEwIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmgqKiA9IDEwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQozLiBIaXR1bmcgKiptZWRpYW4qKjoNCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA1MSArIFxsZWZ0KCBcZnJhY3sxNSAtIDZ9ezEwfSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgXGxlZnQoIFxmcmFjezl9ezEwfSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgOSA9IDYwIFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwIFx0aW1lcyAwLjUgPSAzMCBcLCBcdGV4dHttZ30gXCkNCg0KDQojIyMjIDIuMi4yLjMgTWVuZ2hpdHVuZyBNb2R1cyBUYW5wYSBPdXRsaWVyDQoNCjEuIEtlbGFzIG1vZHVzIGFkYWxhaCAqKmtlbGFzIDUxIC0gNjAqKiBkZW5nYW4gZnJla3VlbnNpIFwoIGZfMSA9IDEwIFwpLCBrZWxhcyBzZWJlbHVtbnlhIGFkYWxhaCBrZWxhcyA0MCAtIDUwIGRlbmdhbiBcKCBmXzAgPSA2IFwpLCBkYW4ga2VsYXMgc2V0ZWxhaG55YSBhZGFsYWgga2VsYXMgNjEgLSA3MCBkZW5nYW4gXCggZl8yID0gOCBcKS4NCg0KMi4gKipMKiogPSA1MSwgKipm4oKBKiogPSAxMCwgKipm4oKAKiogPSA2LCAqKmbigoIqKiA9IDgsICoqaCoqID0gMTANCg0KMy4gSGl0dW5nICoqbW9kdXMqKjoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDUxICsgXGxlZnQoIFxmcmFjezEwIC0gNn17KDIgXHRpbWVzIDEwKSAtIDYgLSA4fSBccmlnaHQpIFx0aW1lcyAxMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3s0fXsyMCAtIDYgLSA4fSBccmlnaHQpIFx0aW1lcyAxMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3s0fXs2fSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgNi42NyA9IDU3LjY3IFwsIFx0ZXh0e2tnfQ0KXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDU3LjY3IFx0aW1lcyAwLjUgPSAyOC44NCBcLCBcdGV4dHttZ30gXCkNCg0KLS0tDQoNCiMjIyAyLjIuMyBIYXNpbCBrZXNlbHVydWhhbjoNCg0KLSAqKkRlbmdhbiBPdXRsaWVyOioqDQogIC0gTWVhbiA9IDYxLjk2IGtnIOKGkiBEb3NpcyBPYmF0ID0gMzAuOTggbWcNCiAgLSBNZWRpYW4gPSA2MCBrZyDihpIgRG9zaXMgT2JhdCA9IDMwIG1nDQogIC0gTW9kdXMgPSA1Ny42NyBrZyDihpIgRG9zaXMgT2JhdCA9IDI4Ljg0IG1nDQogIA0KLSAqKlRhbnBhIE91dGxpZXI6KioNCiAgLSBNZWFuID0gNjAuMDcga2cg4oaSIERvc2lzIE9iYXQgPSAzMC4wNCBtZw0KICAtIE1lZGlhbiA9IDYwIGtnIOKGkiBEb3NpcyBPYmF0ID0gMzAgbWcNCiAgLSBNb2R1cyA9IDU3LjY3IGtnIOKGkiBEb3NpcyBPYmF0ID0gMjguODQgbWcNCg0KLSAqKlBlbmdhcnVoIE91dGxpZXIqKjoNCiAgLSAqKk1lYW4qKiBkaXBlbmdhcnVoaSBvbGVoICoqb3V0bGllcioqDQogIC0gKiptZWRpYW4qKiBkYW4gKiptb2R1cyoqIHRldGFwIHN0YWJpbCBkYW4gdGlkYWsgdGVycGVuZ2FydWggb2xlaCAqKm91dGxpZXIqKi4NCg0KLS0tDQoNCiMjIyAyLjIuNCBQcmVzZW50YXNlIEtlY29jb2thbg0KDQpVbnR1ayBtZW5naGl0dW5nIGtlY29jb2thbiBrZXNlbHVydWhhbiBhbnRhcmEgZGF0YSBkZW5nYW4gb3V0bGllciBkYW4gdGFucGEgb3V0bGllciwga2l0YSBiaXNhIG1lbmdndW5ha2FuIHJhdGEtcmF0YSBwZXJzZW50YXNlIHBlcmJlZGFhbiBhbnRhcmEgKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiouDQoNCi0gUGVyYmVkYWFuIE1lYW46DQoNClxbDQpcbGVmdHwgXGZyYWN7MzAuOTggLSAzMC4wNH17MzAuMDR9IFxyaWdodHwgXHRpbWVzIDEwMCBcYXBwcm94IDMuMTNcJQ0KXF0NCg0KLSBQZXJiZWRhYW4gTWVkaWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezMwIC0gMzB9ezMwfSBccmlnaHR8IFx0aW1lcyAxMDAgPSAwXCUNClxdDQoNCi0gUGVyYmVkYWFuIE1vZHVzOiANCg0KXFsNClxsZWZ0fCBcZnJhY3syOC44NCAtIDI4Ljg0fXsyOC44NH0gXHJpZ2h0fCBcdGltZXMgMTAwID0gMFwlDQpcXQ0KDQotIFJhdGEtcmF0YSBQZXJzZW50YXNlIFBlcmJlZGFhbjoNCg0KVW50dWsgbWVuZ2hpdHVuZyByYXRhLXJhdGEgcGVyYmVkYWFuIGFudGFyYSBrZXRpZ2EgbmlsYWkgKG1lYW4sIG1lZGlhbiwgbW9kdXMpOg0KDQpcWw0KXHRleHR7UmF0YS1yYXRhIFBlcmJlZGFhbn0gPSBcZnJhY3szLjEzXCUgKyAwXCUgKyAwXCV9ezN9ID0gMS4wNFwlDQpcXQ0KDQotIFBlcnNlbnRhc2UgS2Vjb2Nva2FuOg0KS2Vjb2Nva2FuIGRhdGEgZGFwYXQgZGloaXR1bmcgZGVuZ2FuOg0KXFsNClx0ZXh0e0tlY29jb2thbn0gPSAxMDBcJSAtIDEuMDRcJSA9IDk4Ljk2XCUNClxdDQoNCiMjIyAyLjIuNSBLZXNpbXB1bGFuOg0KDQpEYXBhdCBkaXNpbXB1bGthbiBiYWh3YSBkb3NpcyBvYmF0IHlhbmcgZGliZXJpa2FuIHN1ZGFoIHNhbmdhdCBzZXN1YWkgZGVuZ2FuIGtvbmRpc2kgcGFzaWVuLiBQZXJiYW5kaW5nYW4gYW50YXJhIGRhdGEgZGVuZ2FuIG91dGxpZXIgZGFuIHRhbnBhIG91dGxpZXIgbWVudW5qdWtrYW4ga2Vjb2Nva2FuIHlhbmcgaGFtcGlyIG1lbmNhcGFpICoqOTklKiosIGRlbmdhbiBwZXJiZWRhYW4gcmF0YS1yYXRhIGhhbnlhIHNla2l0YXIgKioxLjA0JSoqLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIG1lc2tpcHVuIGFkYSBzZWRpa2l0IHBlbmdhcnVoIGRhcmkgYWRhbnlhIG91dGxpZXIgKGRhdGEgeWFuZyBqYXVoIGJlcmJlZGEpLCBwZXJiZWRhYW4gdGVyc2VidXQgdGlkYWsgc2lnbmlmaWthbiBkYW4gZG9zaXMgeWFuZyBkaWhpdHVuZyB0ZXRhcCBrb25zaXN0ZW4sIGJhaWsgZGVuZ2FuIG1hdXB1biB0YW5wYSBvdXRsaWVyLg0KDQpEZW5nYW4gZGVtaWtpYW4sIGRvc2lzIG9iYXQgeWFuZyBkaXNhcmFua2FuIGJlcmRhc2Fya2FuIGJlcmF0IGJhZGFuIHBhc2llbiBkYXBhdCBkaWFuZ2dhcCB0ZXBhdCBkYW4gZGFwYXQgZGl0ZXJhcGthbiBzZWNhcmEgdW11bSwga2FyZW5hIGhhc2lsIHBlcmhpdHVuZ2FuIGRvc2lzIHRldGFwIHN0YWJpbCBkYW4gaGFtcGlyIGlkZW50aWsgZGFsYW0ga2VkdWEga29uZGlzaSBkYXRhIHRlcnNlYnV0Lg0KDQotLS0NCg0KIyMgMi4zIEJJREFORyBQRU5ESURJS0FODQoNCioqRGVza3JpcHNpIE1hc2FsYWg6KioNCg0KQW5hbGlzaXMgcHJlc3Rhc2kgYWthZGVtaWsgc2lzd2EgYmVyZGFzYXJrYW4gZGF0YSBuaWxhaSB1amlhbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXZhbHVhc2kgZWZla3Rpdml0YXMgcHJvc2VzIHBlbWJlbGFqYXJhbiBkaSBzZWtvbGFoLg0KDQp8IEtlbG9tcG9rIE5pbGFpIFVqaWFuIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDAgLSAyMCAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICB8DQp8IDIxIC0gNDAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICB8DQp8IDQxIC0gNjAgICAgICAgICAgICAgIHwgNiAgICAgICAgICAgICB8DQp8IDYxIC0gODAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICB8DQp8IDgxIC0gOTAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICB8DQp8IDk1ICAgICAgICAgICAgICAgICAgIHwgMSAgICAgICAgICAgICB8IA0KDQotLS0NCg0KIyMjIDIuMy4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KVGFiZWwgYmVyaWt1dCBtZW51bmp1a2thbiBkYXRhIG5pbGFpIHVqaWFuIHlhbmcgZGljYXRhdCBkYWxhbSBrZWxvbXBvayBpbnRlcnZhbCBuaWxhaSwgZGVuZ2FuICoqb3V0bGllcioqIHBhZGEgbmlsYWkgOTUuDQoNCnwgS2Vsb21wb2sgTmlsYWkgVWppYW4gfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgMCAtIDIwICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMjEgLSA0MCAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgNDEgLSA2MCAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNjEgLSA4MCAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgfCAzICAgICAgICAgICAgIHwNCnwgOTUgICAgICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgIHwgICoob3V0bGllcikqDQoNCg0KIyMjIyAyLjMuMS4xIE1lbmdoaXR1bmcgTWVhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBrZWxhcyB0ZW5nYWggKFwoeF9pXCkpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBLZWxhcyAwIC0gMjA6IFwoIHhfMSA9IFxmcmFjezAgKyAyMH17Mn0gPSAxMCBcKQ0KICAgLSBLZWxhcyAyMSAtIDQwOiBcKCB4XzIgPSBcZnJhY3syMSArIDQwfXsyfSA9IDMwLjUgXCkNCiAgIC0gS2VsYXMgNDEgLSA2MDogXCggeF8zID0gXGZyYWN7NDEgKyA2MH17Mn0gPSA1MC41IFwpDQogICAtIEtlbGFzIDYxIC0gODA6IFwoIHhfNCA9IFxmcmFjezYxICsgODB9ezJ9ID0gNzAuNSBcKQ0KICAgLSBLZWxhcyA4MSAtIDkwOiBcKCB4XzUgPSBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUgXCkNCiAgIC0gS2VsYXMgOTU6IFwoIHhfNiA9IDk1IFwpIChrYXJlbmEgaW5pIGFkYWxhaCBkYXRhIHR1bmdnYWwgZGVuZ2FuIG5pbGFpIDk1KQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gXCggZl8xIFxjZG90IHhfMSA9IDIgXGNkb3QgMTAgPSAyMCBcKQ0KICAgLSBcKCBmXzIgXGNkb3QgeF8yID0gNCBcY2RvdCAzMC41ID0gMTIyIFwpDQogICAtIFwoIGZfMyBcY2RvdCB4XzMgPSA2IFxjZG90IDUwLjUgPSAzMDMgXCkNCiAgIC0gXCggZl80IFxjZG90IHhfNCA9IDUgXGNkb3QgNzAuNSA9IDM1Mi41IFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAzIFxjZG90IDg1LjUgPSAyNTYuNSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCA5NSA9IDk1IFwpICoodW50dWsgb3V0bGllcikqDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDIwICsgMTIyICsgMzAzICsgMzUyLjUgKyAyNTYuNSArIDk1ID0gMTE0OQ0KICAgXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2kgXCggXHN1bSBmX2kgXCk6DQoNCiAgIFxbDQogICBcc3VtIGZfaSA9IDIgKyA0ICsgNiArIDUgKyAzICsgMSA9IDIxDQogICBcXQ0KDQo1LiBIaXR1bmcgKiptZWFuKiogZGVuZ2FuIHJ1bXVzOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezExNDl9ezIxfSA9IDU0LjcxDQogICBcXQ0KDQoqKkhhc2lsIE1lYW4gKGRlbmdhbiBvdXRsaWVyKSoqID0gNTQuNzENCg0KDQojIyMjIDIuMy4xLjIgTWVuZ2hpdHVuZyBNZWRpYW4gZGVuZ2FuIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MjF9ezJ9ID0gMTAuNSBcKS4gQXJ0aW55YSwgcG9zaXNpIG1lZGlhbiBiZXJhZGEgcGFkYSBkYXRhIGtlLTEwLjUuDQoyLiBEYXJpIHRhYmVsLCBraXRhIGJpc2EgbWVuZ2hpdHVuZyAqKmZyZWt1ZW5zaSBrdW11bGF0aWYqKiB1bnR1ayBtZWxpaGF0IGtlbGFzIG1hbmEgeWFuZyBtZW5nYW5kdW5nIHBvc2lzaSBrZS0xMC41Lg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMCAtIDIwID0gMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMjEgLSA0MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDQxIC0gNjAgPSAxMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNjEgLSA4MCA9IDE3DQogICAtIEZyZWt1ZW5zaSBrdW11bGF0aWYgc2V0ZWxhaCBrZWxhcyA4MSAtIDkwID0gMjANCiAgIC0gS2FyZW5hIHBvc2lzaSBrZS0xMC41IGJlcmFkYSBwYWRhICoqa2VsYXMgNDEgLSA2MCoqLCBtYWthIGtlbGFzIG1lZGlhbiBhZGFsYWgga2VsYXMgaW5pLg0KICAgDQozLiBNZW5nZ3VuYWthbiBydW11cyBtZWRpYW46DQogICAtICoqTCoqID0gNDEgKGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbikNCiAgIC0gKipGKiogPSA2IChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDYgKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pDQogICAtICoqaCoqID0gMjAgLSA0MCA9IDIwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQogICBcWw0KICAgXHRleHR7TWVkaWFufSA9IDQxICsgXGxlZnQoIFxmcmFjezEwLjUgLSA2fXs2fSBccmlnaHQpIFx0aW1lcyAyMCA9IDQxICsgXGxlZnQoIFxmcmFjezQuNX17Nn0gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDE1ID0gNTYgXCwgXHRleHR7KGRlbmdhbiBvdXRsaWVyKX0NCiAgIFxdDQoNCioqSGFzaWwgTWVkaWFuIChkZW5nYW4gb3V0bGllcikqKiA9IDU2DQoNCg0KIyMjIyAyLjMuMS4zIE1lbmdoaXR1bmcgTW9kdXMgZGVuZ2FuIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgNDEgLSA2MCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gNiBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMjEgLSA0MCBkZW5nYW4gXCggZl8wID0gNCBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDYxIC0gODAgZGVuZ2FuIFwoIGZfMiA9IDUgXCkuDQoNCjIuIE1lbmdndW5ha2FuIHJ1bXVzIG1vZHVzOg0KDQogICAtICoqTCoqID0gNDEgKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKQ0KICAgLSAqKmbigoEqKiA9IDYgKGZyZWt1ZW5zaSBrZWxhcyBtb2R1cykNCiAgIC0gKipm4oKAKiogPSA0IChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bW55YSkNCiAgIC0gKipm4oKCKiogPSA1IChmcmVrdWVuc2kga2VsYXMgc2V0ZWxhaG55YSkNCiAgIC0gKipoKiogPSAyMCAocGFuamFuZyBrZWxhcyBpbnRlcnZhbCkNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezYgLSA0fXsoMiBcdGltZXMgNikgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyBcbGVmdCggXGZyYWN7Mn17MTIgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyBcbGVmdCggXGZyYWN7Mn17M30gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDEzLjMzID0gNTQuMzMNClxdDQoNCioqSGFzaWwgTW9kdXMgKGRlbmdhbiBvdXRsaWVyKSoqID0gNTQuMzMNCg0KDQojIyMgMi4zLjIgREFUQSBUQU5QQSBPVVRMSUVSDQoNClVudHVrIG1lbmdoaXR1bmcgbmlsYWkgKip0YW5wYSBvdXRsaWVyKiosIGtpdGEgYWthbiBtZW5nYWJhaWthbiBuaWxhaSA5NSwgeWFuZyBtZXJ1cGFrYW4gb3V0bGllciwgc2VoaW5nZ2EgZGF0YSB5YW5nIGRpZ3VuYWthbiBhZGFsYWg6DQoNCnwgS2Vsb21wb2sgTmlsYWkgVWppYW4gfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgMCAtIDIwICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMjEgLSA0MCAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgNDEgLSA2MCAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNjEgLSA4MCAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgfCAzICAgICAgICAgICAgIHwNCg0KDQojIyMjIDIuMy4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gS2VsYXMgMCAtIDIwOiBcKCB4XzEgPSBcZnJhY3swICsgMjB9ezJ9ID0gMTAgXCkNCiAgIC0gS2VsYXMgMjEgLSA0MDogXCggeF8yID0gXGZyYWN7MjEgKyA0MH17Mn0gPSAzMC41IFwpDQogICAtIEtlbGFzIDQxIC0gNjA6IFwoIHhfMyA9IFxmcmFjezQxICsgNjB9ezJ9ID0gNTAuNSBcKQ0KICAgLSBLZWxhcyA2MSAtIDgwOiBcKCB4XzQgPSBcZnJhY3s2MSArIDgwfXsyfSA9IDcwLjUgXCkNCiAgIC0gS2VsYXMgODEgLSA5MDogXCggeF81ID0gXGZyYWN7ODEgKyA5MH17Mn0gPSA4NS41IFwpDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gMiBcY2RvdCAxMCA9IDIwIFwpDQogICAtIFwoIGZfMiBcY2RvdCB4XzIgPSA0IFxjZG90IDMwLjUgPSAxMjIgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDYgXGNkb3QgNTAuNSA9IDMwMyBcKQ0KICAgLSBcKCBmXzQgXGNkb3QgeF80ID0gNSBcY2RvdCA3MC41ID0gMzUyLjUgXCkNCiAgIC0gXCggZl81IFxjZG90IHhfNSA9IDMgXGNkb3QgODUuNSA9IDI1Ni41IFwpDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDIwICsgMTIyICsgMzAzICsgMzUyLjUgKyAyNTYuNSA9IDEwNTQNCiAgIFxdDQoNCjQuIEhpdHVuZyBqdW1sYWggdG90YWwgZnJla3VlbnNpIFwoIFxzdW0gZl9pIFwpOg0KDQogICBcWw0KICAgXHN1bSBmX2kgPSAyICsgNCArIDYgKyA1ICsgMyA9IDIwDQogICBcXQ0KDQo1LiBIaXR1bmcgKiptZWFuKiogdGFucGEgb3V0bGllcjoNCg0KICAgXFsNCiAgIFxiYXJ7eH0gPSBcZnJhY3sxMDU0fXsyMH0gPSA1Mi43DQogICBcXQ0KDQoqKkhhc2lsIE1lYW4gKHRhbnBhIG91dGxpZXIpKiogPSA1Mi43DQoNCg0KIyMjIyAyLjMuMi4yIE1lbmdoaXR1bmcgTWVkaWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MjB9ezJ9ID0gMTAgXCkuIEFydGlueWEsIHBvc2lzaSBtZWRpYW4gYmVyYWRhIHBhZGEgZGF0YSBrZS0xMC4NCg0KMi4gRnJla3VlbnNpIGt1bXVsYXRpZjoNCg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMCAtIDIwID0gMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMjEgLSA0MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDQxIC0gNjAgPSAxMg0KICAgLSBLYXJlbmEgcG9zaXNpIGtlLTEwIGJlcmFkYSBwYWRhICoqa2VsYXMgNDEgLSA2MCoqLCBtYWthIGtlbGFzIG1lZGlhbiBhZGFsYWgga2VsYXMgaW5pLg0KDQozLiBNZW5nZ3VuYWthbiBydW11cyBtZWRpYW46DQoNCiAgIC0gKipMKiogPSA0MQ0KICAgLSAqKkYqKiA9IDYNCiAgIC0gKipmKiogPSA2DQogICAtICoqaCoqID0gMjANCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA0MSArIFxsZWZ0KCBcZnJhY3sxMCAtIDZ9ezZ9IFxyaWdodCkgXHRpbWVzIDIwID0gNDEgKyBcbGVmdCggXGZyYWN7NH17Nn0gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDEzLjMzID0gNTQuMzMNCiAgIFxdDQoNCioqSGFzaWwgTWVkaWFuICh0YW5wYSBvdXRsaWVyKSoqID0gNTQuMzMNCg0KDQojIyMjIDIuMy4yLjMgTWVuZ2hpdHVuZyBNb2R1cyBUYW5wYSBPdXRsaWVyDQoNCjEuIEtlbGFzIG1vZHVzIGFkYWxhaCAqKmtlbGFzIDQxIC0gNjAqKiBkZW5nYW4gZnJla3VlbnNpIFwoIGZfMSA9IDYgXCksIGtlbGFzIHNlYmVsdW1ueWEgYWRhbGFoIGtlbGFzIDIxIC0gNDAgZGVuZ2FuIFwoIGZfMCA9IDQgXCksIGRhbiBrZWxhcyBzZXRlbGFobnlhIGFkYWxhaCBrZWxhcyA2MSAtIDgwIGRlbmdhbiBcKCBmXzIgPSA1IFwpLg0KDQoyLiBNZW5nZ3VuYWthbiBydW11cyBtb2R1czoNCg0KICAgLSAqKkwqKiA9IDQxDQogICAtICoqZuKCgSoqID0gNg0KICAgLSAqKmbigoAqKiA9IDQNCiAgIC0gKipm4oKCKiogPSA1DQogICAtICoqaCoqID0gMjANCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezYgLSA0fXsoMiBcdGltZXMgNikgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA0MSArIFxsZWZ0KCBcZnJhY3syfXsxMiAtIDQgLSA1fSBccmlnaHQpIFx0aW1lcyAyMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA0MSArIFxsZWZ0KCBcZnJhY3syfXszfSBccmlnaHQpIFx0aW1lcyAyMCA9IDQxICsgMTMuMzMgPSA1NC4zMw0KXF0NCg0KKipIYXNpbCBNb2R1cyAodGFucGEgb3V0bGllcikqKiA9IDU0LjMzDQoNCi0tLQ0KDQojIyMgMi4zLjMgSGFzaWwga2VzZWx1cnVoYW46DQoNCi0gKipEZW5nYW4gT3V0bGllcioqOiANCiAgLSAqKk1lYW4qKiA9IDU0LjcxDQogIC0gKipNZWRpYW4qKiA9IDU2DQogIC0gKipNb2R1cyoqID0gNTQuMzMNCiAgDQotICoqVGFucGEgT3V0bGllcioqOiANCiAgLSAqKk1lYW4qKiA9IDUyLjcNCiAgLSAqKk1lZGlhbioqID0gNTQuMzMNCiAgLSAqKk1vZHVzKiogPSA1NC4zMw0KDQotICoqUGVuZ2FydWggT3V0bGllcioqOg0KICAtICoqTWVhbioqIHRlcnBlbmdhcnVoIG9sZWggb3V0bGllciBkYW4gc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHRhbnBhIG91dGxpZXIuDQogIC0gKipNZWRpYW4qKiB0ZXRhcCByZWxhdGlmIHN0YWJpbCBtZXNraXB1biBhZGEgb3V0bGllci4NCiAgLSAqKk1vZHVzKioganVnYSB0ZXRhcCBzdGFiaWwgbWVza2lwdW4gYWRhIG91dGxpZXIuDQogIA0KLS0tDQoNCiMjIyAyLjMuNCBQcmVzZW50YXNlIEtlY29jb2thbg0KDQpVbnR1ayBtZW5naGl0dW5nIGtlY29jb2thbiBrZXNlbHVydWhhbiBhbnRhcmEgZGF0YSBkZW5nYW4gb3V0bGllciBkYW4gdGFucGEgb3V0bGllciwga2l0YSBiaXNhIG1lbmdndW5ha2FuIHJhdGEtcmF0YSBwZXJzZW50YXNlIHBlcmJlZGFhbiBhbnRhcmEgKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiouDQoNCi0gUGVyYmVkYWFuIE1lYW46DQoNClxbDQpcbGVmdHwgXGZyYWN7NTQuNzEgLSA1Mi4wN317NTIuMDd9IFxyaWdodHwgXHRpbWVzIDEwMCBcYXBwcm94IDMuODFcJQ0KXF0NCg0KLSBQZXJiZWRhYW4gTWVkaWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezU2IC0gNTQuMzN9ezU0LjMzfSBccmlnaHR8IFx0aW1lcyAxMDAgPSAzLjA3XCUNClxdDQoNCi0gUGVyYmVkYWFuIE1vZHVzOiANCg0KXFsNClxsZWZ0fCBcZnJhY3s1NC4zMyAtIDU0LjMzfXs1NC4zM30gXHJpZ2h0fCBcdGltZXMgMTAwID0gMC4wXCUNClxdDQoNCi0gUmF0YS1yYXRhIFBlcnNlbnRhc2UgUGVyYmVkYWFuOg0KDQpVbnR1ayBtZW5naGl0dW5nIHJhdGEtcmF0YSBwZXJiZWRhYW4gYW50YXJhIGtldGlnYSBuaWxhaSAobWVhbiwgbWVkaWFuLCBtb2R1cyk6DQoNClxbDQpcdGV4dHtSYXRhLXJhdGEgUGVyYmVkYWFufSA9IFxmcmFjezMuODFcJSArIDMuMDdcJSArIDAuMFwlfXszfSA9IDIuMjlcJQ0KXF0NCg0KLSBQZXJzZW50YXNlIEtlY29jb2thbjoNCktlY29jb2thbiBkYXRhIGRhcGF0IGRpaGl0dW5nIGRlbmdhbjoNClxbDQpcdGV4dHtLZWNvY29rYW59ID0gMTAwXCUgLSAyLjI5XCUgPSA5Ny43MVwlDQpcXQ0KDQojIyMgMi4zLjUgS2VzaW1wdWxhbjoNCg0KS29uc2lzdGVuc2kgZGF0YSB5YW5nIG1lbnVuanVra2FuIGtlY29jb2thbiBhbnRhcmEgZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyIG1lbmFuZGFrYW4gYmFod2EgcGVyZm9ybWEgYWthZGVtaWsgc2lzd2EgdGVyZGlzdHJpYnVzaSBjdWt1cCBtZXJhdGEsIGRlbmdhbiBzZWJhZ2lhbiBiZXNhciBzaXN3YSBiZXJhZGEgcGFkYSB0aW5na2F0IG5pbGFpIHlhbmcgbWVuY2VybWlua2FuIHBlbWFoYW1hbiB5YW5nIG1lbWFkYWkgdGVyaGFkYXAgbWF0ZXJpIHlhbmcgZGlhamFya2FuLiBJbmkgbWVudW5qdWtrYW4gYmFod2Ega3VyaWt1bHVtIGRhbiBtZXRvZGUgcGVuZ2FqYXJhbiB5YW5nIGRpZ3VuYWthbiBkYXBhdCBtZW5qYW5na2F1IHNlYmFnaWFuIGJlc2FyIHNpc3dhLCBtZXNraXB1biBiZWJlcmFwYSBzaXN3YSBtdW5na2luIG1lbmdhbGFtaSBrZXN1bGl0YW4sIHNlcGVydGkgeWFuZyB0ZXJjZXJtaW4gZGFyaSBuaWxhaS1uaWxhaSBkaSBiYXdhaCByYXRhLXJhdGEu