Inferensial di Regresi Linear
Setelah membaca seksi ini, kamu akan bisa:
~Mengerti mengenai distribusi dari suatu estimasi regresi.
~Membuat interval estimasi untuk regresi parameter, respon rata-rata, dan prediksi.
~Menguji signifikan regresinya.
Di seksi terakhir, kita memecahkan model regresi linear sederhana, yaitu
\[Y_i = β_0 + β_1x_i + ϵ_i\] dimana \(ϵ_i ∼ N(0,σ^2)\). Lalu kita menggunakan observasi \((x_i,y_i)\), untuk \(i = 1,2,...,n\), untuk menemukan ilai dari \(β_0 dan β_1\) yang bisa diminimumkan
\[f(β_0,β_1)=∑_{i=1}^n(y_i-(β_0 + β_1x_i))^2\].
Kita memanggil nilai \(\hatβ_0\) dan \(\hatβ_1\), dimana kita menemukannya menjadi
\[\hatβ_1= \frac {S_{xy}}{S_{xx}} = \frac {∑_{i=1}^n(x_i - \bar x)(y_i - \bar y )}{∑_{i=1}^n(x_i-x)^2}\] \[\hatβ_0 = \bar y - \hatβ_1 \bar x\].
Kita juga akan memperkirakan nilai \(σ^2\) menggunakan \(s_e^2\). Di kata lain, kita menemukan bahwa \(s_e\) adalah sebuah estimasi untuk \(σ\), dimana
\[s_e = RSE = \sqrt \frac {1}{n - 2} ∑_{i=1}^n e_i^2\] dimana kita juga memanggil RSE, sebagai “Residual Standart Error.”
Disaat mengaplikasikan ke data cars, kita mendapatkan hasil seperti berikut:
stop_dist_model = lm(dist ~ speed, data = cars)
summary(stop_dist_model)
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.069 -9.525 -2.272 9.215 43.201
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.5791 6.7584 -2.601 0.0123 *
## speed 3.9324 0.4155 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
Di seksi terakhir, kita hanya mendiskusikan tentang nilai estimate, Residual standard error, dan Multiple R-squared. Di seksi ini, kita akan mendiskusikan semua informasi dibawah nilai Coefficients, begitu juga dengan nilai F-statistic.
plot(dist ~ speed, data = cars,
xlab = "Speed (in Miles Per Hour)",
ylab = "Stopping Distance (in Feet)",
main = "Stopping Distance vs Speed",
pch = 20,
cex = 2,
col = "grey")
abline(stop_dist_model, lwd = 5, col = "darkorange")

Dari grafik diatas, kita dapat menyimpulkan bahwa ada suatu korelasi yang ada diantara jarak berhenti dengan suatu kecepatan, dimana hasilnya adalah variabel kecepatan, mempengaruhi jarak berhenti, semakin cepat kecepatan pada sesuatu, maka semakin jauh pula jarak berhentinya.
Untuk memulai, kita akan perhatikan bahwa ada ekspresi equivalen yang lain untuk \(S_{xy}\) dimana tidak kita lihat di sesi yang terakhir, \[S_{xy} = ∑_{i=1}^n (x_i - \bar x)(y_i - \bar y) = ∑_{i=1}^n (x_i - \bar x)y_i\].
Ini mungkin akan menjadi nilai equivalen yang mengejutkan. (Mungkin akan mencoba untuk membuktikannya.) Lagipula, itu akan menjadi berguna sebagai sebuah konsep ilustrasi di seksi ini.
Perhatikan bahwa, \(\hat β_1\) adalah sampel statistik yang sudah terhitung dengan suatu observasi data seperti yang dituliskan diatas, yaitu \(\hat β_0\).
Bagaimanapun juga, seksi ini akan sering memudahkan kita untuk menggunakan kedua \(\hat β_1\) dan \(\hat β_0\) sebagai variabel acak, itu dia, kita masih belum mempunyai nilai observasi untuk masing-masing dari\(Y_i\). Disaat kasusnya adalah ini, kita akan menggunakan notasi yang berbeda, mensubtitusikan \(Y_i\) untuk kasus \(y_i\) yang lebih rendah.
\[\hatβ_1= \frac {∑_{i=1}^n(x_i - \bar x)Y_i}{∑_{i=1}^n(x_i-x)^2}\] \[\hatβ_0 = \bar Y - \hatβ_1 \bar x\]
Di seksi terakhir kita menyetujui bahwa perkiraan ini dari model parameter \(β_0\) dan \(β_1\) yang tidak diketahui, itu bagus karena kita mendapatkan mereka dari meminimumkan kesalahan. Kita sekarang akan mendiskusikan tentang teorema Gauss-Markov yang mengambil lebih lanjut tentang ide ini, menunjukan bahwa perkiraan ini sebenarnya merupakan perkiraan yang “terbaik”, dari sudut pandang tertentu.
Teorema Gauss-Markov
Teorema Gauss-Markov ini memberitahukan kepada kita bahwa disaat kita memperkirakan parameter dari regresi linear sederhana model \(β_0\) dan \(β_1\), nilai \(β_0\) dan \(β_1\) yang kita percayakan adalah perkiraan linear tidak bias yang teraik, atau lebih singkatnya “BLUE / Best Linear Unbiased Estimates”. (Sebuah kondisi sebenarnya untuk teorema Gauss-Markov yang lebih rileks dibanding model SLR.)
Sekarang kita akan mendiskusikan tentang linear, tidak bias, dan terbaik, yang berhubungan dengan perkiraan tersebut.
Linear
Mengulang kembali, di pengaturan SLR dimana nilai \(x_i\) sudah diketahui, dan dianggap sebagai suatu kuantitas. Lalu sebuah perkiraan linear adalah salah satu yang dapat ditulis sebagai kombinasi linear dari \(Y_i\). Di sebuah kasus dari \(\hat β_1\) kita melihat
\[\hatβ_1= \frac {∑_{i=1}^n(x_i - \bar x)Y_i}{∑_{i=1}^n(x_i-x)^2} = ∑_{i=1}^n k_iY_i = k_1Y_1 + k_2Y_2 + ... + k_nY_n \]
dimana \(k_i = \frac {(x_i - \bar x)}{∑_{i=1}^n (x_i - \bar x)^2}\).
Di pertunjukan yang mirip, kita dapat menunjukkan bahwan \(\hatβ_0\) dapat ditulis sebagai kombinasi linear dari \(Y_i\). Jadi kedua \(\hatβ_0\) dan \(\hatβ_1\) adalah suatu estimator dari fungsi linear.
Tidak Bias
Sekarang kita sudah tau bahwa perkiraan kita adalah fungsi linear, seberapa baguskah estimasi ini? Salah satu pengukuran “kebaikan” dari suatu perkiraan adalah bias. Lebih spesifik, kita cenderung memperkirakan yang tidak bias, berarti ekspektasi nilai mereka adalah parameter yang sedang di perkirakan.
Di dalam kasus dari perkiraan regresi, kita memiliki,
\[E[\hatβ_0]=β_0\] \[E[\hatβ_1]=β_1.\]
Ini memberitahukan kepada kita bahwa, disaat kondisi dari suatu model SLR bertemu, rata-rata dari perkiraan kita akan benar. Lagipula, yang sudah kita lihat dari seksi terakhir dimana kita mensimulasikan dari model SLR, itu tidak berarti bahwa setiap perkiraan akan benar. Hanya itu, jika kita mengulang prosesnya ke jumlah yang tidak terhingga, perkiraan rata-rata itu akan benar.
Terbaik
Sekarang, jika kita membatasi diri kita kepada kedua fungsi linear dan perkiraan tidak bias, bagaimana kita akan memastikan perkiraan terbaiknya? Perkiraan dengan varians terminim.
Catatan pertama adalah ini sangat mudah untuk membuat suatu perkiraan untuk \(β_1\) yang memiliki varians yang rendah, tapi bukan tidak bias. Sebagai contoh, pastikan:
\[\hatθ_{BAD}=5\]
Lalu, sejak \(\hatθ_{BAD}\) adalah sebuah nilai konstan,
\[Var[\hatθ_{BAD}]=0\]
Bagaimanapun juga sejak,
\[E[\hatθ_{BAD}] = 5\]
kita mengatakan bahwa \(\hatθ_{BAD}\) adalah estimator yang bias kecuali kalau \(β_1=5\), dimana sebelumnya kita tidak akan tau. Untuk alasan ini, ini merupakan perkiraan yang mengerikan (kecuali kalau ada kesempatan \(β_1=5\)) bahkan jika itu adalah varians terkecil yang memungkinkan. Ini adalah bagian dari suatu alasan yang membatasi diri kita untuk memperkirakan yang tidak bias. Apa yang bagus pada sebuah estimasi, jika itu memperkirakan kuantitas yang salah?
Jadi sekarang, untuk pertanyaan alaminya, apakah varians dari \(\hatβ_0\) dan \(\hatβ_1\)? Mereka adalah,
\[Var[\hatβ_0] = σ^2(\frac{1}{n} + \frac {\bar x^2}{S_{xx}})\] \[Var[\hatβ_1] = \frac {σ^2}{S_{xx}}\]
Ini mengukur variabilitas dari dua perkiraan ke kesempatan acak disaat sedang menyampling data. Apakah ini “yang terbaik”? Apakah varians ini adalah varians yang terkecil yang bisa kita dapatkan? Kamu hanya bisa percaya kepada kata-kata kami bahwa ini memang sudah benar.
Distribusi Sampling
Sekarang kita harus mendefinisikan ulang perkiraan untuk \(\hatβ_0\) dan \(\hatβ_1\) yang menjadi variabel acaknya, kita dapat berdiskusi tentang distribusi sampling mereka, yang mana distribusi ketika dianggap sebagai variabel acak.
Sejak kedua \(\hatβ_0\) dan \(\hatβ_1\) adalah kombinasi linear dari \(Y_i\) dan setiap \(Y_i\) adalah distribusi normal, maka kedua \(\hatβ_0\) dan \(\hatβ_1\) juga merupakan / mengikuti distribusi normal.
Lalu, menaruh semuanya yang diatas secara bersama, kita sampai di distribusi dari \(\hatβ_0\) dan \(\hatβ_1\).
Untuk \(\hatβ_1\), kita katakan
\[\hatβ_1 = \frac {S{xy}}{S{xx}} = \frac {∑_{i=1}^n(x_i - \bar x)Y_i}{∑_{i=1}^n(x_i-x)^2} ∼ N (β_1, \frac {σ^2}{∑_{i=1}^n(x_i-\bar x)^2})\]
Atau lebih singkatnya,
\[\hatβ_1 ∼ N (β_1, \frac {σ^2}{S{xx}})\]
Dan untuk \(\hatβ_0\),
\[\hatβ_0 = \bar Y - \hatβ_1 \bar x ∼ (β_0, \frac {σ^2 ∑_{i=1}^n x_i^2}{n∑_{i=1}^n (x_i-\bar x)^2})\]
Atau lebih singkatnya,
\[\hatβ_0 ∼ N (β_0, σ^2(\frac {1}{n}+\frac {\bar x^2}{S{xx}}))\]
Di bagian ini kita telah lalai untuk membuktikan nomor dari hasil tersebut. Alih-alih untuk mengerjakan dengan derivasi yang membosankan dari distribusi sampling ini, kita akan membenarkan hasil ini untuk diri kita sendiri dengan menggunakan simulasi.
Catatan untuk para pembaca: Derivasi dan pembuktian ini mungkin akan ditambahkan ke lampiran di suatu saat nanti. Kamu juga bisa menemukan hasil ini di waktu yg akan datang di buku teks tentang regresi linear sederhana. Di UIUC, hasil ini akan dipresentasikan di kedua STAT 424 dan STAT 425. Namun, sejak anda tidak akan bertanya untuk menampilkan derivasi dari tipe yang ada di kelas ini, mereka sekarang dihilangkan.
Simulasi Distribusi Sampling
Untuk memastikan hasil diatas, kita akan mensimulasikan sample dengan ukuran \(n = 100\) dari model
\[Y_i = β_0 + β_1 x_i + ϵ_i\]
dimana \(ϵ_i ∼ N(0,σ^2)\). Di kasus ini, parameternya dapat diketahui sebagai:
~ $β_0 = 3$
~ $β_1 = 6$
~ $σ^2 = 4$
Lalu, berdasarkan pernyataan diatas, kita harus menemukan bahwa
\[\hat β_1 ∼ N(β_1, \frac {σ^2}{S{xx}})\]
dan
\[\hat β_0 ∼ N(β_0,σ^2(\frac {1}{n}+\frac {\bar x^2}{S{xx}}))\]
Pertama kita sebelumnya harus menentukan berapa nilai x kita di simulasi ini, sejak nilai x di SLR juga dianggap sebagai kuantitas yang diketahui. Pilihan untuk nilai x adalah semaunya kita. Disini kita juga menentukan benih untuk pengacakan dan perhitungan \(S{xx}\) dimana kita akan tetap bergerak kedapan.
set.seed(42)
sample_size = 100 # this is n
x = seq(-1, 1, length = sample_size)
Sxx = sum((x - mean(x)) ^ 2)
Kita juga memastikan nilai parameter kita.
beta_0 = 3
beta_1 = 6
sigma = 2
Dengan informasi ini, kita tau distribusi samplingnya harus menjadi:
(var_beta_1_hat = sigma ^ 2 / Sxx)
## [1] 0.1176238
(var_beta_0_hat = sigma ^ 2 * (1 / sample_size + mean(x) ^ 2 / Sxx))
## [1] 0.04
\[\hat β_1 ∼ N(6,0.1176238)\] dan \[\hat β_0 ∼ N(3,0.04).\]
Ini dia,
\[E[\hat β_1] = 6\] \[Var[\hat β_1] = 0.1176238\] dan \[E[\hat β_0] = 3\] \[Var[\hat β_0] = 0.04.\]
Kita sekarang mensimulasikan data dari model ini sebanyak 10,000 kali. Perhatikan bahwa ini mungkin bukanlah jalan R yang biasanya dilakukan disaat melakukan simulasi. Kita akan menunjukkan simulasi dengan cara ini yang berupaya untuk menjelaskan. Sebagai contoh, kita dapat menggunakan fungsi sim_slr() dari seksi sebelumnya. Kita juga akan menyimpan variabel ini di lingkungan global untuk membuat bingkai data untuk setiap simulasi data yang baru.
num_samples = 10000
beta_0_hats = rep(0, num_samples)
beta_1_hats = rep(0, num_samples)
for (i in 1:num_samples) {
eps = rnorm(sample_size, mean = 0, sd = sigma)
y = beta_0 + beta_1 * x + eps
sim_model = lm(y ~ x)
beta_0_hats[i] = coef(sim_model)[1]
beta_1_hats[i] = coef(sim_model)[2]
}
Setiap kali kita mensimulasikan data, kita mendapatkan hasil dari koefisien perkiraannya. Variabel dari beta_0_hats dan beta_1_hats akan menyimpan 10,000 nilai simulasi masing-masing dari \(\hat β_0\) dan \(\hat β_1\).
Pertama kita akan memastikan distribusi dari \(\hat β_1\).
mean(beta_1_hats) # empirical mean
## [1] 6.001998
## [1] 6
var_beta_1_hat # true variance
## [1] 0.1176238
Kita melihat bahwa cara dan rata-rata yang benar, dan varians yang sangat mirip. Kita juga memastikan bahwa distribusi empiris bersifat normal. Untuk melakukannya, kita membuat plot histogram dari beta_1_hats, dan menambahkan kurva untuk distribusi yang benar dari \(\hat β_1\). Kita menggunakan prob = TRUE untuk menaruh histogramnya di skala yang sama dengan kurva normal.
# note need to use prob = TRUE
hist(beta_1_hats, prob = TRUE, breaks = 20,
xlab = expression(hat(beta)[1]), main = "", border = "dodgerblue")
curve(dnorm(x, mean = beta_1, sd = sqrt(var_beta_1_hat)),
col = "darkorange", add = TRUE, lwd = 3)

Lalu kita mengulang proses dari \(\hat β_0\)
mean(beta_0_hats) # empirical mean
## [1] 3.001147
## [1] 3
var(beta_0_hats) # empirical variance
## [1] 0.04017924
var_beta_0_hat # true variance
## [1] 0.04
hist(beta_0_hats, prob = TRUE, breaks = 25,
xlab = expression(hat(beta)[0]), main = "", border = "dodgerblue")
curve(dnorm(x, mean = beta_0, sd = sqrt(var_beta_0_hat)),
col = "darkorange", add = TRUE, lwd = 3)

Di simulasi belajar ini, kita hanya mensimulasikan jumlah sampel yang terbatas. Untuk benar-benar memastikan hasil distribusinya, kita harus mengamati jumlah sampel yanhg tidak terbatas. Namun, plot ini harus menjelaskan bahwa jika kita melanjutkan melakukan simulasinya, hasil empirisnya akan mendekati apa yang kita harapkan.
par(mar = c(5, 5, 1, 1)) # adjusted plot margins, otherwise the "hat" does not display
plot(cumsum(beta_1_hats) / (1:length(beta_1_hats)), type = "l", ylim = c(5.95, 6.05),
xlab = "Number of Simulations",
ylab = expression("Empirical Mean of " ~ hat(beta)[1]),
col = "dodgerblue")
abline(h = 6, col = "darkorange", lwd = 2)

par(mar = c(5, 5, 1, 1)) # adjusted plot margins, otherwise the "hat" does not display
plot(cumsum(beta_0_hats) / (1:length(beta_0_hats)), type = "l", ylim = c(2.95, 3.05),
xlab = "Number of Simulations",
ylab = expression("Empirical Mean of " ~ hat(beta)[0]),
col = "dodgerblue")
abline(h = 3, col = "darkorange", lwd = 2)

Standar Kesalahan
Jadi sekarang kita percaya bahwa hasil dari dua distribusi,
\[\hat β_0 ∼ N (β_0,σ^2(\frac {1}{n}+\frac {\bar x^2}{S{xx}}))\] \[\hat β_1 ∼ N(β_1,\frac {σ^2}{S{xx}}).\]
Lalu dengan menyederhanakan hasil ini, kita menemukan bahwa
\[\frac {\hat β_0 - β_0}{SD[\hat β_0]} ∼ N(0,1)\]
dan \[\frac {\hat β_1 - β_1}{SD[\hat β_1]} ∼ N(0,1)\] dimana \[SD[\hat β_0] = σ \sqrt {\frac {1}{n} + \frac {\bar x^2}{S{xx}}}\] dan \[SD[\hat β_1] = \frac {σ}{\sqrt {S{xx}}}.\]
Sejak kita tidak tau nilai σ di latihan kita, kita akan memperkirakan itu menggunakan \(s_e\), yang mana kita hubungkan ke ekspresi kita yang ada untuk standar deviasi dari estimasi kita.
Kedua ekspresi baru ini dipanggil standar errors atau kesalahan yang merupakan perkiraan dari standar deviasi untuk distribusi samplingnya.
\[SE[\hat β_0] = s_e \sqrt {\frac {1}{n}+\frac {\bar x^2}{S{xx}}}\] \[SE[\hat β_1] = \frac {s_e}{\sqrt{S{xx}}}\]
Sekarang jika kita membagikan dengan standar errornya, alih-alih standar deviasinya, kita mendapatkan hasil dimana akan memungkinkan kita untuk membuat interval kepercayaan dan menunjukkan pengujian hipotesis.
\[\frac {\hat β_0 - β_0}{SE[\hat β_0]} ∼ t_{n-2}\]
Untuk melihat ini, pertama kita perhatikan bahwa,
\[\frac {RSS}{σ^2} = \frac {(n-2)s_e^2}{σ^2} ∼ χ_{n-2}^2\]
Juga memanggil ulang variabel acak \(T\) dengan,
\[T = \frac {Z}{\sqrt {\frac {χ_d^2}{d}}}\]
mengikuti distribusi \(t\) dengan derajat kebebasan \(d\), dimana \(χ_d^2\) adalah \(χ^2\) variabel acak dari derajat kebebasan \(d\).
Kita menulis, \[T ∼ t_d\]
untuk mengatakan bahwa variabel acak \(T\) mengikuti distribusi \(t\) dengan derajat kebebasan \(d\).
Lalu kita menggunakan trik klasik untuk “mengkalikan dengan 1” dan beberapa aturan ulang untuk sampai ke
\[ \frac {\hat β_1 -β_1}{SE[{\hat β_1]}} = \frac {\hat β_1 -β_1}{s_e/ \sqrt{S_{xx}}}\] \[= \frac {\hat β_1 -β_1}{s_e/ \sqrt{S_{xx}}} . \frac {σ/\sqrt{S_{xx}}}{σ/\sqrt{S_{xx}}}\] \[=\frac {\hat β_1 -β_1}{SD[\hat β_1]} / \sqrt {\frac {\frac {(n-2)s_e^2}{σ^2}}{n-2}} ∼ \frac {Z}{\sqrt \frac{χ_{n-2}^2}{n-2}} ∼ t_{n-2}\]
dimana \(Z∼N(0,1)\)
Ingatlah kembali bahwa distribusi \(t\) mirip dengan standar normal, tapi memiliki ekor yang lebih berat. Dengan derajat kebebasan yang semakin meningkat, distribusi \(t\) menjadi lebih dan lebih seperti standar normal. Dibawah ini, kita memplotkan distribusi standar normal sebagai dua contoh dari distribusi \(t\) dengan derajat kebebasan yang berbeda. Ketahuilah bagaimana distribusi \(t\) dengan derajat kebebasan yang lebih besar tersebut lebih mirip dengan kurva standar normal.
# define grid of x values
x = seq(-4, 4, length = 100)
# plot curve for standard normal
plot(x, dnorm(x), type = "l", lty = 1, lwd = 2,
xlab = "x", ylab = "Density", main = "Normal vs t Distributions")
# add curves for t distributions
lines(x, dt(x, df = 1), lty = 3, lwd = 2, col = "darkorange")
lines(x, dt(x, df = 10), lty = 2, lwd = 2, col = "dodgerblue")
# add legend
legend("topright", title = "Distributions",
legend = c("t, df = 1", "t, df = 10", "Standard Normal"),
lwd = 2, lty = c(3, 2, 1), col = c("darkorange", "dodgerblue", "black"))

Interval Keyakinan untuk Slope and Intercept
Mengulang kembali bahwa interval keyakinan untuk rata-rata sering diambil dalam bentuk: \[EST ± CRIT⋅SE\] atau \[EST ± MARGIN\]
dimana EST adalah perkiraan untuk parameter yang diinginkan, SE adalah standar kesalahan untuk suatu perkiraan, dan \(MARGIN = CRIT⋅SE\).
Lalu, untuk \(β_0\) dan \(β_1\) kita dapat membuat interval kepercayanya dengan menggunakan
\[\hatβ_0 ± t_{α/2,n-2} ⋅ SE[\hatβ_0]\]
\[\hatβ_0 ± t_{α/2,n-2} ⋅s_e\sqrt{\frac {1}{n} + \frac {x^2}{S{xx}}}\] dan \[\hatβ_1 ± t_{α/2,n-2} ⋅ SE[\hatβ_1]\] \[\hatβ_0 ± t_{α/2,n-2} ⋅\frac {s_e}{\sqrt {S_{xx}}}\]
dimana $ t_{α/2,n-2}$ adalah nilai kritis demikian juga \(P(t_{n-2} > t_{α/2,n-2}) = α/2\).
Uji Hipotesis
“Kita bisa berbicara tentang hipotesis ini sebagai ‘null hypothesis’ atau hipotesis nol, dan perlu dicatat bahwa hipotesis nol tidak pernah dibuktikan atau ditetapkan, tetapi mungkin disangkal, selama eksperimen.” - Ronald Aylmer Fisher
Menginat kembali bahwa uji statistik \((TS)\) untuk menguji rata-rata sering diambil dengan bentuk:
\[TS = \frac {EST - HYP}{SE}\]
dimana EST adalah perkiraan untuk parameter yang diinginkan, HYP adalah nilai hipotesis untuk parameternya, dan SE adalah standar kesalahan untuk perkiraannya.
Jadi, untuk pengujian
\[H_0 : β_0 = β_{00} vs H_1 : β_0 ≠ β_{00}\]
kita menggunakan uji statistik
\[t = \frac {\hat β_0 - β_{00}}{SE[\hat β_0]} = \frac {\hat β_0 - β_{00}}{s_e \sqrt{\frac {1}{n} + \frac{\bar x^2}{S{xx}}}}\]
dimana, dibawah hipotesis nol, mengikuti distribusi \(t\) dengan derajat kebebasan \(n-2\). Kita menggunakan \(β_{00}\) untuk mencari tau nilai hipotesis untuk \(β_0\).
Begitupula, untuk pengujian
\[H_0 : β_1 = β_{10}\] vs \[H_1 : β_1 ≠ β_{10}\]
kita menggunakan uji statistik
\[t = \frac {\hat β_1 - β_{10}}{SE[\hat β_1]} = \frac {\hat β_1 - β_{10}}{s_e / \sqrt {S{xx}}}\]
dimana lagi, dibawah hipotesis nol, mengikuti distribusi \(t\) dengan derajat kebebasan \(n-2\). Kita sekarang menggunakan \(β_{10}\) untuk menentukan nilai hipotesis untuk \(β_1\)
Contoh cars
Kita sekarang kembali ke contoh cars dari seksi sebelumnya untuk mengilustrasikan konsep ini. Pertama kita mengepaskan dengan menggunakan model lm() lalu menggunakan summary() untuk melihat hasil dengan rincian yang lebih hebat.
stop_dist_model = lm(dist ~ speed, data = cars)
summary(stop_dist_model)
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.069 -9.525 -2.272 9.215 43.201
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.5791 6.7584 -2.601 0.0123 *
## speed 3.9324 0.4155 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
Tes di R
Kita sekarang akan mendiskusikan tentang hasil yang ditampilkan yang dipanggil Coefficients. Pertama, mengulang lagi bahwa kita dapat meng-ekstrak informasi ini secara langsung.
names(summary(stop_dist_model))
## [1] "call" "terms" "residuals" "coefficients"
## [5] "aliased" "sigma" "df" "r.squared"
## [9] "adj.r.squared" "fstatistic" "cov.unscaled"
summary(stop_dist_model)$coefficients
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.579095 6.7584402 -2.601058 1.231882e-02
## speed 3.932409 0.4155128 9.463990 1.489836e-12
Fungsi dari names() memberitahukan kepada kita informasi apa yang sedang ada, dan lalu kita menggunaan operator $ dan coefficients untuk meng-ekstrak informasi yang sudah kita ingikan. Dua nilai ini harus saling dikenal.
\[\hatβ_0 = -17.5790949\] dan \[\hatβ_1 = 3.9324088\]
dimana merupakan perkiraan kita untuk model parameter \(β_0\) dan \(β_1\). Sekarang ayo fokus di baris kedua dari data yang keluar, dimana berhubungan dengan \(β_1\).
summary(stop_dist_model)$coefficients[2,]
## Estimate Std. Error t value Pr(>|t|)
## 3.932409e+00 4.155128e-01 9.463990e+00 1.489836e-12
Lagi, jumlah nilai pertama, Estimate adalah
\[ \hat β_1 = 3.9324088\]
Nilai kedua, Std.Error, adalah nilai standar kesalahan dari \(\hatβ_1\),
\[SE[\hatβ_1] = \frac {s_e}{\sqrt {S{xx}}} = 0.4155128.\]
Nilai ketiga, t value, adalah nilai dariuji statistik untuk pengujian \(H_0 : β_1 = 0 vs H_1 : β_1 ≠ 0\),
\[t = \frac {\hat β_1 - 0}{SE[\hat β_1]} = \frac {\hat β_1 - 0}{s_e / \sqrt {S{xx}}} = 9.46399.\]
Terakhir, Pr(>|t|), memberikan kita nilai p dari pengujian tersebut.
\[p-value = 1.4898365 × 10^{-12}\]
Catat disini, kita secara khusus menguji iya atau tidaknya \(β_1 = 0\).
Baris pertama dari laporan data keluar nilainya sama, tetapi untuk \(β_0\).
summary(stop_dist_model)$coefficients[1,]
## Estimate Std. Error t value Pr(>|t|)
## -17.57909489 6.75844017 -2.60105800 0.01231882
Dalam penjelasan, kode berikus menyimpan informasi dari summary(stop_dist_model)$coefficients di variabel baru stop_dist_model_test_info, lalu ekstrak setiap elemen menjadi variabel baru yang mendeskripsikan informasi yang dikandungnya.
stop_dist_model_test_info = summary(stop_dist_model)$coefficients
beta_0_hat = stop_dist_model_test_info[1, 1] # Estimate
beta_0_hat_se = stop_dist_model_test_info[1, 2] # Std. Error
beta_0_hat_t = stop_dist_model_test_info[1, 3] # t value
beta_0_hat_pval = stop_dist_model_test_info[1, 4] # Pr(>|t|)
beta_1_hat = stop_dist_model_test_info[2, 1] # Estimate
beta_1_hat_se = stop_dist_model_test_info[2, 2] # Std. Error
beta_1_hat_t = stop_dist_model_test_info[2, 3] # t value
beta_1_hat_pval = stop_dist_model_test_info[2, 4] # Pr(>|t|)
Kita dapat memastikan beberapa ekspresi ekuivalen: uji \(t\) statistik untuk \(\hat β_1\) dan kedua sisi dari nilai p terkait dengan uji statistik tersebut.
(beta_1_hat - 0) / beta_1_hat_se
## [1] 9.46399
## [1] 9.46399
2 * pt(abs(beta_1_hat_t), df = length(resid(stop_dist_model)) - 2, lower.tail = FALSE)
## [1] 1.489836e-12
## [1] 1.489836e-12
Uji-t, Signifikansi Regresi
Kita berhenti untuk berdiskusi tentang pentingnya uji regresi. Pertama, perhatikan bahwa berdasarkan dari hasil distribusi diatas, kita dapat menguji \(β_0\) dan \(β_1\) terhadap nilai apapun, dan menunjukkan pengujian untuk satu dan dua sisi.
Namun, satu uji yang paling spesifik,
\[H_0 :β_1 = 0\] vs \[H_1 : β_1 ≠ 0\] yang sangat sering digunakan. Ayo berfikir tentang pengujian ini didalam model regresi linear sederhana,
\[ Y_i = β_0 + β_1x_i + ϵ_i\].
Jika kita mengasumsikan hipotesis nolnya adalah benar, maka \(β_1 =0\) dan kita memiliki model,
\[Y_i = β_0 + ϵ_i\].
- Dimodel ini, responnya tidak berdasarkan prediktornya. Jadi kita dapat berfikit bahws uji ini mengikuti jalan,
Dibawah \(H_0\) tidak terdapat hubungan linier yang signifikan diantara \(x\) dan \(y\).
- Dibawah \(H_1\) terdapat hubungan
linear yang signifikan diantara \(x\) dan \(y\).
- Untuk contoh
cars,
- Dibawah \(H_0\) tidak terdapat hubungan linier yang signifikan diantara \(x\) dan \(y\).
- Dibawah \(H_1\) terdapat hubungan
linear yang signifikan diantara kecepatan dan jarak berhenti.
Lagi, uji itu dilihat pada keluaran dari summary(),
\[p-value = 1.4898365 × 10^{-12}\].
Dengan nilai p yang sangat rendah, kita menolak hipotesis nol tingkatan \(α\) dengan alasan apapun, katakanlah untuk contoh, \(α = 0.01\). Jadi kita mengatakan bahwa ada hubungan linear yang signifikan diantara kecepatan dan jarak berhenti. Perhatikan bahwa kita menekankan linearnya.
knitr::include_graphics("D:/Sem5/Computation/UTS/gambar1.jpg")

Di plot ini yang mensimulasikan data, kita dapat melihat secara jelas hubungan diantara \(x\) dan \(y\), lagipula ini bukanlah hubungan linear. Jika kita mencocokkan garis terhadap data ini, akan menjadi sangat datar. Hasil dari pengujian untuk \(H_0 : β_1 = 0\) melawan \(H_1 : β_1 ≠ 0\) memberikan nilai p yang besar, dikasus ini sebesae 0,7564548, jadi kita akan gagal untuk menolak dan mengatakan bahwa disana tidak ada hubungan linear yang signifikan diantara \(x\) dan \(y\). Nanti kita akan melihat bagaimana caranya untuk mencocokan kurva terhadap data ini menggunakan model “linear”, tapi untuk sekarang, sadari bahwa uji \(H_0 : β_1 = 0\) melawan \(H_1 : β_1 ≠ 0\) hanya dapat mendeteksi hubungan garis lurusnya saja.
Interval Keyakinan di R
Dengan menggunakan R, kita bisa mencari interval kepercayaan untuk \(β_0\) dan \(β_1\) dengan sangat mudah.
confint(stop_dist_model, level = 0.99)
## 0.5 % 99.5 %
## (Intercept) -35.706610 0.5484205
## speed 2.817919 5.0468988
Ini otomatis menghitung dengan interval kepercayaan sebesar 99% untuk kedua \(β_0\) dan \(β_1\), baris pertama untuk \(β_0\), baris kedua untuk \(β_1\).
Untuk contoh cars disaat menafsirkan interval ini, kita katakan, kita percaya bahwa 99% untuk kecepatan 1 mil per jam yang meningkat, peningkatan rata-rata jarak berhenti adalah diantara 2.8179187 dan 5.0468988 kaki, dimana merupakan interval untuk \(β_1\).
Perhatikan bahwa 99% interval kepercayaan ini tidak mengandung nilai hipotesis 0. Sejak itu tidak mengandung 0, ini setara dengan menolak uji \(H_0 : β_1 = 0\) melawan \(H_1 : β_1 ≠ 0\) di \(α = 0.01\), dimana kita sudah melihat itu sebelumnya.
Kamu harus sedikit curiga kepada interval kepercayaan untuk \(β_0\), sejak itu mencakup nilai negatif, yang sesuai dengan jarak berhenti negatif. Secara teknis, interpretasinya adalah kita percaya bahwa 99% jarak berhenti pada suatu mobil yang menempuh jarak 0 mil perjam berada diantara -35.7066103 dan 0.5484205 kaki, tetapi kita tidak sangat mempercayai itu, sejak kita sangat yakin bahwa itu akan menjadi non-negatif.
Catatan, kita dapat meng-ekstrak nilai spesifik dari keluaran ini dengan beberapa cara. Kode ini tidak berjalan, dan sebagai gantinya, kamu harus mengecek bagaimana itu bisa berhubungan dengan keluaran diatas.
confint(stop_dist_model, level = 0.99)[1,]
## 0.5 % 99.5 %
## -35.7066103 0.5484205
confint(stop_dist_model, level = 0.99)[1, 1]
## [1] -35.70661
confint(stop_dist_model, level = 0.99)[1, 2]
## [1] 0.5484205
confint(stop_dist_model, parm = "(Intercept)", level = 0.99)
## 0.5 % 99.5 %
## (Intercept) -35.70661 0.5484205
confint(stop_dist_model, level = 0.99)[2,]
## 0.5 % 99.5 %
## 2.817919 5.046899
confint(stop_dist_model, level = 0.99)[2, 1]
## [1] 2.817919
confint(stop_dist_model, level = 0.99)[2, 2]
## [1] 5.046899
confint(stop_dist_model, parm = "speed", level = 0.99)
## 0.5 % 99.5 %
## speed 2.817919 5.046899
Kita juga dapat memastikan bahwa perhitungan dari R telah menunjukkan interval untuk \(β_1\)
# store estimate
beta_1_hat = coef(stop_dist_model)[2]
# store standard error
beta_1_hat_se = summary(stop_dist_model)$coefficients[2, 2]
# calculate critical value for two-sided 99% CI
crit = qt(0.995, df = length(resid(stop_dist_model)) - 2)
# est - margin, est + margin
c(beta_1_hat - crit * beta_1_hat_se, beta_1_hat + crit * beta_1_hat_se)
## speed speed
## 2.817919 5.046899
Interval Kepercayaan untuk Respon Rata-rata
Selain interval kepercayaan untuk \(β_0\) dan \(β_1\), terdapat dua estimasi interval umum lainnya yang digunakan dengan regresi. Yang pertama dipanggil confidence interval for the mean response. Seringkali, kita akan memperkirakan interval untuk rata-rata, \(E[Y | X = x]\) untuk nilai tertentu dari \(x\).
Di situasi ini kita menggunakan \(\hat y(x)\) sebagai estimasi kita dari \(E[Y | X = x]\). Kita memodifikasikan sedikit notasi kita untuk membuatnya jelas bahwa nilai prediksi adalah fungsi dari nilai \(x\).
\[\hat y(x) = \hat β_0 + \hat β_1 x\]
Ulangi lagi bahwa,
\[E[Y | X = x] = β_0 + β_1 x.\]
Jadi, \(\hat y(x)\) merupakan estimasi yang bagus sejak itu tidak bias:
\[E[\hat y(x)] = β_0 + β_1 x.\]
Kita bisa mendapatkan,
\[Var[\hat y(x)] = σ^2 (\frac {1}{n} = \frac {(x-x)^2}{S{xx}}).\]
Seperti estimasi lain yang telah kita lihat, \(\hat y(x)\) juga mengikuti distribusi normal. Sejak \(β_0\) dan \(β_1\) merupakan kombinasi linear dari variabel acak normal, begitupula dengan \(\hat y(x)\).
\[\hat y(x) ∼ N (β_0 + β_1x,σ^2(\frac{1}{n} + \frac {(x-x)^2}{S{xx}})).\]
Dan terakhir, sejak kita butuh untuk mengestimasi varians ini, kita sampai pada pada standar kesalahan dari estimasi kita,
\[SE[\hat y(x)] = s_e \sqrt {\frac {1}{n} + \frac {(x-\bar x)}{S{xx}}}\]
Lalu kita dapat menggunakan ini untuk mencari interval kepercayaan untuk respon rata-ratanya,
\[\hat y(x) ± t_{α/2,n-2} ⋅ s_e \sqrt {\frac {1}{n} + \frac {(x-\bar x)^2}{S{xx}} }\]
Untuk mencari tau interval kepercayaan untuk respon rata-rata menggunakan R, kita menggunakan fungsi predict(). Kita memberikan fungsi tersebut model kecocokkan kita sebagai data baru, menyimpannya sebagai bingkai data. (Ini penting, maka R diketahui sebagai nama dari variabel prediktor.) Disini, kita menemukan interva lkepercayaan untuk rata-rata jarak berhenti disaat sebuah mobil melaju 5 mil perjam dan disaat sebuah mobil melaju 21 mil perjam.
new_speeds = data.frame(speed = c(5, 21))
predict(stop_dist_model, newdata = new_speeds,
interval = c("confidence"), level = 0.99)
## fit lwr upr
## 1 2.082949 -10.89309 15.05898
## 2 65.001489 56.45836 73.54462
Prediksi Interval untuk Observasi Baru
Terkadang kita ingin meng-estimasikan interval yang baru, \(Y\), untuk nilai tertentu dari \(x\). Ini sangat mirip dengan interval respon rata-rata, \(E[Y | X = x]\), tapi berbeda di satu hal yang sangat penting.
Tebakan terbaik kita untuk observasi yang baru masih tetap \(\hat y(x)\). Estimasi rata-rata masih tetap prediksi terbaik yang bisa kita buat. Perbedaanya terdapat pada jumlah variabilitasnya. Kita tahu bahwa observasi itu akan bervariasi tentang garis regresi yang sebenarnya menurut distribusi \(N(0,σ^2)\). Karena ini kita menambahkan beberapa faktor dari \(σ^2\) untuk estimasi variabilitas kita dengan tujuan untuk menjelaskan variabilitas dari observasi tentang garis regresi.
\[Var[\hat y(x)+ϵ]= Var[\hat y(x)]+Var [ϵ]\] \[= σ^2 (\frac{1}{n}+\frac {(x-\bar x)^2}{S{xx}}) + σ^2 \] \[ = σ^2 (1 +\frac{1}{n}+\frac {(x-\bar x)^2}{S{xx}})\] \[\hat y(x) + ϵ ∼ N (β_0 + β_1x,σ^2(1 +\frac{1}{n}+\frac {(x-\bar x)^2}{S{xx}}))\] \[SE[\hat y(x)+ϵ] = s_e \sqrt {1 +\frac{1}{n}+\frac {(x-\bar x)^2}{S{xx}}}\]
Lalu kita dapat menemukan interval prediksi menggunakan,
\[\hat y(x) ± t_{α/2,n-2} ⋅ s_e\sqrt{1 +\frac{1}{n}+\frac {(x-\bar x)^2}{S{xx}}}.\] Untuk menghitung ini untuk kumpulan poin di R, ketahuilah bahwa hanya ada sedikit perubahan didalam sintaks dari penemuan interval kepercayaan untuk respon rata-rata.
predict(stop_dist_model, newdata = new_speeds,
interval = c("prediction"), level = 0.99)
## fit lwr upr
## 1 2.082949 -41.16099 45.32689
## 2 65.001489 22.87494 107.12803
Juga ketahuilah bahwa dua interval ini lebih lebar dibanding interval kepercayaan yang sesuai untuk respon rata-rata.
Keyakinan dan Band Prediksi
Seringkali kita akan memplot kedua interval kepercayaan untuk respon rata-rata dan interval prediksi untuk semua kemungkinan dari nilai \(x\). Kita memanggil ini sebagai kepercayaan dan band prediksi.
speed_grid = seq(min(cars$speed), max(cars$speed), by = 0.01)
dist_ci_band = predict(stop_dist_model,
newdata = data.frame(speed = speed_grid),
interval = "confidence", level = 0.99)
dist_pi_band = predict(stop_dist_model,
newdata = data.frame(speed = speed_grid),
interval = "prediction", level = 0.99)
plot(dist ~ speed, data = cars,
xlab = "Speed (in Miles Per Hour)",
ylab = "Stopping Distance (in Feet)",
main = "Stopping Distance vs Speed",
pch = 20,
cex = 2,
col = "grey",
ylim = c(min(dist_pi_band), max(dist_pi_band)))
abline(stop_dist_model, lwd = 5, col = "darkorange")
lines(speed_grid, dist_ci_band[,"lwr"], col = "dodgerblue", lwd = 3, lty = 2)
lines(speed_grid, dist_ci_band[,"upr"], col = "dodgerblue", lwd = 3, lty = 2)
lines(speed_grid, dist_pi_band[,"lwr"], col = "dodgerblue", lwd = 3, lty = 3)
lines(speed_grid, dist_pi_band[,"upr"], col = "dodgerblue", lwd = 3, lty = 3)
points(mean(cars$speed), mean(cars$dist), pch = "+", cex = 3)

Beberapa hal yang perlu diperhatikan: ~Kita menggunakan argumen ylim untuk melonggarkan sumbu y dari plot tersebut, sejak bandnya lebih jauh daripada titik yang ada. ~Kita menambahkan poin di poin \((x,\bar y)\) Ini merupakan sebuah titik dimana garis regresinya akan selalu melewatinya. (Pikirkan kenapa bisa terjadi.) Ini adalah titik dimana kedua kepercayaan dan band prediksi menjadi yang tersempit. Lihatlah kepada standar kesalahannya dari keduanya untuk mengetahui kenapa itu bisa terjadi.
Uji F, Signifikansi Regresi
Kasus dari regresi linear sederhana, uji \(t\) untuk signifikasi regresi merupakan nilai equivalent untuk uji lainnya, yaitu uji \(F\) untuk signifikansi regresi. Equivalent ini hanya akan menjadi benar untuk regresi linear sederhana, dan di seksi selanjutnya kita hanya akan menggunakan uji \(F\) untuk signifikansi regresinya.
Ingatlah kembali di seksi terakhir dari dekomposisi varians yang kita lihat sebelum menghitung nilai `\(R^2\),
\[ ∑_{i=1}^n ( y_i - \bar y)^2 = ∑_{i-1}^n (y_i - \bar y_i)^2 + ∑_{i=1}^n (\hat y_i - \bar y)^2, \]
atau, lebih singkatnya,
\[SST = SSE + SSReg.\]
Untuk mengembangkan uji \(F\), kita akan mengatur lagi informasi ini di tabel ANOVA,
knitr::include_graphics("D:/Sem5/Computation/UTS/gambar2.jpg")

ANOVA atau analisis dari varians akan menjadi sebuah konsep yang sering kita bahas dalam kelas ini. Untuk sekarang, kita akan fokus kepada hasil-hasil didalam tabel, dimana \(F\) statistiknya,
\[\frac {∑_{i=1}^n ( y_i - \bar y)^2/1}{∑_{i=1}^n ( y_i - \hat y_i)^2/(n-2)} ∼ F_{1,n-2}\]
dimana mengikuti distribusi \(F\) dengan derajat kebebasan 1 dan \(n-2\) dibawah hipotesis nol. Sebuah distribusi \(F\) adalah distribusi kontinu yang hanya mengambil nilai positif dan mempunyai dua parameter, yang merupakan dua derajat kebebasan.
Ingatlah kembali, didalam signifikansi dari uji regresi, \(Y\) tidak bergantung kepada \(x\) di hipotesis nol.
\[H_0 : β_1 = 0\] \[ Y_i = β_0 + ϵ_i\]
Disaat alternatif dari hipotesis \(Y\) bergantung kepada \(x\).
\[H_0 : β_1 ≠ 0\] \[ Y_i = β_1x_i + ϵ_i\]
Kita dapat menggunakan \(F\) statistik untuk menunjukkan pengujian ini.
\[F = \frac {∑_{i=1}^n (\hat y_i - \bar y)^2/1}{∑_{i=1}^n ( y_i - \hat y_i)^2/(n-2)}\]
Secara khusus, kita akan menolak hipoteis nolnya disaat nilai \(F\) statistiknya besar, itu dia, disaat ada probabilitas rendah bahwa pengamatan secara kebetulan, dapat berasal dari model hipotesis nol. Kita akan membiarkan R menghitung nilai p untuk kita.
UNtuk menunjukkan uji \(F\) di R, anda dapat melihat di baris terakhir dari data yang keluar dari summary() yang dipanggil F-statistic yang memberikan nilai dari uji statistik, nilai derajat kebebasan yang relevan, juga nilai p dari pengujian tersebut.
##
## Call:
## lm(formula = dist ~ speed, data = cars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.069 -9.525 -2.272 9.215 43.201
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -17.5791 6.7584 -2.601 0.0123 *
## speed 3.9324 0.4155 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
Selain itu, anda dapat menggunakan fungsi anova() untuk menampilkan informasi dari tabel ANOVA.
## Analysis of Variance Table
##
## Response: dist
## Df Sum Sq Mean Sq F value Pr(>F)
## speed 1 21186 21185.5 89.567 1.49e-12 ***
## Residuals 48 11354 236.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Ini juga memberikan nilai p dari suatu pengujian. Anda harus memperhatikan bahwa nilai p dari uji \(t\) itu sama. Anda juga mungkin sadar bahwa nilai dari uji statistik dari uji \(t\), 9.46399, bisa di kuadratkan untuk mendapatkan nilai dari \(F\) statistik, 89.5671065.
Perhatikan bahwa ada beberapa jalanlain yang sama yang dapat dilakukan di R, yang sering kita lohat untuk membandingkan dua model.
anova(lm(dist ~ 1, data = cars), lm(dist ~ speed, data = cars))
## Analysis of Variance Table
##
## Model 1: dist ~ 1
## Model 2: dist ~ speed
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 49 32539
## 2 48 11354 1 21186 89.567 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Pernyataan model lm(dist ~ 1, data = cars) menerapkan model \(Y_i = β_0 + ϵ_i\) kepada data cars. Perhatikan bahwa \(\hat y = \bar y\) disaat \(Y_i = β_0 + ϵ_i\).
Pernyataan model lm(dist ~ speed, data = cars) menerapkan model \(Y_i = β_0 + β_1x_i + ϵ_i\).
Lalu kita dapat memikirkan kegunaan dari anova() sebagai perbandingan secara langsung dari dua model. (Perhatikan bahwa kita mendapatkan lagi nilai p yang sama.)
LS0tDQp0aXRsZTogIkNTLUxhYjgtSW5mZXJlbmNlLWluLUxpbmVhci1SZWdyZXNzaW9uIg0KYXV0aG9yOiAiWW9uYXRoYW4gQW5nZ3JhaXdhbiINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KLS0tDQoNCmBgYHtyIExvZ28sZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc0MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6L1VzZXJzL1lvbmF0aGFuL0Rvd25sb2Fkcy9sb2dvbWF0YW5hLmpwZyIpDQpgYGANCg0KIyBJbmZlcmVuc2lhbCBkaSBSZWdyZXNpIExpbmVhcg0KDQpTZXRlbGFoIG1lbWJhY2Egc2Vrc2kgaW5pLCBrYW11IGFrYW4gYmlzYToNCg0KICB+TWVuZ2VydGkgbWVuZ2VuYWkgZGlzdHJpYnVzaSBkYXJpIHN1YXR1IGVzdGltYXNpIHJlZ3Jlc2kuDQogICAgDQogIH5NZW1idWF0IGludGVydmFsIGVzdGltYXNpIHVudHVrIHJlZ3Jlc2kgcGFyYW1ldGVyLCByZXNwb24gcmF0YS1yYXRhLCBkYW4gcHJlZGlrc2kuDQogICAgDQogIH5NZW5ndWppIHNpZ25pZmlrYW4gcmVncmVzaW55YS4NCg0KICBEaSBzZWtzaSB0ZXJha2hpciwga2l0YSBtZW1lY2Foa2FuIG1vZGVsIHJlZ3Jlc2kgbGluZWFyIHNlZGVyaGFuYSwgeWFpdHUNCg0KJCRZX2kgPSDOsl8wICsgzrJfMXhfaSArIM+1X2kkJA0KZGltYW5hICTPtV9pIOKIvCBOKDAsz4NeMikkLiBMYWx1IGtpdGEgbWVuZ2d1bmFrYW4gb2JzZXJ2YXNpICQoeF9pLHlfaSkkLCB1bnR1ayAkaSA9IDEsMiwuLi4sbiQsIHVudHVrIG1lbmVtdWthbiBpbGFpIGRhcmkgJM6yXzAgZGFuIM6yXzEkIHlhbmcgYmlzYSBkaW1pbmltdW1rYW4NCg0KJCRmKM6yXzAszrJfMSk94oiRX3tpPTF9Xm4oeV9pLSjOsl8wICsgzrJfMXhfaSkpXjIkJC4NCg0KS2l0YSBtZW1hbmdnaWwgbmlsYWkgJFxoYXTOsl8wJCBkYW4gJFxoYXTOsl8xJCwgZGltYW5hIGtpdGEgbWVuZW11a2FubnlhIG1lbmphZGkNCg0KJCRcaGF0zrJfMT0gXGZyYWMge1Nfe3h5fX17U197eHh9fSA9IFxmcmFjIHviiJFfe2k9MX1ebih4X2kgLSBcYmFyIHgpKHlfaSAtIFxiYXIgeSApfXviiJFfe2k9MX1ebih4X2kteCleMn0kJA0KJCRcaGF0zrJfMCA9IFxiYXIgeSAtIFxoYXTOsl8xIFxiYXIgeCQkLg0KDQpLaXRhIGp1Z2EgYWthbiBtZW1wZXJraXJha2FuIG5pbGFpICTPg14yJCBtZW5nZ3VuYWthbiAkc19lXjIkLiBEaSBrYXRhIGxhaW4sIGtpdGEgbWVuZW11a2FuIGJhaHdhICRzX2UkIGFkYWxhaCBzZWJ1YWggZXN0aW1hc2kgdW50dWsgJM+DJCwgZGltYW5hDQoNCiQkc19lID0gUlNFID0gXHNxcnQgXGZyYWMgezF9e24gLSAyfSDiiJFfe2k9MX1ebiBlX2leMiQkDQpkaW1hbmEga2l0YSBqdWdhIG1lbWFuZ2dpbCBSU0UsIHNlYmFnYWkgIlJlc2lkdWFsIFN0YW5kYXJ0IEVycm9yLiINCg0KRGlzYWF0IG1lbmdhcGxpa2FzaWthbiBrZSBkYXRhIGBjYXJzYCwga2l0YSBtZW5kYXBhdGthbiBoYXNpbCBzZXBlcnRpIGJlcmlrdXQ6DQoNCmBgYHtyfQ0Kc3RvcF9kaXN0X21vZGVsID0gbG0oZGlzdCB+IHNwZWVkLCBkYXRhID0gY2FycykNCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKQ0KYGBgDQoNCkRpIHNla3NpIHRlcmFraGlyLCBraXRhIGhhbnlhIG1lbmRpc2t1c2lrYW4gdGVudGFuZyBuaWxhaSBgZXN0aW1hdGVgLCBgUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3JgLCBkYW4gYE11bHRpcGxlIFItc3F1YXJlZGAuIERpIHNla3NpIGluaSwga2l0YSBha2FuIG1lbmRpc2t1c2lrYW4gc2VtdWEgaW5mb3JtYXNpIGRpYmF3YWggbmlsYWkgYENvZWZmaWNpZW50c2AsIGJlZ2l0dSBqdWdhIGRlbmdhbiBuaWxhaSBgRi1zdGF0aXN0aWNgLg0KDQpgYGB7cn0NCnBsb3QoZGlzdCB+IHNwZWVkLCBkYXRhID0gY2FycywNCiAgICAgeGxhYiA9ICJTcGVlZCAoaW4gTWlsZXMgUGVyIEhvdXIpIiwNCiAgICAgeWxhYiA9ICJTdG9wcGluZyBEaXN0YW5jZSAoaW4gRmVldCkiLA0KICAgICBtYWluID0gIlN0b3BwaW5nIERpc3RhbmNlIHZzIFNwZWVkIiwNCiAgICAgcGNoICA9IDIwLA0KICAgICBjZXggID0gMiwNCiAgICAgY29sICA9ICJncmV5IikNCmFibGluZShzdG9wX2Rpc3RfbW9kZWwsIGx3ZCA9IDUsIGNvbCA9ICJkYXJrb3JhbmdlIikNCmBgYA0KDQpEYXJpIGdyYWZpayBkaWF0YXMsIGtpdGEgZGFwYXQgbWVueWltcHVsa2FuIGJhaHdhIGFkYSBzdWF0dSBrb3JlbGFzaSB5YW5nIGFkYSBkaWFudGFyYSBqYXJhayBiZXJoZW50aSBkZW5nYW4gc3VhdHUga2VjZXBhdGFuLCBkaW1hbmEgaGFzaWxueWEgYWRhbGFoIHZhcmlhYmVsIGtlY2VwYXRhbiwgbWVtcGVuZ2FydWhpIGphcmFrIGJlcmhlbnRpLCBzZW1ha2luIGNlcGF0IGtlY2VwYXRhbiBwYWRhIHNlc3VhdHUsIG1ha2Egc2VtYWtpbiBqYXVoIHB1bGEgamFyYWsgYmVyaGVudGlueWEuDQoNClVudHVrIG1lbXVsYWksIGtpdGEgYWthbiBwZXJoYXRpa2FuIGJhaHdhIGFkYSBla3NwcmVzaSBlcXVpdmFsZW4geWFuZyBsYWluIHVudHVrICRTX3t4eX0kIGRpbWFuYSB0aWRhayBraXRhIGxpaGF0IGRpIHNlc2kgeWFuZyB0ZXJha2hpciwNCiQkU197eHl9ID0g4oiRX3tpPTF9Xm4gKHhfaSAtIFxiYXIgeCkoeV9pIC0gXGJhciB5KSA9IOKIkV97aT0xfV5uICh4X2kgLSBcYmFyIHgpeV9pJCQuDQoNCkluaSBtdW5na2luIGFrYW4gbWVuamFkaSBuaWxhaSBlcXVpdmFsZW4geWFuZyBtZW5nZWp1dGthbi4gKE11bmdraW4gYWthbiBtZW5jb2JhIHVudHVrIG1lbWJ1a3Rpa2FubnlhLikgTGFnaXB1bGEsIGl0dSBha2FuIG1lbmphZGkgYmVyZ3VuYSBzZWJhZ2FpIHNlYnVhaCBrb25zZXAgaWx1c3RyYXNpIGRpIHNla3NpIGluaS4NCg0KUGVyaGF0aWthbiBiYWh3YSwgJFxoYXQgzrJfMSQgYWRhbGFoIHNhbXBlbCBzdGF0aXN0aWsgeWFuZyBzdWRhaCB0ZXJoaXR1bmcgZGVuZ2FuIHN1YXR1IG9ic2VydmFzaSBkYXRhIHNlcGVydGkgeWFuZyBkaXR1bGlza2FuIGRpYXRhcywgeWFpdHUgJFxoYXQgzrJfMCQuDQoNCkJhZ2FpbWFuYXB1biBqdWdhLCBzZWtzaSBpbmkgYWthbiBzZXJpbmcgbWVtdWRhaGthbiBraXRhIHVudHVrIG1lbmdndW5ha2FuIGtlZHVhICRcaGF0IM6yXzEkIGRhbiAkXGhhdCDOsl8wJCBzZWJhZ2FpIHZhcmlhYmVsIGFjYWssIGl0dSBkaWEsIGtpdGEgbWFzaWggYmVsdW0gbWVtcHVueWFpIG5pbGFpIG9ic2VydmFzaSB1bnR1ayBtYXNpbmctbWFzaW5nIGRhcmkkWV9pJC4gRGlzYWF0IGthc3VzbnlhIGFkYWxhaCBpbmksIGtpdGEgYWthbiBtZW5nZ3VuYWthbiBub3Rhc2kgeWFuZyBiZXJiZWRhLCBtZW5zdWJ0aXR1c2lrYW4gJFlfaSQgdW50dWsga2FzdXMgJHlfaSQgeWFuZyBsZWJpaCByZW5kYWguIA0KDQokJFxoYXTOsl8xPSBcZnJhYyB74oiRX3tpPTF9Xm4oeF9pIC0gXGJhciB4KVlfaX174oiRX3tpPTF9Xm4oeF9pLXgpXjJ9JCQNCiQkXGhhdM6yXzAgPSBcYmFyIFkgLSBcaGF0zrJfMSBcYmFyIHgkJA0KDQpEaSBzZWtzaSB0ZXJha2hpciBraXRhIG1lbnlldHVqdWkgYmFod2EgcGVya2lyYWFuIGluaSBkYXJpIG1vZGVsIHBhcmFtZXRlciAkzrJfMCQgZGFuICTOsl8xJCB5YW5nIHRpZGFrIGRpa2V0YWh1aSwgaXR1IGJhZ3VzIGthcmVuYSBraXRhIG1lbmRhcGF0a2FuIG1lcmVrYSBkYXJpIG1lbWluaW11bWthbiBrZXNhbGFoYW4uIEtpdGEgc2VrYXJhbmcgYWthbiBtZW5kaXNrdXNpa2FuIHRlbnRhbmcgdGVvcmVtYSBHYXVzcy1NYXJrb3YgeWFuZyBtZW5nYW1iaWwgbGViaWggbGFuanV0IHRlbnRhbmcgaWRlIGluaSwgbWVudW5qdWthbiBiYWh3YSBwZXJraXJhYW4gaW5pIHNlYmVuYXJueWEgbWVydXBha2FuIHBlcmtpcmFhbiB5YW5nICJ0ZXJiYWlrIiwgZGFyaSBzdWR1dCBwYW5kYW5nIHRlcnRlbnR1Lg0KDQojIyBUZW9yZW1hIEdhdXNzLU1hcmtvdg0KDQpUZW9yZW1hIEdhdXNzLU1hcmtvdiBpbmkgbWVtYmVyaXRhaHVrYW4ga2VwYWRhIGtpdGEgYmFod2EgZGlzYWF0IGtpdGEgbWVtcGVya2lyYWthbiBwYXJhbWV0ZXIgZGFyaSByZWdyZXNpIGxpbmVhciBzZWRlcmhhbmEgbW9kZWwgJM6yXzAkIGRhbiAkzrJfMSQsIG5pbGFpICTOsl8wJCBkYW4gJM6yXzEkIHlhbmcga2l0YSBwZXJjYXlha2FuIGFkYWxhaCBwZXJraXJhYW4gbGluZWFyIHRpZGFrIGJpYXMgeWFuZyB0ZXJhaWssIGF0YXUgbGViaWggc2luZ2thdG55YSAiQkxVRSAvIEJlc3QgTGluZWFyIFVuYmlhc2VkIEVzdGltYXRlcyIuIChTZWJ1YWgga29uZGlzaSBzZWJlbmFybnlhIHVudHVrIHRlb3JlbWEgR2F1c3MtTWFya292IHlhbmcgbGViaWggcmlsZWtzIGRpYmFuZGluZyBtb2RlbCBTTFIuKQ0KDQpTZWthcmFuZyBraXRhIGFrYW4gbWVuZGlza3VzaWthbiB0ZW50YW5nIGxpbmVhciwgdGlkYWsgYmlhcywgZGFuIHRlcmJhaWssIHlhbmcgYmVyaHVidW5nYW4gZGVuZ2FuIHBlcmtpcmFhbiB0ZXJzZWJ1dC4NCg0KIyMjIExpbmVhcg0KDQpNZW5ndWxhbmcga2VtYmFsaSwgZGkgcGVuZ2F0dXJhbiBTTFIgZGltYW5hIG5pbGFpICR4X2kkIHN1ZGFoIGRpa2V0YWh1aSwgZGFuIGRpYW5nZ2FwIHNlYmFnYWkgc3VhdHUga3VhbnRpdGFzLiBMYWx1IHNlYnVhaCBwZXJraXJhYW4gbGluZWFyIGFkYWxhaCBzYWxhaCBzYXR1IHlhbmcgZGFwYXQgZGl0dWxpcyBzZWJhZ2FpIGtvbWJpbmFzaSBsaW5lYXIgZGFyaSAkWV9pJC4gRGkgc2VidWFoIGthc3VzIGRhcmkgJFxoYXQgzrJfMSQga2l0YSBtZWxpaGF0DQoNCiQkXGhhdM6yXzE9IFxmcmFjIHviiJFfe2k9MX1ebih4X2kgLSBcYmFyIHgpWV9pfXviiJFfe2k9MX1ebih4X2kteCleMn0gPSDiiJFfe2k9MX1ebiBrX2lZX2kgPSBrXzFZXzEgKyBrXzJZXzIgKyAuLi4gKyBrX25ZX24gJCQNCg0KZGltYW5hICRrX2kgPSBcZnJhYyB7KHhfaSAtIFxiYXIgeCl9e+KIkV97aT0xfV5uICh4X2kgLSBcYmFyIHgpXjJ9JC4NCg0KRGkgcGVydHVuanVrYW4geWFuZyBtaXJpcCwga2l0YSBkYXBhdCBtZW51bmp1a2thbiBiYWh3YW4gJFxoYXTOsl8wJCBkYXBhdCBkaXR1bGlzIHNlYmFnYWkga29tYmluYXNpIGxpbmVhciBkYXJpICRZX2kkLiBKYWRpIGtlZHVhICAkXGhhdM6yXzAkIGRhbiAkXGhhdM6yXzEkIGFkYWxhaCBzdWF0dSBlc3RpbWF0b3IgZGFyaSBmdW5nc2kgbGluZWFyLg0KDQojIyMgVGlkYWsgQmlhcw0KDQpTZWthcmFuZyBraXRhIHN1ZGFoIHRhdSBiYWh3YSBwZXJraXJhYW4ga2l0YSBhZGFsYWggZnVuZ3NpIGxpbmVhciwgc2ViZXJhcGEgYmFndXNrYWggZXN0aW1hc2kgaW5pPyBTYWxhaCBzYXR1IHBlbmd1a3VyYW4gImtlYmFpa2FuIiBkYXJpIHN1YXR1IHBlcmtpcmFhbiBhZGFsYWggYmlhcy4gTGViaWggc3Blc2lmaWssIGtpdGEgY2VuZGVydW5nIG1lbXBlcmtpcmFrYW4geWFuZyB0aWRhayBiaWFzLCBiZXJhcnRpIGVrc3Bla3Rhc2kgbmlsYWkgbWVyZWthIGFkYWxhaCBwYXJhbWV0ZXIgeWFuZyBzZWRhbmcgZGkgcGVya2lyYWthbi4NCg0KRGkgZGFsYW0ga2FzdXMgZGFyaSBwZXJraXJhYW4gcmVncmVzaSwga2l0YSBtZW1pbGlraSwNCg0KJCRFW1xoYXTOsl8wXT3Osl8wJCQNCiQkRVtcaGF0zrJfMV09zrJfMS4kJA0KDQpJbmkgbWVtYmVyaXRhaHVrYW4ga2VwYWRhIGtpdGEgYmFod2EsIGRpc2FhdCBrb25kaXNpIGRhcmkgc3VhdHUgbW9kZWwgU0xSIGJlcnRlbXUsIHJhdGEtcmF0YSBkYXJpIHBlcmtpcmFhbiBraXRhIGFrYW4gYmVuYXIuIExhZ2lwdWxhLCB5YW5nIHN1ZGFoIGtpdGEgbGloYXQgZGFyaSBzZWtzaSB0ZXJha2hpciBkaW1hbmEga2l0YSBtZW5zaW11bGFzaWthbiBkYXJpIG1vZGVsIFNMUiwgaXR1IHRpZGFrIGJlcmFydGkgYmFod2Egc2V0aWFwIHBlcmtpcmFhbiBha2FuIGJlbmFyLiBIYW55YSBpdHUsIGppa2Ega2l0YSBtZW5ndWxhbmcgcHJvc2VzbnlhIGtlIGp1bWxhaCB5YW5nIHRpZGFrIHRlcmhpbmdnYSwgcGVya2lyYWFuIHJhdGEtcmF0YSBpdHUgYWthbiBiZW5hci4NCg0KIyMjIFRlcmJhaWsNCg0KU2VrYXJhbmcsIGppa2Ega2l0YSBtZW1iYXRhc2kgZGlyaSBraXRhIGtlcGFkYSBrZWR1YSBmdW5nc2kgbGluZWFyIGRhbiBwZXJraXJhYW4gdGlkYWsgYmlhcywgYmFnYWltYW5hIGtpdGEgYWthbiBtZW1hc3Rpa2FuIHBlcmtpcmFhbiB0ZXJiYWlrbnlhPyBQZXJraXJhYW4gZGVuZ2FuIHZhcmlhbnMgdGVybWluaW0uDQoNCkNhdGF0YW4gcGVydGFtYSBhZGFsYWggaW5pIHNhbmdhdCBtdWRhaCB1bnR1ayBtZW1idWF0IHN1YXR1IHBlcmtpcmFhbiB1bnR1ayAkzrJfMSQgeWFuZyBtZW1pbGlraSB2YXJpYW5zIHlhbmcgcmVuZGFoLCB0YXBpIGJ1a2FuIHRpZGFrIGJpYXMuIFNlYmFnYWkgY29udG9oLCBwYXN0aWthbjoNCg0KJCRcaGF0zrhfe0JBRH09NSQkIA0KDQpMYWx1LCBzZWphayAkXGhhdM64X3tCQUR9JCBhZGFsYWggc2VidWFoIG5pbGFpIGtvbnN0YW4sDQoNCiQkVmFyW1xoYXTOuF97QkFEfV09MCQkDQoNCkJhZ2FpbWFuYXB1biBqdWdhIHNlamFrLCANCg0KJCRFW1xoYXTOuF97QkFEfV0gPSA1JCQNCg0Ka2l0YSBtZW5nYXRha2FuIGJhaHdhICRcaGF0zrhfe0JBRH0kIGFkYWxhaCBlc3RpbWF0b3IgeWFuZyBiaWFzIGtlY3VhbGkga2FsYXUgJM6yXzE9NSQsIGRpbWFuYSBzZWJlbHVtbnlhIGtpdGEgdGlkYWsgYWthbiB0YXUuIFVudHVrIGFsYXNhbiBpbmksIGluaSBtZXJ1cGFrYW4gcGVya2lyYWFuIHlhbmcgbWVuZ2VyaWthbiAoa2VjdWFsaSBrYWxhdSBhZGEga2VzZW1wYXRhbiAkzrJfMT01JCkgYmFoa2FuIGppa2EgaXR1IGFkYWxhaCB2YXJpYW5zIHRlcmtlY2lsIHlhbmcgbWVtdW5na2lua2FuLiBJbmkgYWRhbGFoIGJhZ2lhbiBkYXJpIHN1YXR1IGFsYXNhbiB5YW5nIG1lbWJhdGFzaSBkaXJpIGtpdGEgdW50dWsgbWVtcGVya2lyYWthbiB5YW5nIHRpZGFrIGJpYXMuIEFwYSB5YW5nIGJhZ3VzIHBhZGEgc2VidWFoIGVzdGltYXNpLCBqaWthIGl0dSBtZW1wZXJraXJha2FuIGt1YW50aXRhcyB5YW5nIHNhbGFoPw0KDQpKYWRpIHNla2FyYW5nLCB1bnR1ayBwZXJ0YW55YWFuIGFsYW1pbnlhLCBhcGFrYWggdmFyaWFucyBkYXJpICRcaGF0zrJfMCQgZGFuICRcaGF0zrJfMSQ/IE1lcmVrYSBhZGFsYWgsDQoNCiQkVmFyW1xoYXTOsl8wXSA9IM+DXjIoXGZyYWN7MX17bn0gKyBcZnJhYyB7XGJhciB4XjJ9e1Nfe3h4fX0pJCQNCiQkVmFyW1xoYXTOsl8xXSA9IFxmcmFjIHvPg14yfXtTX3t4eH19JCQNCg0KSW5pIG1lbmd1a3VyIHZhcmlhYmlsaXRhcyBkYXJpIGR1YSBwZXJraXJhYW4ga2Uga2VzZW1wYXRhbiBhY2FrIGRpc2FhdCBzZWRhbmcgbWVueWFtcGxpbmcgZGF0YS4gQXBha2FoIGluaSAieWFuZyB0ZXJiYWlrIj8gQXBha2FoIHZhcmlhbnMgaW5pIGFkYWxhaCB2YXJpYW5zIHlhbmcgdGVya2VjaWwgeWFuZyBiaXNhIGtpdGEgZGFwYXRrYW4/IEthbXUgaGFueWEgYmlzYSBwZXJjYXlhIGtlcGFkYSBrYXRhLWthdGEga2FtaSBiYWh3YSBpbmkgbWVtYW5nIHN1ZGFoIGJlbmFyLg0KDQojIyBEaXN0cmlidXNpIFNhbXBsaW5nDQoNClNla2FyYW5nIGtpdGEgaGFydXMgbWVuZGVmaW5pc2lrYW4gdWxhbmcgcGVya2lyYWFuIHVudHVrICRcaGF0zrJfMCQgZGFuICRcaGF0zrJfMSQgeWFuZyBtZW5qYWRpIHZhcmlhYmVsIGFjYWtueWEsIGtpdGEgZGFwYXQgYmVyZGlza3VzaSB0ZW50YW5nIGRpc3RyaWJ1c2kgc2FtcGxpbmcgbWVyZWthLCB5YW5nIG1hbmEgZGlzdHJpYnVzaSBrZXRpa2EgZGlhbmdnYXAgc2ViYWdhaSB2YXJpYWJlbCBhY2FrLg0KDQpTZWphayBrZWR1YSAkXGhhdM6yXzAkIGRhbiAkXGhhdM6yXzEkIGFkYWxhaCBrb21iaW5hc2kgbGluZWFyIGRhcmkgJFlfaSQgZGFuIHNldGlhcCAkWV9pJCBhZGFsYWggZGlzdHJpYnVzaSBub3JtYWwsIG1ha2Ega2VkdWEgJFxoYXTOsl8wJCBkYW4gJFxoYXTOsl8xJCBqdWdhIG1lcnVwYWthbiAvIG1lbmdpa3V0aSBkaXN0cmlidXNpIG5vcm1hbC4NCg0KTGFsdSwgbWVuYXJ1aCBzZW11YW55YSB5YW5nIGRpYXRhcyBzZWNhcmEgYmVyc2FtYSwga2l0YSBzYW1wYWkgZGkgZGlzdHJpYnVzaSBkYXJpICRcaGF0zrJfMCQgZGFuICRcaGF0zrJfMSQuDQoNClVudHVrICRcaGF0zrJfMSQsIGtpdGEga2F0YWthbg0KDQokJFxoYXTOsl8xID0gXGZyYWMge1N7eHl9fXtTe3h4fX0gPSBcZnJhYyB74oiRX3tpPTF9Xm4oeF9pIC0gXGJhciB4KVlfaX174oiRX3tpPTF9Xm4oeF9pLXgpXjJ9IOKIvCBOICjOsl8xLCBcZnJhYyB7z4NeMn174oiRX3tpPTF9Xm4oeF9pLVxiYXIgeCleMn0pJCQNCg0KQXRhdSBsZWJpaCBzaW5na2F0bnlhLA0KDQokJFxoYXTOsl8xIOKIvCBOICjOsl8xLCBcZnJhYyB7z4NeMn17U3t4eH19KSQkDQoNCkRhbiB1bnR1ayAkXGhhdM6yXzAkLA0KDQokJFxoYXTOsl8wID0gXGJhciBZIC0gXGhhdM6yXzEgXGJhciB4ICDiiLwgKM6yXzAsIFxmcmFjIHvPg14yIOKIkV97aT0xfV5uIHhfaV4yfXtu4oiRX3tpPTF9Xm4gKHhfaS1cYmFyIHgpXjJ9KSQkDQoNCkF0YXUgbGViaWggc2luZ2thdG55YSwNCg0KJCRcaGF0zrJfMCDiiLwgTiAozrJfMCwgz4NeMihcZnJhYyB7MX17bn0rXGZyYWMge1xiYXIgeF4yfXtTe3h4fX0pKSQkDQoNCkRpIGJhZ2lhbiBpbmkga2l0YSB0ZWxhaCBsYWxhaSB1bnR1ayBtZW1idWt0aWthbiBub21vciBkYXJpIGhhc2lsIHRlcnNlYnV0LiBBbGloLWFsaWggdW50dWsgbWVuZ2VyamFrYW4gZGVuZ2FuIGRlcml2YXNpIHlhbmcgbWVtYm9zYW5rYW4gZGFyaSBkaXN0cmlidXNpIHNhbXBsaW5nIGluaSwga2l0YSBha2FuIG1lbWJlbmFya2FuIGhhc2lsIGluaSB1bnR1ayBkaXJpIGtpdGEgc2VuZGlyaSBkZW5nYW4gbWVuZ2d1bmFrYW4gc2ltdWxhc2kuDQoNCkNhdGF0YW4gdW50dWsgcGFyYSBwZW1iYWNhOiBEZXJpdmFzaSBkYW4gcGVtYnVrdGlhbiBpbmkgbXVuZ2tpbiBha2FuIGRpdGFtYmFoa2FuIGtlIGxhbXBpcmFuIGRpIHN1YXR1IHNhYXQgbmFudGkuIEthbXUganVnYSBiaXNhIG1lbmVtdWthbiBoYXNpbCBpbmkgZGkgd2FrdHUgeWcgYWthbiBkYXRhbmcgZGkgYnVrdSB0ZWtzIHRlbnRhbmcgcmVncmVzaSBsaW5lYXIgc2VkZXJoYW5hLiBEaSBVSVVDLCBoYXNpbCBpbmkgYWthbiBkaXByZXNlbnRhc2lrYW4gZGkga2VkdWEgU1RBVCA0MjQgZGFuIFNUQVQgNDI1LiBOYW11biwgc2VqYWsgYW5kYSB0aWRhayBha2FuIGJlcnRhbnlhIHVudHVrIG1lbmFtcGlsa2FuIGRlcml2YXNpIGRhcmkgdGlwZSB5YW5nIGFkYSBkaSBrZWxhcyBpbmksIG1lcmVrYSBzZWthcmFuZyBkaWhpbGFuZ2thbi4NCg0KIyMjIFNpbXVsYXNpIERpc3RyaWJ1c2kgU2FtcGxpbmcNCg0KDQpVbnR1ayBtZW1hc3Rpa2FuIGhhc2lsIGRpYXRhcywga2l0YSBha2FuIG1lbnNpbXVsYXNpa2FuIHNhbXBsZSBkZW5nYW4gdWt1cmFuICRuID0gMTAwJCBkYXJpIG1vZGVsIA0KDQokJFlfaSA9IM6yXzAgKyDOsl8xIHhfaSArIM+1X2kkJA0KDQpkaW1hbmEgJM+1X2kg4oi8IE4oMCzPg14yKSQuIERpIGthc3VzIGluaSwgcGFyYW1ldGVybnlhIGRhcGF0IGRpa2V0YWh1aSBzZWJhZ2FpOg0KDQogICAgfiAkzrJfMCA9IDMkDQogICAgfiAkzrJfMSA9IDYkDQogICAgfiAkz4NeMiA9IDQkDQoNCkxhbHUsIGJlcmRhc2Fya2FuIHBlcm55YXRhYW4gZGlhdGFzLCBraXRhIGhhcnVzIG1lbmVtdWthbiBiYWh3YQ0KDQokJFxoYXQgzrJfMSDiiLwgTijOsl8xLCBcZnJhYyB7z4NeMn17U3t4eH19KSQkDQoNCmRhbg0KDQokJFxoYXQgzrJfMCDiiLwgTijOsl8wLM+DXjIoXGZyYWMgezF9e259K1xmcmFjIHtcYmFyIHheMn17U3t4eH19KSkkJA0KDQpQZXJ0YW1hIGtpdGEgc2ViZWx1bW55YSBoYXJ1cyBtZW5lbnR1a2FuIGJlcmFwYSBuaWxhaSB4IGtpdGEgZGkgc2ltdWxhc2kgaW5pLCBzZWphayBuaWxhaSB4IGRpIFNMUiBqdWdhIGRpYW5nZ2FwIHNlYmFnYWkga3VhbnRpdGFzIHlhbmcgZGlrZXRhaHVpLiBQaWxpaGFuIHVudHVrIG5pbGFpIHggYWRhbGFoIHNlbWF1bnlhIGtpdGEuIERpc2luaSBraXRhIGp1Z2EgbWVuZW50dWthbiBiZW5paCB1bnR1ayBwZW5nYWNha2FuIGRhbiBwZXJoaXR1bmdhbiAkU3t4eH0kIGRpbWFuYSBraXRhIGFrYW4gdGV0YXAgYmVyZ2VyYWsga2VkYXBhbi4NCg0KYGBge3J9DQpzZXQuc2VlZCg0MikNCnNhbXBsZV9zaXplID0gMTAwICMgdGhpcyBpcyBuDQp4ID0gc2VxKC0xLCAxLCBsZW5ndGggPSBzYW1wbGVfc2l6ZSkNClN4eCA9IHN1bSgoeCAtIG1lYW4oeCkpIF4gMikNCmBgYA0KDQpLaXRhIGp1Z2EgbWVtYXN0aWthbiBuaWxhaSBwYXJhbWV0ZXIga2l0YS4NCg0KYGBge3J9DQpiZXRhXzAgPSAzDQpiZXRhXzEgPSA2DQpzaWdtYSAgPSAyDQpgYGANCg0KRGVuZ2FuIGluZm9ybWFzaSBpbmksIGtpdGEgdGF1IGRpc3RyaWJ1c2kgc2FtcGxpbmdueWEgaGFydXMgbWVuamFkaToNCg0KYGBge3J9DQoodmFyX2JldGFfMV9oYXQgPSBzaWdtYSBeIDIgLyBTeHgpDQpgYGANCmBgYHtyfQ0KKHZhcl9iZXRhXzBfaGF0ID0gc2lnbWEgXiAyICogKDEgLyBzYW1wbGVfc2l6ZSArIG1lYW4oeCkgXiAyIC8gU3h4KSkNCmBgYA0KDQokJFxoYXQgzrJfMSDiiLwgTig2LDAuMTE3NjIzOCkkJA0KZGFuDQokJFxoYXQgzrJfMCDiiLwgTigzLDAuMDQpLiQkDQoNCkluaSBkaWEsDQoNCiQkRVtcaGF0IM6yXzFdID0gNiQkDQokJFZhcltcaGF0IM6yXzFdID0gMC4xMTc2MjM4JCQNCmRhbg0KJCRFW1xoYXQgzrJfMF0gPSAzJCQNCiQkVmFyW1xoYXQgzrJfMF0gPSAwLjA0LiQkDQoNCktpdGEgc2VrYXJhbmcgbWVuc2ltdWxhc2lrYW4gZGF0YSBkYXJpIG1vZGVsIGluaSBzZWJhbnlhayAxMCwwMDAga2FsaS4gUGVyaGF0aWthbiBiYWh3YSBpbmkgbXVuZ2tpbiBidWthbmxhaCBqYWxhbiBgUmAgeWFuZyBiaWFzYW55YSBkaWxha3VrYW4gZGlzYWF0IG1lbGFrdWthbiBzaW11bGFzaS4gS2l0YSBha2FuIG1lbnVuanVra2FuIHNpbXVsYXNpIGRlbmdhbiBjYXJhIGluaSB5YW5nIGJlcnVwYXlhIHVudHVrIG1lbmplbGFza2FuLiBTZWJhZ2FpIGNvbnRvaCwga2l0YSBkYXBhdCBtZW5nZ3VuYWthbiBmdW5nc2kgYHNpbV9zbHIoKWAgZGFyaSBzZWtzaSBzZWJlbHVtbnlhLiBLaXRhIGp1Z2EgYWthbiBtZW55aW1wYW4gdmFyaWFiZWwgaW5pIGRpIGxpbmdrdW5nYW4gZ2xvYmFsIHVudHVrIG1lbWJ1YXQgYmluZ2thaSBkYXRhIHVudHVrIHNldGlhcCBzaW11bGFzaSBkYXRhIHlhbmcgYmFydS4NCg0KYGBge3J9DQpudW1fc2FtcGxlcyA9IDEwMDAwDQpiZXRhXzBfaGF0cyA9IHJlcCgwLCBudW1fc2FtcGxlcykNCmJldGFfMV9oYXRzID0gcmVwKDAsIG51bV9zYW1wbGVzKQ0KZm9yIChpIGluIDE6bnVtX3NhbXBsZXMpIHsNCiAgZXBzID0gcm5vcm0oc2FtcGxlX3NpemUsIG1lYW4gPSAwLCBzZCA9IHNpZ21hKQ0KICB5ICAgPSBiZXRhXzAgKyBiZXRhXzEgKiB4ICsgZXBzDQogIA0KICBzaW1fbW9kZWwgPSBsbSh5IH4geCkNCiAgDQogIGJldGFfMF9oYXRzW2ldID0gY29lZihzaW1fbW9kZWwpWzFdDQogIGJldGFfMV9oYXRzW2ldID0gY29lZihzaW1fbW9kZWwpWzJdDQp9DQpgYGANCg0KU2V0aWFwIGthbGkga2l0YSBtZW5zaW11bGFzaWthbiBkYXRhLCBraXRhIG1lbmRhcGF0a2FuIGhhc2lsIGRhcmkga29lZmlzaWVuIHBlcmtpcmFhbm55YS4gVmFyaWFiZWwgZGFyaSBgYmV0YV8wX2hhdHNgIGRhbiBgYmV0YV8xX2hhdHNgIGFrYW4gbWVueWltcGFuIDEwLDAwMCBuaWxhaSBzaW11bGFzaSBtYXNpbmctbWFzaW5nIGRhcmkgJFxoYXQgzrJfMCQgZGFuICRcaGF0IM6yXzEkLg0KDQpQZXJ0YW1hIGtpdGEgYWthbiBtZW1hc3Rpa2FuIGRpc3RyaWJ1c2kgZGFyaSAkXGhhdCDOsl8xJC4NCg0KYGBge3J9DQptZWFuKGJldGFfMV9oYXRzKSAjIGVtcGlyaWNhbCBtZWFuDQpgYGANCmBgYHtyfQ0KYmV0YV8xICAgICAgICAgICAgIyB0cnVlIG1lYW4NCmBgYA0KYGBge3J9DQp2YXJfYmV0YV8xX2hhdCAgICAjIHRydWUgdmFyaWFuY2UNCmBgYA0KDQoNCktpdGEgbWVsaWhhdCBiYWh3YSBjYXJhIGRhbiByYXRhLXJhdGEgeWFuZyBiZW5hciwgZGFuIHZhcmlhbnMgeWFuZyBzYW5nYXQgbWlyaXAuIEtpdGEganVnYSBtZW1hc3Rpa2FuIGJhaHdhIGRpc3RyaWJ1c2kgZW1waXJpcyBiZXJzaWZhdCBub3JtYWwuIFVudHVrIG1lbGFrdWthbm55YSwga2l0YSBtZW1idWF0IHBsb3QgaGlzdG9ncmFtIGRhcmkgYGJldGFfMV9oYXRzYCwgZGFuIG1lbmFtYmFoa2FuIGt1cnZhIHVudHVrIGRpc3RyaWJ1c2kgeWFuZyBiZW5hciBkYXJpICRcaGF0IM6yXzEkLiBLaXRhIG1lbmdndW5ha2FuIGBwcm9iID0gVFJVRWAgdW50dWsgbWVuYXJ1aCBoaXN0b2dyYW1ueWEgZGkgc2thbGEgeWFuZyBzYW1hIGRlbmdhbiBrdXJ2YSBub3JtYWwuDQoNCmBgYHtyfQ0KIyBub3RlIG5lZWQgdG8gdXNlIHByb2IgPSBUUlVFDQpoaXN0KGJldGFfMV9oYXRzLCBwcm9iID0gVFJVRSwgYnJlYWtzID0gMjAsIA0KICAgICB4bGFiID0gZXhwcmVzc2lvbihoYXQoYmV0YSlbMV0pLCBtYWluID0gIiIsIGJvcmRlciA9ICJkb2RnZXJibHVlIikNCmN1cnZlKGRub3JtKHgsIG1lYW4gPSBiZXRhXzEsIHNkID0gc3FydCh2YXJfYmV0YV8xX2hhdCkpLCANCiAgICAgIGNvbCA9ICJkYXJrb3JhbmdlIiwgYWRkID0gVFJVRSwgbHdkID0gMykNCmBgYA0KDQpMYWx1IGtpdGEgbWVuZ3VsYW5nIHByb3NlcyBkYXJpICRcaGF0IM6yXzAkDQoNCmBgYHtyfQ0KbWVhbihiZXRhXzBfaGF0cykgIyBlbXBpcmljYWwgbWVhbg0KYGBgDQpgYGB7cn0NCmJldGFfMCAgICAgICAgICAgICMgdHJ1ZSBtZWFuDQpgYGANCmBgYHtyfQ0KdmFyKGJldGFfMF9oYXRzKSAgIyBlbXBpcmljYWwgdmFyaWFuY2UNCmBgYA0KYGBge3J9DQp2YXJfYmV0YV8wX2hhdCAgICAjIHRydWUgdmFyaWFuY2UNCmBgYA0KYGBge3J9DQpoaXN0KGJldGFfMF9oYXRzLCBwcm9iID0gVFJVRSwgYnJlYWtzID0gMjUsIA0KICAgICB4bGFiID0gZXhwcmVzc2lvbihoYXQoYmV0YSlbMF0pLCBtYWluID0gIiIsIGJvcmRlciA9ICJkb2RnZXJibHVlIikNCmN1cnZlKGRub3JtKHgsIG1lYW4gPSBiZXRhXzAsIHNkID0gc3FydCh2YXJfYmV0YV8wX2hhdCkpLA0KICAgICAgY29sID0gImRhcmtvcmFuZ2UiLCBhZGQgPSBUUlVFLCBsd2QgPSAzKQ0KYGBgDQoNCkRpIHNpbXVsYXNpIGJlbGFqYXIgaW5pLCBraXRhIGhhbnlhIG1lbnNpbXVsYXNpa2FuIGp1bWxhaCBzYW1wZWwgeWFuZyB0ZXJiYXRhcy4gVW50dWsgYmVuYXItYmVuYXIgbWVtYXN0aWthbiBoYXNpbCBkaXN0cmlidXNpbnlhLCBraXRhIGhhcnVzIG1lbmdhbWF0aSBqdW1sYWggc2FtcGVsIHlhbmhnIHRpZGFrIHRlcmJhdGFzLiBOYW11biwgcGxvdCBpbmkgaGFydXMgbWVuamVsYXNrYW4gYmFod2EgamlrYSBraXRhIG1lbGFuanV0a2FuIG1lbGFrdWthbiBzaW11bGFzaW55YSwgaGFzaWwgZW1waXJpc255YSBha2FuIG1lbmRla2F0aSBhcGEgeWFuZyBraXRhIGhhcmFwa2FuLiAgDQoNCmBgYHtyfQ0KcGFyKG1hciA9IGMoNSwgNSwgMSwgMSkpICMgYWRqdXN0ZWQgcGxvdCBtYXJnaW5zLCBvdGhlcndpc2UgdGhlICJoYXQiIGRvZXMgbm90IGRpc3BsYXkNCnBsb3QoY3Vtc3VtKGJldGFfMV9oYXRzKSAvICgxOmxlbmd0aChiZXRhXzFfaGF0cykpLCB0eXBlID0gImwiLCB5bGltID0gYyg1Ljk1LCA2LjA1KSwNCiAgICAgeGxhYiA9ICJOdW1iZXIgb2YgU2ltdWxhdGlvbnMiLA0KICAgICB5bGFiID0gZXhwcmVzc2lvbigiRW1waXJpY2FsIE1lYW4gb2YgIiB+IGhhdChiZXRhKVsxXSksDQogICAgIGNvbCAgPSAiZG9kZ2VyYmx1ZSIpDQphYmxpbmUoaCA9IDYsIGNvbCA9ICJkYXJrb3JhbmdlIiwgbHdkID0gMikNCmBgYA0KYGBge3J9DQpwYXIobWFyID0gYyg1LCA1LCAxLCAxKSkgIyBhZGp1c3RlZCBwbG90IG1hcmdpbnMsIG90aGVyd2lzZSB0aGUgImhhdCIgZG9lcyBub3QgZGlzcGxheQ0KcGxvdChjdW1zdW0oYmV0YV8wX2hhdHMpIC8gKDE6bGVuZ3RoKGJldGFfMF9oYXRzKSksIHR5cGUgPSAibCIsIHlsaW0gPSBjKDIuOTUsIDMuMDUpLA0KICAgICB4bGFiID0gIk51bWJlciBvZiBTaW11bGF0aW9ucyIsDQogICAgIHlsYWIgPSBleHByZXNzaW9uKCJFbXBpcmljYWwgTWVhbiBvZiAiIH4gaGF0KGJldGEpWzBdKSwNCiAgICAgY29sICA9ICJkb2RnZXJibHVlIikNCmFibGluZShoID0gMywgY29sID0gImRhcmtvcmFuZ2UiLCBsd2QgPSAyKQ0KYGBgDQoNCiMjIFN0YW5kYXIgS2VzYWxhaGFuDQoNCkphZGkgc2VrYXJhbmcga2l0YSBwZXJjYXlhIGJhaHdhIGhhc2lsIGRhcmkgZHVhIGRpc3RyaWJ1c2ksDQoNCiQkXGhhdCDOsl8wIOKIvCBOICjOsl8wLM+DXjIoXGZyYWMgezF9e259K1xmcmFjIHtcYmFyIHheMn17U3t4eH19KSkkJA0KJCRcaGF0IM6yXzEg4oi8IE4ozrJfMSxcZnJhYyB7z4NeMn17U3t4eH19KS4kJA0KDQpMYWx1IGRlbmdhbiBtZW55ZWRlcmhhbmFrYW4gaGFzaWwgaW5pLCBraXRhIG1lbmVtdWthbiBiYWh3YQ0KDQokJFxmcmFjIHtcaGF0IM6yXzAgLSDOsl8wfXtTRFtcaGF0IM6yXzBdfSDiiLwgTigwLDEpJCQNCg0KZGFuDQokJFxmcmFjIHtcaGF0IM6yXzEgLSDOsl8xfXtTRFtcaGF0IM6yXzFdfSDiiLwgTigwLDEpJCQNCmRpbWFuYQ0KJCRTRFtcaGF0IM6yXzBdID0gz4MgXHNxcnQge1xmcmFjIHsxfXtufSArIFxmcmFjIHtcYmFyIHheMn17U3t4eH19fSQkDQpkYW4NCiQkU0RbXGhhdCDOsl8xXSA9IFxmcmFjIHvPg317XHNxcnQge1N7eHh9fX0uJCQNCg0KU2VqYWsga2l0YSB0aWRhayB0YXUgbmlsYWkgz4MgZGkgbGF0aWhhbiBraXRhLCBraXRhIGFrYW4gbWVtcGVya2lyYWthbiBpdHUgbWVuZ2d1bmFrYW4gJHNfZSQsIHlhbmcgbWFuYSBraXRhIGh1YnVuZ2thbiBrZSBla3NwcmVzaSBraXRhIHlhbmcgYWRhIHVudHVrIHN0YW5kYXIgZGV2aWFzaSBkYXJpIGVzdGltYXNpIGtpdGEuDQoNCktlZHVhIGVrc3ByZXNpIGJhcnUgaW5pIGRpcGFuZ2dpbCAqKnN0YW5kYXIgZXJyb3JzKiogYXRhdSBrZXNhbGFoYW4geWFuZyBtZXJ1cGFrYW4gcGVya2lyYWFuIGRhcmkgc3RhbmRhciBkZXZpYXNpIHVudHVrICBkaXN0cmlidXNpIHNhbXBsaW5nbnlhLg0KDQokJFNFW1xoYXQgzrJfMF0gPSBzX2UgXHNxcnQge1xmcmFjIHsxfXtufStcZnJhYyB7XGJhciB4XjJ9e1N7eHh9fX0kJA0KJCRTRVtcaGF0IM6yXzFdID0gXGZyYWMge3NfZX17XHNxcnR7U3t4eH19fSQkDQoNClNla2FyYW5nIGppa2Ega2l0YSBtZW1iYWdpa2FuIGRlbmdhbiBzdGFuZGFyIGVycm9ybnlhLCBhbGloLWFsaWggc3RhbmRhciBkZXZpYXNpbnlhLCBraXRhIG1lbmRhcGF0a2FuIGhhc2lsIGRpbWFuYSBha2FuIG1lbXVuZ2tpbmthbiBraXRhIHVudHVrIG1lbWJ1YXQgaW50ZXJ2YWwga2VwZXJjYXlhYW4gZGFuIG1lbnVuanVra2FuIHBlbmd1amlhbiBoaXBvdGVzaXMuDQoNCiQkXGZyYWMge1xoYXQgzrJfMCAtIM6yXzB9e1NFW1xoYXQgzrJfMF19IOKIvCB0X3tuLTJ9JCQNCg0KVW50dWsgbWVsaWhhdCBpbmksIHBlcnRhbWEga2l0YSBwZXJoYXRpa2FuIGJhaHdhLA0KDQokJFxmcmFjIHtSU1N9e8+DXjJ9ID0gXGZyYWMgeyhuLTIpc19lXjJ9e8+DXjJ9IOKIvCDPh197bi0yfV4yJCQNCg0KSnVnYSBtZW1hbmdnaWwgdWxhbmcgdmFyaWFiZWwgYWNhayAkVCQgZGVuZ2FuLA0KDQokJFQgPSBcZnJhYyB7Wn17XHNxcnQge1xmcmFjIHvPh19kXjJ9e2R9fX0kJA0KDQptZW5naWt1dGkgZGlzdHJpYnVzaSAkdCQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuICRkJCwgZGltYW5hICTPh19kXjIkIGFkYWxhaCAkz4deMiQgdmFyaWFiZWwgYWNhayBkYXJpIGRlcmFqYXQga2ViZWJhc2FuICRkJC4NCg0KS2l0YSBtZW51bGlzLA0KJCRUIOKIvCB0X2QkJA0KDQp1bnR1ayAgbWVuZ2F0YWthbiBiYWh3YSB2YXJpYWJlbCBhY2FrICRUJCBtZW5naWt1dGkgZGlzdHJpYnVzaSAkdCQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuICRkJC4NCg0KTGFsdSBraXRhIG1lbmdndW5ha2FuIHRyaWsga2xhc2lrIHVudHVrICJtZW5na2FsaWthbiBkZW5nYW4gMSIgZGFuIGJlYmVyYXBhIGF0dXJhbiB1bGFuZyB1bnR1ayBzYW1wYWkga2UNCg0KJCQgXGZyYWMge1xoYXQgzrJfMSAtzrJfMX17U0Vbe1xoYXQgzrJfMV19fSA9IFxmcmFjIHtcaGF0IM6yXzEgLc6yXzF9e3NfZS8gXHNxcnR7U197eHh9fX0kJA0KJCQ9IFxmcmFjIHtcaGF0IM6yXzEgLc6yXzF9e3NfZS8gXHNxcnR7U197eHh9fX0gLiBcZnJhYyB7z4MvXHNxcnR7U197eHh9fX17z4MvXHNxcnR7U197eHh9fX0kJA0KJCQ9XGZyYWMge1xoYXQgzrJfMSAtzrJfMX17U0RbXGhhdCDOsl8xXX0gLyBcc3FydCB7XGZyYWMge1xmcmFjIHsobi0yKXNfZV4yfXvPg14yfX17bi0yfX0g4oi8IFxmcmFjIHtafXtcc3FydCBcZnJhY3vPh197bi0yfV4yfXtuLTJ9fSDiiLwgdF97bi0yfSQkDQoNCmRpbWFuYSAkWuKIvE4oMCwxKSQNCg0KSW5nYXRsYWgga2VtYmFsaSBiYWh3YSBkaXN0cmlidXNpICR0JCBtaXJpcCBkZW5nYW4gc3RhbmRhciBub3JtYWwsIHRhcGkgbWVtaWxpa2kgZWtvciB5YW5nIGxlYmloIGJlcmF0LiBEZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4geWFuZyBzZW1ha2luIG1lbmluZ2thdCwgZGlzdHJpYnVzaSAkdCQgbWVuamFkaSBsZWJpaCBkYW4gbGViaWggc2VwZXJ0aSBzdGFuZGFyIG5vcm1hbC4gRGliYXdhaCBpbmksIGtpdGEgbWVtcGxvdGthbiBkaXN0cmlidXNpIHN0YW5kYXIgbm9ybWFsIHNlYmFnYWkgZHVhIGNvbnRvaCBkYXJpIGRpc3RyaWJ1c2kgJHQkIGRlbmdhbiBkZXJhamF0IGtlYmViYXNhbiB5YW5nIGJlcmJlZGEuIEtldGFodWlsYWggYmFnYWltYW5hIGRpc3RyaWJ1c2kgJHQkIGRlbmdhbiBkZXJhamF0IGtlYmViYXNhbiB5YW5nIGxlYmloIGJlc2FyIHRlcnNlYnV0IGxlYmloIG1pcmlwIGRlbmdhbiBrdXJ2YSBzdGFuZGFyIG5vcm1hbC4gDQoNCmBgYHtyfQ0KIyBkZWZpbmUgZ3JpZCBvZiB4IHZhbHVlcw0KeCA9IHNlcSgtNCwgNCwgbGVuZ3RoID0gMTAwKQ0KDQojIHBsb3QgY3VydmUgZm9yIHN0YW5kYXJkIG5vcm1hbA0KcGxvdCh4LCBkbm9ybSh4KSwgdHlwZSA9ICJsIiwgbHR5ID0gMSwgbHdkID0gMiwNCiAgICAgeGxhYiA9ICJ4IiwgeWxhYiA9ICJEZW5zaXR5IiwgbWFpbiA9ICJOb3JtYWwgdnMgdCBEaXN0cmlidXRpb25zIikNCiMgYWRkIGN1cnZlcyBmb3IgdCBkaXN0cmlidXRpb25zDQpsaW5lcyh4LCBkdCh4LCBkZiA9IDEpLCBsdHkgPSAzLCBsd2QgPSAyLCBjb2wgPSAiZGFya29yYW5nZSIpDQpsaW5lcyh4LCBkdCh4LCBkZiA9IDEwKSwgbHR5ID0gMiwgbHdkID0gMiwgY29sID0gImRvZGdlcmJsdWUiKQ0KDQojIGFkZCBsZWdlbmQNCmxlZ2VuZCgidG9wcmlnaHQiLCB0aXRsZSA9ICJEaXN0cmlidXRpb25zIiwNCiAgICAgICBsZWdlbmQgPSBjKCJ0LCBkZiA9IDEiLCAidCwgZGYgPSAxMCIsICJTdGFuZGFyZCBOb3JtYWwiKSwgDQogICAgICAgbHdkID0gMiwgbHR5ID0gYygzLCAyLCAxKSwgY29sID0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImJsYWNrIikpDQpgYGANCg0KIyMgSW50ZXJ2YWwgS2V5YWtpbmFuIHVudHVrIFNsb3BlIGFuZCBJbnRlcmNlcHQNCg0KTWVuZ3VsYW5nIGtlbWJhbGkgYmFod2EgaW50ZXJ2YWwga2V5YWtpbmFuIHVudHVrIHJhdGEtcmF0YSBzZXJpbmcgZGlhbWJpbCBkYWxhbSBiZW50dWs6DQokJEVTVCDCsSBDUklU4ouFU0UkJA0KYXRhdQ0KJCRFU1QgwrEgTUFSR0lOJCQNCg0KZGltYW5hIEVTVCBhZGFsYWggcGVya2lyYWFuIHVudHVrIHBhcmFtZXRlciB5YW5nIGRpaW5naW5rYW4sIFNFIGFkYWxhaCBzdGFuZGFyIGtlc2FsYWhhbiB1bnR1ayBzdWF0dSBwZXJraXJhYW4sIGRhbiAkTUFSR0lOID0gQ1JJVOKLhVNFJC4NCg0KTGFsdSwgdW50dWsgJM6yXzAkIGRhbiAkzrJfMSQga2l0YSBkYXBhdCBtZW1idWF0IGludGVydmFsIGtlcGVyY2F5YW55YSBkZW5nYW4gbWVuZ2d1bmFrYW4NCg0KJCRcaGF0zrJfMCDCsSB0X3vOsS8yLG4tMn0g4ouFIFNFW1xoYXTOsl8wXSQkICAgDQokJFxoYXTOsl8wIMKxIHRfe86xLzIsbi0yfSDii4VzX2Vcc3FydHtcZnJhYyB7MX17bn0gKyBcZnJhYyB7eF4yfXtTe3h4fX19JCQNCmRhbg0KJCRcaGF0zrJfMSDCsSB0X3vOsS8yLG4tMn0g4ouFIFNFW1xoYXTOsl8xXSQkDQokJFxoYXTOsl8wIMKxIHRfe86xLzIsbi0yfSDii4VcZnJhYyB7c19lfXtcc3FydCB7U197eHh9fX0kJA0KDQpkaW1hbmEgJCB0X3vOsS8yLG4tMn0kIGFkYWxhaCBuaWxhaSBrcml0aXMgZGVtaWtpYW4ganVnYSAkUCh0X3tuLTJ9ID4gdF97zrEvMixuLTJ9KSA9IM6xLzIkLg0KDQojIyBVamkgSGlwb3Rlc2lzDQoNCiJLaXRhIGJpc2EgYmVyYmljYXJhIHRlbnRhbmcgaGlwb3Rlc2lzIGluaSBzZWJhZ2FpICdgbnVsbCBoeXBvdGhlc2lzYCcgYXRhdSBoaXBvdGVzaXMgbm9sLCBkYW4gcGVybHUgZGljYXRhdCBiYWh3YSBoaXBvdGVzaXMgbm9sIHRpZGFrIHBlcm5haCBkaWJ1a3Rpa2FuIGF0YXUgZGl0ZXRhcGthbiwgdGV0YXBpIG11bmdraW4gZGlzYW5na2FsLCBzZWxhbWEgZWtzcGVyaW1lbi4iIC0gKipSb25hbGQgQXlsbWVyIEZpc2hlcioqDQoNCk1lbmdpbmF0IGtlbWJhbGkgYmFod2EgdWppIHN0YXRpc3RpayAkKFRTKSQgdW50dWsgbWVuZ3VqaSByYXRhLXJhdGEgc2VyaW5nIGRpYW1iaWwgZGVuZ2FuIGJlbnR1azoNCg0KJCRUUyA9IFxmcmFjIHtFU1QgLSBIWVB9e1NFfSQkDQoNCmRpbWFuYSBFU1QgYWRhbGFoIHBlcmtpcmFhbiB1bnR1ayBwYXJhbWV0ZXIgeWFuZyBkaWluZ2lua2FuLCBIWVAgYWRhbGFoIG5pbGFpIGhpcG90ZXNpcyB1bnR1ayBwYXJhbWV0ZXJueWEsIGRhbiBTRSBhZGFsYWggc3RhbmRhciBrZXNhbGFoYW4gdW50dWsgcGVya2lyYWFubnlhLg0KDQpKYWRpLCB1bnR1ayBwZW5ndWppYW4NCg0KJCRIXzAgOiDOsl8wID0gzrJfezAwfSB2cyBIXzEgOiDOsl8wIOKJoCDOsl97MDB9JCQNCg0Ka2l0YSBtZW5nZ3VuYWthbiB1amkgc3RhdGlzdGlrDQoNCiQkdCA9IFxmcmFjIHtcaGF0IM6yXzAgLSDOsl97MDB9fXtTRVtcaGF0IM6yXzBdfSA9IFxmcmFjIHtcaGF0IM6yXzAgLSDOsl97MDB9fXtzX2UgXHNxcnR7XGZyYWMgezF9e259ICsgXGZyYWN7XGJhciB4XjJ9e1N7eHh9fX19JCQNCg0KZGltYW5hLCBkaWJhd2FoIGhpcG90ZXNpcyBub2wsIG1lbmdpa3V0aSBkaXN0cmlidXNpICR0JCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4gJG4tMiQuIEtpdGEgbWVuZ2d1bmFrYW4gJM6yX3swMH0kICB1bnR1ayBtZW5jYXJpIHRhdSBuaWxhaSBoaXBvdGVzaXMgdW50dWsgJM6yXzAkLg0KDQpCZWdpdHVwdWxhLCB1bnR1ayBwZW5ndWppYW4NCg0KJCRIXzAgOiDOsl8xID0gzrJfezEwfSQkIHZzICQkSF8xIDogzrJfMSDiiaAgzrJfezEwfSQkDQoNCmtpdGEgbWVuZ2d1bmFrYW4gdWppIHN0YXRpc3Rpaw0KDQokJHQgPSBcZnJhYyB7XGhhdCDOsl8xIC0gzrJfezEwfX17U0VbXGhhdCDOsl8xXX0gPSBcZnJhYyB7XGhhdCDOsl8xIC0gzrJfezEwfX17c19lIC8gXHNxcnQge1N7eHh9fX0kJA0KDQpkaW1hbmEgbGFnaSwgZGliYXdhaCBoaXBvdGVzaXMgbm9sLCBtZW5naWt1dGkgZGlzdHJpYnVzaSAkdCQgZGVuZ2FuIGRlcmFqYXQga2ViZWJhc2FuICRuLTIkLiBLaXRhIHNla2FyYW5nIG1lbmdndW5ha2FuICTOsl97MTB9JCB1bnR1ayBtZW5lbnR1a2FuIG5pbGFpIGhpcG90ZXNpcyB1bnR1ayAkzrJfMSQNCg0KIyMgQ29udG9oIGBjYXJzYA0KDQpLaXRhIHNla2FyYW5nIGtlbWJhbGkga2UgY29udG9oIGBjYXJzYCBkYXJpIHNla3NpIHNlYmVsdW1ueWEgdW50dWsgbWVuZ2lsdXN0cmFzaWthbiBrb25zZXAgaW5pLiBQZXJ0YW1hIGtpdGEgbWVuZ2VwYXNrYW4gZGVuZ2FuIG1lbmdndW5ha2FuIG1vZGVsIGBsbSgpYCBsYWx1IG1lbmdndW5ha2FuIGBzdW1tYXJ5KClgIHVudHVrIG1lbGloYXQgaGFzaWwgZGVuZ2FuIHJpbmNpYW4geWFuZyBsZWJpaCBoZWJhdC4NCg0KYGBge3J9DQpzdG9wX2Rpc3RfbW9kZWwgPSBsbShkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzKQ0Kc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpDQpgYGANCg0KIyMjIFRlcyBkaSBgUmANCg0KS2l0YSBzZWthcmFuZyBha2FuIG1lbmRpc2t1c2lrYW4gdGVudGFuZyBoYXNpbCB5YW5nIGRpdGFtcGlsa2FuIHlhbmcgZGlwYW5nZ2lsIGBDb2VmZmljaWVudHNgLiBQZXJ0YW1hLCBtZW5ndWxhbmcgbGFnaSBiYWh3YSBraXRhIGRhcGF0IG1lbmctZWtzdHJhayBpbmZvcm1hc2kgaW5pIHNlY2FyYSBsYW5nc3VuZy4NCg0KYGBge3J9DQpuYW1lcyhzdW1tYXJ5KHN0b3BfZGlzdF9tb2RlbCkpDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpJGNvZWZmaWNpZW50cw0KYGBgDQpGdW5nc2kgZGFyaSBgbmFtZXMoKWAgbWVtYmVyaXRhaHVrYW4ga2VwYWRhIGtpdGEgaW5mb3JtYXNpIGFwYSB5YW5nIHNlZGFuZyBhZGEsIGRhbiBsYWx1IGtpdGEgbWVuZ2d1bmFhbiBvcGVyYXRvciBgJGAgZGFuIGBjb2VmZmljaWVudHNgIHVudHVrIG1lbmctZWtzdHJhayBpbmZvcm1hc2kgeWFuZyBzdWRhaCBraXRhIGluZ2lrYW4uIER1YSBuaWxhaSBpbmkgaGFydXMgc2FsaW5nIGRpa2VuYWwuDQoNCiQkXGhhdM6yXzAgPSAtMTcuNTc5MDk0OSQkDQpkYW4NCiQkXGhhdM6yXzEgPSAzLjkzMjQwODgkJA0KDQpkaW1hbmEgbWVydXBha2FuIHBlcmtpcmFhbiBraXRhIHVudHVrIG1vZGVsIHBhcmFtZXRlciAkzrJfMCQgZGFuICTOsl8xJC4NClNla2FyYW5nIGF5byBmb2t1cyBkaSBiYXJpcyBrZWR1YSBkYXJpIGRhdGEgeWFuZyBrZWx1YXIsIGRpbWFuYSBiZXJodWJ1bmdhbiBkZW5nYW4gJM6yXzEkLg0KDQpgYGB7cn0NCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHNbMixdDQpgYGANCg0KTGFnaSwganVtbGFoIG5pbGFpIHBlcnRhbWEsIGBFc3RpbWF0ZWAgYWRhbGFoIA0KDQokJCBcaGF0IM6yXzEgPSAzLjkzMjQwODgkJA0KDQpOaWxhaSBrZWR1YSwgYFN0ZC5FcnJvcmAsIGFkYWxhaCBuaWxhaSBzdGFuZGFyIGtlc2FsYWhhbiBkYXJpICRcaGF0zrJfMSQsDQoNCiQkU0VbXGhhdM6yXzFdID0gXGZyYWMge3NfZX17XHNxcnQge1N7eHh9fX0gPSAwLjQxNTUxMjguJCQNCg0KTmlsYWkga2V0aWdhLCBgdCB2YWx1ZWAsIGFkYWxhaCBuaWxhaSBkYXJpdWppIHN0YXRpc3RpayB1bnR1ayBwZW5ndWppYW4gJEhfMCA6IM6yXzEgPSAwIHZzIEhfMSA6IM6yXzEg4omgIDAkLA0KDQokJHQgPSBcZnJhYyB7XGhhdCDOsl8xIC0gMH17U0VbXGhhdCDOsl8xXX0gPSBcZnJhYyB7XGhhdCDOsl8xIC0gMH17c19lIC8gXHNxcnQge1N7eHh9fX0gPSA5LjQ2Mzk5LiQkDQoNClRlcmFraGlyLCBgUHIoPnx0fClgLCBtZW1iZXJpa2FuIGtpdGEgbmlsYWkgcCBkYXJpIHBlbmd1amlhbiB0ZXJzZWJ1dC4NCg0KJCRwLXZhbHVlID0gMS40ODk4MzY1IMOXIDEwXnstMTJ9JCQNCg0KQ2F0YXQgZGlzaW5pLCBraXRhIHNlY2FyYSBraHVzdXMgbWVuZ3VqaSBpeWEgYXRhdSB0aWRha255YSAkzrJfMSA9IDAkLg0KDQpCYXJpcyBwZXJ0YW1hIGRhcmkgbGFwb3JhbiBkYXRhIGtlbHVhciBuaWxhaW55YSBzYW1hLCB0ZXRhcGkgdW50dWsgJM6yXzAkLg0KDQpgYGB7cn0NCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHNbMSxdDQpgYGANCg0KRGFsYW0gcGVuamVsYXNhbiwga29kZSBiZXJpa3VzIG1lbnlpbXBhbiBpbmZvcm1hc2kgZGFyaSBgc3VtbWFyeShzdG9wX2Rpc3RfbW9kZWwpJGNvZWZmaWNpZW50c2AgZGkgdmFyaWFiZWwgYmFydSBgc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb2AsIGxhbHUgZWtzdHJhayBzZXRpYXAgZWxlbWVuIG1lbmphZGkgdmFyaWFiZWwgYmFydSB5YW5nIG1lbmRlc2tyaXBzaWthbiBpbmZvcm1hc2kgeWFuZyBkaWthbmR1bmdueWEuDQoNCmBgYHtyfQ0Kc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mbyA9IHN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHMNCg0KYmV0YV8wX2hhdCAgICAgID0gc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb1sxLCAxXSAjIEVzdGltYXRlDQpiZXRhXzBfaGF0X3NlICAgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzEsIDJdICMgU3RkLiBFcnJvcg0KYmV0YV8wX2hhdF90ICAgID0gc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb1sxLCAzXSAjIHQgdmFsdWUNCmJldGFfMF9oYXRfcHZhbCA9IHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9bMSwgNF0gIyBQcig+fHR8KQ0KDQpiZXRhXzFfaGF0ICAgICAgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzIsIDFdICMgRXN0aW1hdGUNCmJldGFfMV9oYXRfc2UgICA9IHN0b3BfZGlzdF9tb2RlbF90ZXN0X2luZm9bMiwgMl0gIyBTdGQuIEVycm9yDQpiZXRhXzFfaGF0X3QgICAgPSBzdG9wX2Rpc3RfbW9kZWxfdGVzdF9pbmZvWzIsIDNdICMgdCB2YWx1ZQ0KYmV0YV8xX2hhdF9wdmFsID0gc3RvcF9kaXN0X21vZGVsX3Rlc3RfaW5mb1syLCA0XSAjIFByKD58dHwpDQpgYGANCg0KS2l0YSBkYXBhdCBtZW1hc3Rpa2FuIGJlYmVyYXBhIGVrc3ByZXNpIGVrdWl2YWxlbjogdWppICR0JCBzdGF0aXN0aWsgdW50dWsgJFxoYXQgzrJfMSQgZGFuIGtlZHVhIHNpc2kgZGFyaSBuaWxhaSBwIHRlcmthaXQgZGVuZ2FuIHVqaSBzdGF0aXN0aWsgdGVyc2VidXQuDQoNCmBgYHtyfQ0KKGJldGFfMV9oYXQgLSAwKSAvIGJldGFfMV9oYXRfc2UNCmBgYA0KYGBge3J9DQpiZXRhXzFfaGF0X3QNCmBgYA0KYGBge3J9DQoyICogcHQoYWJzKGJldGFfMV9oYXRfdCksIGRmID0gbGVuZ3RoKHJlc2lkKHN0b3BfZGlzdF9tb2RlbCkpIC0gMiwgbG93ZXIudGFpbCA9IEZBTFNFKQ0KYGBgDQpgYGB7cn0NCmJldGFfMV9oYXRfcHZhbA0KYGBgDQoNCiMjIyBVamktdCwgU2lnbmlmaWthbnNpIFJlZ3Jlc2kNCg0KS2l0YSBiZXJoZW50aSB1bnR1ayBiZXJkaXNrdXNpIHRlbnRhbmcgIHBlbnRpbmdueWEgdWppIHJlZ3Jlc2kuIFBlcnRhbWEsIHBlcmhhdGlrYW4gYmFod2EgYmVyZGFzYXJrYW4gZGFyaSBoYXNpbCBkaXN0cmlidXNpIGRpYXRhcywga2l0YSBkYXBhdCBtZW5ndWppICTOsl8wJCBkYW4gJM6yXzEkIHRlcmhhZGFwIG5pbGFpIGFwYXB1biwgZGFuIG1lbnVuanVra2FuIHBlbmd1amlhbiB1bnR1ayBzYXR1IGRhbiBkdWEgc2lzaS4NCg0KTmFtdW4sIHNhdHUgdWppIHlhbmcgcGFsaW5nIHNwZXNpZmlrLA0KDQokJEhfMCA6zrJfMSA9IDAkJCAgdnMgICQkSF8xIDogzrJfMSDiiaAgMCQkDQp5YW5nIHNhbmdhdCBzZXJpbmcgZGlndW5ha2FuLiBBeW8gYmVyZmlraXIgdGVudGFuZyBwZW5ndWppYW4gaW5pIGRpZGFsYW0gbW9kZWwgcmVncmVzaSBsaW5lYXIgc2VkZXJoYW5hLA0KDQokJCBZX2kgPSDOsl8wICsgzrJfMXhfaSArIM+1X2kkJC4NCg0KSmlrYSBraXRhIG1lbmdhc3Vtc2lrYW4gaGlwb3Rlc2lzIG5vbG55YSBhZGFsYWggYmVuYXIsIG1ha2EgJM6yXzEgPTAkIGRhbiBraXRhIG1lbWlsaWtpIG1vZGVsLA0KDQokJFlfaSA9IM6yXzAgKyDPtV9pJCQuDQoNCkRpbW9kZWwgaW5pLCByZXNwb25ueWEgdGlkYWsgYmVyZGFzYXJrYW4gcHJlZGlrdG9ybnlhLiBKYWRpIGtpdGEgZGFwYXQgYmVyZmlraXQgYmFod3MgdWppIGluaSBtZW5naWt1dGkgamFsYW4sDQoNCiAgfiBEaWJhd2FoICRIXzAkIHRpZGFrIHRlcmRhcGF0IGh1YnVuZ2FuIGxpbmllciB5YW5nIHNpZ25pZmlrYW4gZGlhbnRhcmEgJHgkIGRhbiAkeSQuDQogIH4gRGliYXdhaCAkSF8xJCB0ZXJkYXBhdCBodWJ1bmdhbiBgbGluZWFyYCB5YW5nIHNpZ25pZmlrYW4gZGlhbnRhcmEgJHgkIGRhbiAkeSQuDQoNClVudHVrIGNvbnRvaCBgY2Fyc2AsDQogIH4gRGliYXdhaCAkSF8wJCB0aWRhayB0ZXJkYXBhdCBodWJ1bmdhbiAgIGxpbmllciB5YW5nIHNpZ25pZmlrYW4gZGlhbnRhcmEgJHgkIGRhbiAkeSQuDQogIH4gRGliYXdhaCAkSF8xJCB0ZXJkYXBhdCBodWJ1bmdhbiBgbGluZWFyYCB5YW5nIHNpZ25pZmlrYW4gZGlhbnRhcmEga2VjZXBhdGFuIGRhbiBqYXJhayBiZXJoZW50aS4NCg0KTGFnaSwgdWppIGl0dSBkaWxpaGF0IHBhZGEga2VsdWFyYW4gZGFyaSBgc3VtbWFyeSgpYCwNCg0KJCRwLXZhbHVlID0gMS40ODk4MzY1IMOXIDEwXnstMTJ9JCQuDQoNCkRlbmdhbiBuaWxhaSBwIHlhbmcgc2FuZ2F0IHJlbmRhaCwga2l0YSBtZW5vbGFrIGhpcG90ZXNpcyBub2wgdGluZ2thdGFuICTOsSQgZGVuZ2FuIGFsYXNhbiBhcGFwdW4sIGthdGFrYW5sYWggdW50dWsgY29udG9oLCAkzrEgPSAwLjAxJC4gSmFkaSBraXRhIG1lbmdhdGFrYW4gYmFod2EgYWRhIGh1YnVuZ2FuIGBsaW5lYXJgIHlhbmcgc2lnbmlmaWthbiBkaWFudGFyYSBrZWNlcGF0YW4gZGFuIGphcmFrIGJlcmhlbnRpLiBQZXJoYXRpa2FuIGJhaHdhIGtpdGEgbWVuZWthbmthbiBgbGluZWFyYG55YS4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiRDovU2VtNS9Db21wdXRhdGlvbi9VVFMvZ2FtYmFyMS5qcGciKQ0KYGBgDQoNCkRpIHBsb3QgaW5pIHlhbmcgbWVuc2ltdWxhc2lrYW4gZGF0YSwga2l0YSBkYXBhdCBtZWxpaGF0IHNlY2FyYSBqZWxhcyBodWJ1bmdhbiBkaWFudGFyYSAkeCQgZGFuICR5JCwgbGFnaXB1bGEgaW5pIGJ1a2FubGFoIGh1YnVuZ2FuIGxpbmVhci4gSmlrYSBraXRhIG1lbmNvY29ra2FuIGdhcmlzIHRlcmhhZGFwIGRhdGEgaW5pLCBha2FuIG1lbmphZGkgc2FuZ2F0IGRhdGFyLiBIYXNpbCBkYXJpIHBlbmd1amlhbiB1bnR1ayAkSF8wIDogzrJfMSA9IDAkIG1lbGF3YW4gJEhfMSA6IM6yXzEg4omgIDAkIG1lbWJlcmlrYW4gbmlsYWkgcCB5YW5nIGJlc2FyLCBkaWthc3VzIGluaSBzZWJlc2FlIDAsNzU2NDU0OCwgamFkaSBraXRhIGFrYW4gZ2FnYWwgdW50dWsgbWVub2xhayBkYW4gbWVuZ2F0YWthbiBiYWh3YSBkaXNhbmEgdGlkYWsgYWRhIGh1YnVuZ2FuIGxpbmVhciB5YW5nIHNpZ25pZmlrYW4gZGlhbnRhcmEgJHgkIGRhbiAkeSQuIE5hbnRpIGtpdGEgYWthbiBtZWxpaGF0IGJhZ2FpbWFuYSBjYXJhbnlhIHVudHVrIG1lbmNvY29rYW4ga3VydmEgdGVyaGFkYXAgZGF0YSBpbmkgbWVuZ2d1bmFrYW4gbW9kZWwgImxpbmVhciIsIHRhcGkgdW50dWsgc2VrYXJhbmcsIHNhZGFyaSBiYWh3YSB1amkgJEhfMCA6IM6yXzEgPSAwJCBtZWxhd2FuICRIXzEgOiDOsl8xIOKJoCAwJCBoYW55YSBkYXBhdCBtZW5kZXRla3NpIGh1YnVuZ2FuIGdhcmlzIGx1cnVzbnlhIHNhamEuDQoNCiMjIyBJbnRlcnZhbCBLZXlha2luYW4gZGkgYFJgDQoNCkRlbmdhbiBtZW5nZ3VuYWthbiBgUmAsIGtpdGEgYmlzYSBtZW5jYXJpIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrICTOsl8wJCBkYW4gJM6yXzEkIGRlbmdhbiBzYW5nYXQgbXVkYWguDQoNCmBgYHtyfQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSkNCmBgYA0KDQpJbmkgb3RvbWF0aXMgbWVuZ2hpdHVuZyBkZW5nYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gc2ViZXNhciA5OSUgdW50dWsga2VkdWEgJM6yXzAkIGRhbiAkzrJfMSQsIGJhcmlzIHBlcnRhbWEgdW50dWsgJM6yXzAkLCBiYXJpcyBrZWR1YSB1bnR1ayAkzrJfMSQuDQoNClVudHVrIGNvbnRvaCBgY2Fyc2AgZGlzYWF0IG1lbmFmc2lya2FuIGludGVydmFsIGluaSwga2l0YSBrYXRha2FuLCBraXRhIHBlcmNheWEgYmFod2EgOTklIHVudHVrIGtlY2VwYXRhbiAxIG1pbCBwZXIgamFtIHlhbmcgbWVuaW5na2F0LCBwZW5pbmdrYXRhbiByYXRhLXJhdGEgamFyYWsgYmVyaGVudGkgYWRhbGFoIGRpYW50YXJhIDIuODE3OTE4NyBkYW4gNS4wNDY4OTg4IGtha2ksIGRpbWFuYSBtZXJ1cGFrYW4gaW50ZXJ2YWwgdW50dWsgJM6yXzEkLg0KDQpQZXJoYXRpa2FuIGJhaHdhIDk5JSBpbnRlcnZhbCBrZXBlcmNheWFhbiBpbmkgdGlkYWsgbWVuZ2FuZHVuZyBuaWxhaSBoaXBvdGVzaXMgMC4gU2VqYWsgaXR1IHRpZGFrIG1lbmdhbmR1bmcgMCwgaW5pIHNldGFyYSBkZW5nYW4gbWVub2xhayB1amkgJEhfMCA6IM6yXzEgPSAwJCBtZWxhd2FuICRIXzEgOiDOsl8xIOKJoCAwJCBkaSAkzrEgPSAwLjAxJCwgZGltYW5hIGtpdGEgc3VkYWggbWVsaWhhdCBpdHUgc2ViZWx1bW55YS4NCg0KS2FtdSBoYXJ1cyBzZWRpa2l0IGN1cmlnYSBrZXBhZGEgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgJM6yXzAkLCBzZWphayBpdHUgbWVuY2FrdXAgbmlsYWkgbmVnYXRpZiwgeWFuZyBzZXN1YWkgZGVuZ2FuIGphcmFrIGJlcmhlbnRpIG5lZ2F0aWYuIFNlY2FyYSB0ZWtuaXMsIGludGVycHJldGFzaW55YSBhZGFsYWgga2l0YSBwZXJjYXlhIGJhaHdhIDk5JSBqYXJhayBiZXJoZW50aSBwYWRhIHN1YXR1IG1vYmlsIHlhbmcgbWVuZW1wdWggamFyYWsgMCBtaWwgcGVyamFtIGJlcmFkYSBkaWFudGFyYSAtMzUuNzA2NjEwMyBkYW4gMC41NDg0MjA1IGtha2ksIHRldGFwaSBraXRhIHRpZGFrIHNhbmdhdCBtZW1wZXJjYXlhaSBpdHUsIHNlamFrIGtpdGEgc2FuZ2F0IHlha2luIGJhaHdhIGl0dSBha2FuIG1lbmphZGkgbm9uLW5lZ2F0aWYuDQoNCkNhdGF0YW4sIGtpdGEgZGFwYXQgbWVuZy1la3N0cmFrIG5pbGFpIHNwZXNpZmlrIGRhcmkga2VsdWFyYW4gaW5pIGRlbmdhbiBiZWJlcmFwYSBjYXJhLiBLb2RlIGluaSB0aWRhayBiZXJqYWxhbiwgZGFuIHNlYmFnYWkgZ2FudGlueWEsIGthbXUgaGFydXMgbWVuZ2VjZWsgYmFnYWltYW5hIGl0dSBiaXNhIGJlcmh1YnVuZ2FuIGRlbmdhbiBrZWx1YXJhbiBkaWF0YXMuDQoNCmBgYHtyfQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMSxdDQpjb25maW50KHN0b3BfZGlzdF9tb2RlbCwgbGV2ZWwgPSAwLjk5KVsxLCAxXQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMSwgMl0NCmNvbmZpbnQoc3RvcF9kaXN0X21vZGVsLCBwYXJtID0gIihJbnRlcmNlcHQpIiwgbGV2ZWwgPSAwLjk5KQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMixdDQpjb25maW50KHN0b3BfZGlzdF9tb2RlbCwgbGV2ZWwgPSAwLjk5KVsyLCAxXQ0KY29uZmludChzdG9wX2Rpc3RfbW9kZWwsIGxldmVsID0gMC45OSlbMiwgMl0NCmNvbmZpbnQoc3RvcF9kaXN0X21vZGVsLCBwYXJtID0gInNwZWVkIiwgbGV2ZWwgPSAwLjk5KQ0KYGBgDQoNCktpdGEganVnYSBkYXBhdCBtZW1hc3Rpa2FuIGJhaHdhIHBlcmhpdHVuZ2FuIGRhcmkgYFJgIHRlbGFoIG1lbnVuanVra2FuIGludGVydmFsIHVudHVrICTOsl8xJA0KDQpgYGB7cn0NCiMgc3RvcmUgZXN0aW1hdGUNCmJldGFfMV9oYXQgPSBjb2VmKHN0b3BfZGlzdF9tb2RlbClbMl0NCg0KIyBzdG9yZSBzdGFuZGFyZCBlcnJvcg0KYmV0YV8xX2hhdF9zZSA9IHN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKSRjb2VmZmljaWVudHNbMiwgMl0NCg0KIyBjYWxjdWxhdGUgY3JpdGljYWwgdmFsdWUgZm9yIHR3by1zaWRlZCA5OSUgQ0kNCmNyaXQgPSBxdCgwLjk5NSwgZGYgPSBsZW5ndGgocmVzaWQoc3RvcF9kaXN0X21vZGVsKSkgLSAyKQ0KDQojIGVzdCAtIG1hcmdpbiwgZXN0ICsgbWFyZ2luDQpjKGJldGFfMV9oYXQgLSBjcml0ICogYmV0YV8xX2hhdF9zZSwgYmV0YV8xX2hhdCArIGNyaXQgKiBiZXRhXzFfaGF0X3NlKQ0KYGBgDQoNCiMjIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIFJlc3BvbiBSYXRhLXJhdGENCg0KU2VsYWluIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrICTOsl8wJCBkYW4gJM6yXzEkLCB0ZXJkYXBhdCBkdWEgZXN0aW1hc2kgaW50ZXJ2YWwgdW11bSBsYWlubnlhIHlhbmcgZGlndW5ha2FuIGRlbmdhbiByZWdyZXNpLiBZYW5nIHBlcnRhbWEgZGlwYW5nZ2lsIGBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgbWVhbiByZXNwb25zZWAuIFNlcmluZ2thbGksIGtpdGEgYWthbiBtZW1wZXJraXJha2FuIGludGVydmFsIHVudHVrIHJhdGEtcmF0YSwgJEVbWSB8IFggPSB4XSQgdW50dWsgbmlsYWkgdGVydGVudHUgZGFyaSAkeCQuDQoNCkRpIHNpdHVhc2kgaW5pIGtpdGEgbWVuZ2d1bmFrYW4gJFxoYXQgeSh4KSQgc2ViYWdhaSBlc3RpbWFzaSBraXRhIGRhcmkgJEVbWSB8IFggPSB4XSQuIEtpdGEgbWVtb2RpZmlrYXNpa2FuIHNlZGlraXQgbm90YXNpIGtpdGEgdW50dWsgbWVtYnVhdG55YSBqZWxhcyBiYWh3YSBuaWxhaSBwcmVkaWtzaSBhZGFsYWggZnVuZ3NpIGRhcmkgbmlsYWkgJHgkLg0KDQokJFxoYXQgeSh4KSA9IFxoYXQgzrJfMCArIFxoYXQgzrJfMSB4JCQNCg0KVWxhbmdpIGxhZ2kgYmFod2EsDQoNCiQkRVtZIHwgWCA9IHhdID0gIM6yXzAgKyDOsl8xIHguJCQNCg0KSmFkaSwgJFxoYXQgeSh4KSQgbWVydXBha2FuIGVzdGltYXNpIHlhbmcgYmFndXMgc2VqYWsgaXR1IHRpZGFrIGJpYXM6DQoNCiQkRVtcaGF0IHkoeCldID0gIM6yXzAgKyDOsl8xIHguJCQNCg0KS2l0YSBiaXNhIG1lbmRhcGF0a2FuLA0KDQokJFZhcltcaGF0IHkoeCldID0gz4NeMiAoXGZyYWMgezF9e259ID0gXGZyYWMgeyh4LXgpXjJ9e1N7eHh9fSkuJCQNCg0KU2VwZXJ0aSBlc3RpbWFzaSBsYWluIHlhbmcgdGVsYWgga2l0YSBsaWhhdCwgJFxoYXQgeSh4KSQganVnYSBtZW5naWt1dGkgZGlzdHJpYnVzaSBub3JtYWwuIFNlamFrICTOsl8wJCBkYW4gJM6yXzEkIG1lcnVwYWthbiBrb21iaW5hc2kgbGluZWFyIGRhcmkgdmFyaWFiZWwgYWNhayBub3JtYWwsIGJlZ2l0dXB1bGEgZGVuZ2FuICRcaGF0IHkoeCkkLg0KDQokJFxoYXQgeSh4KSDiiLwgTiAozrJfMCArIM6yXzF4LM+DXjIoXGZyYWN7MX17bn0gKyBcZnJhYyB7KHgteCleMn17U3t4eH19KSkuJCQNCg0KRGFuIHRlcmFraGlyLCBzZWphayBraXRhIGJ1dHVoIHVudHVrIG1lbmdlc3RpbWFzaSB2YXJpYW5zIGluaSwga2l0YSBzYW1wYWkgcGFkYSBwYWRhIHN0YW5kYXIga2VzYWxhaGFuIGRhcmkgZXN0aW1hc2kga2l0YSwNCg0KJCRTRVtcaGF0IHkoeCldID0gc19lIFxzcXJ0IHtcZnJhYyB7MX17bn0gKyBcZnJhYyB7KHgtXGJhciB4KX17U3t4eH19fSQkDQoNCkxhbHUga2l0YSBkYXBhdCBtZW5nZ3VuYWthbiBpbmkgdW50dWsgbWVuY2FyaSBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayByZXNwb24gcmF0YS1yYXRhbnlhLA0KDQokJFxoYXQgeSh4KSDCsSB0X3vOsS8yLG4tMn0g4ouFIHNfZSBcc3FydCB7XGZyYWMgezF9e259ICsgXGZyYWMgeyh4LVxiYXIgeCleMn17U3t4eH19IH0kJA0KDQpVbnR1ayBtZW5jYXJpIHRhdSBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayByZXNwb24gcmF0YS1yYXRhIG1lbmdndW5ha2FuIGBSYCwga2l0YSBtZW5nZ3VuYWthbiBmdW5nc2kgYHByZWRpY3QoKWAuIEtpdGEgbWVtYmVyaWthbiBmdW5nc2kgdGVyc2VidXQgbW9kZWwga2Vjb2Nva2thbiBraXRhIHNlYmFnYWkgZGF0YSBiYXJ1LCBtZW55aW1wYW5ueWEgc2ViYWdhaSBiaW5na2FpIGRhdGEuIChJbmkgcGVudGluZywgbWFrYSBgUmAgZGlrZXRhaHVpIHNlYmFnYWkgbmFtYSBkYXJpIHZhcmlhYmVsIHByZWRpa3Rvci4pIERpc2luaSwga2l0YSBtZW5lbXVrYW4gaW50ZXJ2YSBsa2VwZXJjYXlhYW4gdW50dWsgcmF0YS1yYXRhIGphcmFrIGJlcmhlbnRpIGRpc2FhdCBzZWJ1YWggbW9iaWwgbWVsYWp1IDUgbWlsIHBlcmphbSBkYW4gZGlzYWF0IHNlYnVhaCBtb2JpbCBtZWxhanUgMjEgbWlsIHBlcmphbS4NCg0KYGBge3J9DQpuZXdfc3BlZWRzID0gZGF0YS5mcmFtZShzcGVlZCA9IGMoNSwgMjEpKQ0KcHJlZGljdChzdG9wX2Rpc3RfbW9kZWwsIG5ld2RhdGEgPSBuZXdfc3BlZWRzLCANCiAgICAgICAgaW50ZXJ2YWwgPSBjKCJjb25maWRlbmNlIiksIGxldmVsID0gMC45OSkNCmBgYA0KDQojIyBQcmVkaWtzaSBJbnRlcnZhbCB1bnR1ayBPYnNlcnZhc2kgQmFydQ0KDQpUZXJrYWRhbmcga2l0YSBpbmdpbiBtZW5nLWVzdGltYXNpa2FuIGludGVydmFsIHlhbmcgYmFydSwgJFkkLCB1bnR1ayBuaWxhaSB0ZXJ0ZW50dSBkYXJpICR4JC4gSW5pIHNhbmdhdCBtaXJpcCBkZW5nYW4gaW50ZXJ2YWwgcmVzcG9uIHJhdGEtcmF0YSwgJEVbWSB8IFggPSB4XSQsIHRhcGkgYmVyYmVkYSBkaSBzYXR1IGhhbCB5YW5nIHNhbmdhdCBwZW50aW5nLg0KDQpUZWJha2FuIHRlcmJhaWsga2l0YSB1bnR1ayBvYnNlcnZhc2kgeWFuZyBiYXJ1IG1hc2loIHRldGFwICRcaGF0IHkoeCkkLiBFc3RpbWFzaSByYXRhLXJhdGEgbWFzaWggdGV0YXAgcHJlZGlrc2kgdGVyYmFpayB5YW5nIGJpc2Ega2l0YSBidWF0LiBQZXJiZWRhYW55YSB0ZXJkYXBhdCBwYWRhIGp1bWxhaCB2YXJpYWJpbGl0YXNueWEuIEtpdGEgdGFodSBiYWh3YSBvYnNlcnZhc2kgaXR1IGFrYW4gYmVydmFyaWFzaSB0ZW50YW5nIGdhcmlzIHJlZ3Jlc2kgeWFuZyBzZWJlbmFybnlhIG1lbnVydXQgZGlzdHJpYnVzaSAkTigwLM+DXjIpJC4gS2FyZW5hIGluaSBraXRhIG1lbmFtYmFoa2FuIGJlYmVyYXBhIGZha3RvciBkYXJpICTPg14yJCB1bnR1ayBlc3RpbWFzaSB2YXJpYWJpbGl0YXMga2l0YSBkZW5nYW4gdHVqdWFuIHVudHVrIG1lbmplbGFza2FuIHZhcmlhYmlsaXRhcyBkYXJpIG9ic2VydmFzaSB0ZW50YW5nIGdhcmlzIHJlZ3Jlc2kuDQoNCiQkVmFyW1xoYXQgeSh4KSvPtV09IFZhcltcaGF0IHkoeCldK1ZhciBbz7VdJCQNCiQkPSDPg14yIChcZnJhY3sxfXtufStcZnJhYyB7KHgtXGJhciB4KV4yfXtTe3h4fX0pICsgz4NeMiAkJA0KJCQgPSDPg14yICgxICtcZnJhY3sxfXtufStcZnJhYyB7KHgtXGJhciB4KV4yfXtTe3h4fX0pJCQNCiQkXGhhdCB5KHgpICsgz7Ug4oi8IE4gKM6yXzAgKyDOsl8xeCzPg14yKDEgK1xmcmFjezF9e259K1xmcmFjIHsoeC1cYmFyIHgpXjJ9e1N7eHh9fSkpJCQNCiQkU0VbXGhhdCB5KHgpK8+1XSA9IHNfZSBcc3FydCB7MSArXGZyYWN7MX17bn0rXGZyYWMgeyh4LVxiYXIgeCleMn17U3t4eH19fSQkDQoNCkxhbHUga2l0YSBkYXBhdCBtZW5lbXVrYW4gaW50ZXJ2YWwgcHJlZGlrc2kgbWVuZ2d1bmFrYW4sDQoNCiQkXGhhdCB5KHgpIMKxIHRfe86xLzIsbi0yfSDii4Ugc19lXHNxcnR7MSArXGZyYWN7MX17bn0rXGZyYWMgeyh4LVxiYXIgeCleMn17U3t4eH19fS4kJA0KVW50dWsgbWVuZ2hpdHVuZyBpbmkgdW50dWsga3VtcHVsYW4gcG9pbiBkaSBgUmAsIGtldGFodWlsYWggYmFod2EgaGFueWEgYWRhIHNlZGlraXQgcGVydWJhaGFuIGRpZGFsYW0gc2ludGFrcyBkYXJpIHBlbmVtdWFuIGludGVydmFsIGtlcGVyY2F5YWFuIHVudHVrIHJlc3BvbiByYXRhLXJhdGEuDQoNCmBgYHtyfQ0KcHJlZGljdChzdG9wX2Rpc3RfbW9kZWwsIG5ld2RhdGEgPSBuZXdfc3BlZWRzLCANCiAgICAgICAgaW50ZXJ2YWwgPSBjKCJwcmVkaWN0aW9uIiksIGxldmVsID0gMC45OSkNCmBgYA0KDQpKdWdhIGtldGFodWlsYWggYmFod2EgZHVhIGludGVydmFsIGluaSBsZWJpaCBsZWJhciBkaWJhbmRpbmcgaW50ZXJ2YWwga2VwZXJjYXlhYW4geWFuZyBzZXN1YWkgdW50dWsgcmVzcG9uIHJhdGEtcmF0YS4NCg0KIyMgS2V5YWtpbmFuIGRhbiBCYW5kIFByZWRpa3NpDQoNClNlcmluZ2thbGkga2l0YSBha2FuIG1lbXBsb3Qga2VkdWEgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdW50dWsgcmVzcG9uIHJhdGEtcmF0YSBkYW4gaW50ZXJ2YWwgcHJlZGlrc2kgdW50dWsgc2VtdWEga2VtdW5na2luYW4gZGFyaSBuaWxhaSAkeCQuIEtpdGEgbWVtYW5nZ2lsIGluaSBzZWJhZ2FpIGtlcGVyY2F5YWFuIGRhbiBiYW5kIHByZWRpa3NpLg0KDQpgYGB7cn0NCnNwZWVkX2dyaWQgPSBzZXEobWluKGNhcnMkc3BlZWQpLCBtYXgoY2FycyRzcGVlZCksIGJ5ID0gMC4wMSkNCmRpc3RfY2lfYmFuZCA9IHByZWRpY3Qoc3RvcF9kaXN0X21vZGVsLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoc3BlZWQgPSBzcGVlZF9ncmlkKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gImNvbmZpZGVuY2UiLCBsZXZlbCA9IDAuOTkpDQpkaXN0X3BpX2JhbmQgPSBwcmVkaWN0KHN0b3BfZGlzdF9tb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBkYXRhLmZyYW1lKHNwZWVkID0gc3BlZWRfZ3JpZCksIA0KICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9ICJwcmVkaWN0aW9uIiwgbGV2ZWwgPSAwLjk5KSANCg0KcGxvdChkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzLA0KICAgICB4bGFiID0gIlNwZWVkIChpbiBNaWxlcyBQZXIgSG91cikiLA0KICAgICB5bGFiID0gIlN0b3BwaW5nIERpc3RhbmNlIChpbiBGZWV0KSIsDQogICAgIG1haW4gPSAiU3RvcHBpbmcgRGlzdGFuY2UgdnMgU3BlZWQiLA0KICAgICBwY2ggID0gMjAsDQogICAgIGNleCAgPSAyLA0KICAgICBjb2wgID0gImdyZXkiLA0KICAgICB5bGltID0gYyhtaW4oZGlzdF9waV9iYW5kKSwgbWF4KGRpc3RfcGlfYmFuZCkpKQ0KYWJsaW5lKHN0b3BfZGlzdF9tb2RlbCwgbHdkID0gNSwgY29sID0gImRhcmtvcmFuZ2UiKQ0KDQpsaW5lcyhzcGVlZF9ncmlkLCBkaXN0X2NpX2JhbmRbLCJsd3IiXSwgY29sID0gImRvZGdlcmJsdWUiLCBsd2QgPSAzLCBsdHkgPSAyKQ0KbGluZXMoc3BlZWRfZ3JpZCwgZGlzdF9jaV9iYW5kWywidXByIl0sIGNvbCA9ICJkb2RnZXJibHVlIiwgbHdkID0gMywgbHR5ID0gMikNCmxpbmVzKHNwZWVkX2dyaWQsIGRpc3RfcGlfYmFuZFssImx3ciJdLCBjb2wgPSAiZG9kZ2VyYmx1ZSIsIGx3ZCA9IDMsIGx0eSA9IDMpDQpsaW5lcyhzcGVlZF9ncmlkLCBkaXN0X3BpX2JhbmRbLCJ1cHIiXSwgY29sID0gImRvZGdlcmJsdWUiLCBsd2QgPSAzLCBsdHkgPSAzKQ0KcG9pbnRzKG1lYW4oY2FycyRzcGVlZCksIG1lYW4oY2FycyRkaXN0KSwgcGNoID0gIisiLCBjZXggPSAzKQ0KYGBgDQoNCkJlYmVyYXBhIGhhbCB5YW5nIHBlcmx1IGRpcGVyaGF0aWthbjoNCiAgfktpdGEgbWVuZ2d1bmFrYW4gYXJndW1lbiBgeWxpbWAgdW50dWsgbWVsb25nZ2Fya2FuIHN1bWJ1IHkgZGFyaSBwbG90IHRlcnNlYnV0LCBzZWphayBiYW5kbnlhIGxlYmloIGphdWggZGFyaXBhZGEgdGl0aWsgeWFuZyBhZGEuDQogIH5LaXRhIG1lbmFtYmFoa2FuIHBvaW4gZGkgcG9pbiAkKHgsXGJhciB5KSQNCiAgICBJbmkgbWVydXBha2FuIHNlYnVhaCB0aXRpayBkaW1hbmEgZ2FyaXMgcmVncmVzaW55YSBha2FuIHNlbGFsdSBtZWxld2F0aW55YS4gKFBpa2lya2FuIGtlbmFwYSBiaXNhIHRlcmphZGkuKQ0KICAgIEluaSBhZGFsYWggdGl0aWsgZGltYW5hIGtlZHVhIGtlcGVyY2F5YWFuIGRhbiBiYW5kIHByZWRpa3NpIG1lbmphZGkgeWFuZyB0ZXJzZW1waXQuIExpaGF0bGFoIGtlcGFkYSBzdGFuZGFyIGtlc2FsYWhhbm55YSBkYXJpIGtlZHVhbnlhIHVudHVrIG1lbmdldGFodWkga2VuYXBhIGl0dSBiaXNhIHRlcmphZGkuDQoNCiMjIFVqaSBGLCBTaWduaWZpa2Fuc2kgUmVncmVzaQ0KDQpLYXN1cyBkYXJpIHJlZ3Jlc2kgbGluZWFyIHNlZGVyaGFuYSwgdWppICR0JCB1bnR1ayBzaWduaWZpa2FzaSByZWdyZXNpIG1lcnVwYWthbiBuaWxhaSBlcXVpdmFsZW50IHVudHVrIHVqaSBsYWlubnlhLCB5YWl0dSB1amkgJEYkIHVudHVrIHNpZ25pZmlrYW5zaSByZWdyZXNpLiBFcXVpdmFsZW50IGluaSBoYW55YSBha2FuIG1lbmphZGkgYmVuYXIgdW50dWsgcmVncmVzaSBsaW5lYXIgc2VkZXJoYW5hLCBkYW4gZGkgc2Vrc2kgc2VsYW5qdXRueWEga2l0YSBoYW55YSBha2FuIG1lbmdndW5ha2FuIHVqaSAkRiQgdW50dWsgc2lnbmlmaWthbnNpIHJlZ3Jlc2lueWEuDQoNCkluZ2F0bGFoIGtlbWJhbGkgZGkgc2Vrc2kgdGVyYWtoaXIgZGFyaSBkZWtvbXBvc2lzaSB2YXJpYW5zIHlhbmcga2l0YSBsaWhhdCBzZWJlbHVtIG1lbmdoaXR1bmcgbmlsYWkgYCRSXjIkLCANCg0KJCQg4oiRX3tpPTF9Xm4gKCB5X2kgLSBcYmFyIHkpXjIgPSDiiJFfe2ktMX1ebiAoeV9pIC0gXGJhciB5X2kpXjIgKyDiiJFfe2k9MX1ebiAoXGhhdCB5X2kgLSBcYmFyIHkpXjIsICQkDQoNCmF0YXUsIGxlYmloIHNpbmdrYXRueWEsDQoNCiQkU1NUID0gU1NFICsgU1NSZWcuJCQNCg0KVW50dWsgbWVuZ2VtYmFuZ2thbiB1amkgJEYkLCBraXRhIGFrYW4gbWVuZ2F0dXIgbGFnaSBpbmZvcm1hc2kgaW5pIGRpIHRhYmVsIGBBTk9WQWAsDQoNCmBgYHtyfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkQ6L1NlbTUvQ29tcHV0YXRpb24vVVRTL2dhbWJhcjIuanBnIikNCmBgYA0KDQpBTk9WQSBhdGF1IGFuYWxpc2lzIGRhcmkgdmFyaWFucyBha2FuIG1lbmphZGkgc2VidWFoIGtvbnNlcCB5YW5nIHNlcmluZyBraXRhIGJhaGFzIGRhbGFtIGtlbGFzIGluaS4NClVudHVrIHNla2FyYW5nLCBraXRhIGFrYW4gZm9rdXMga2VwYWRhIGhhc2lsLWhhc2lsIGRpZGFsYW0gdGFiZWwsIGRpbWFuYSAkRiQgc3RhdGlzdGlrbnlhLA0KDQokJFxmcmFjIHviiJFfe2k9MX1ebiAoIHlfaSAtIFxiYXIgeSleMi8xfXviiJFfe2k9MX1ebiAoIHlfaSAtIFxoYXQgeV9pKV4yLyhuLTIpfSDiiLwgRl97MSxuLTJ9JCQNCg0KZGltYW5hIG1lbmdpa3V0aSBkaXN0cmlidXNpICRGJCBkZW5nYW4gZGVyYWphdCBrZWJlYmFzYW4gMSBkYW4gJG4tMiQgZGliYXdhaCBoaXBvdGVzaXMgbm9sLiBTZWJ1YWggZGlzdHJpYnVzaSAkRiQgYWRhbGFoIGRpc3RyaWJ1c2kga29udGludSB5YW5nIGhhbnlhIG1lbmdhbWJpbCBuaWxhaSBwb3NpdGlmIGRhbiBtZW1wdW55YWkgZHVhIHBhcmFtZXRlciwgeWFuZyBtZXJ1cGFrYW4gZHVhIGRlcmFqYXQga2ViZWJhc2FuLg0KDQpJbmdhdGxhaCBrZW1iYWxpLCBkaWRhbGFtIHNpZ25pZmlrYW5zaSBkYXJpIHVqaSByZWdyZXNpLCAkWSQgYHRpZGFrYCBiZXJnYW50dW5nIGtlcGFkYSAkeCQgZGkgaGlwb3Rlc2lzIG5vbC4NCg0KJCRIXzAgOiDOsl8xID0gMCQkICQkIFlfaSA9IM6yXzAgKyDPtV9pJCQNCg0KRGlzYWF0IGFsdGVybmF0aWYgZGFyaSBoaXBvdGVzaXMgJFkkIGJlcmdhbnR1bmcga2VwYWRhICR4JC4NCg0KJCRIXzAgOiDOsl8xIOKJoCAwJCQgJCQgWV9pID0gzrJfMXhfaSArIM+1X2kkJA0KDQpLaXRhIGRhcGF0IG1lbmdndW5ha2FuICRGJCBzdGF0aXN0aWsgdW50dWsgbWVudW5qdWtrYW4gcGVuZ3VqaWFuIGluaS4NCg0KJCRGID0gXGZyYWMge+KIkV97aT0xfV5uIChcaGF0IHlfaSAtIFxiYXIgeSleMi8xfXviiJFfe2k9MX1ebiAoIHlfaSAtIFxoYXQgeV9pKV4yLyhuLTIpfSQkDQoNClNlY2FyYSBraHVzdXMsIGtpdGEgYWthbiBtZW5vbGFrIGhpcG90ZWlzIG5vbG55YSBkaXNhYXQgbmlsYWkgJEYkIHN0YXRpc3Rpa255YSBiZXNhciwgaXR1IGRpYSwgZGlzYWF0IGFkYSBwcm9iYWJpbGl0YXMgcmVuZGFoIGJhaHdhIHBlbmdhbWF0YW4gc2VjYXJhIGtlYmV0dWxhbiwgZGFwYXQgYmVyYXNhbCBkYXJpIG1vZGVsIGhpcG90ZXNpcyBub2wuIEtpdGEgYWthbiBtZW1iaWFya2FuIGBSYCBtZW5naGl0dW5nIG5pbGFpIHAgdW50dWsga2l0YS4NCg0KVU50dWsgbWVudW5qdWtrYW4gdWppICRGJCBkaSBgUmAsIGFuZGEgZGFwYXQgbWVsaWhhdCBkaSBiYXJpcyB0ZXJha2hpciBkYXJpIGRhdGEgeWFuZyBrZWx1YXIgZGFyaSBgc3VtbWFyeSgpYCB5YW5nIGRpcGFuZ2dpbCBgRi1zdGF0aXN0aWNgIHlhbmcgbWVtYmVyaWthbiBuaWxhaSBkYXJpIHVqaSBzdGF0aXN0aWssIG5pbGFpIGRlcmFqYXQga2ViZWJhc2FuIHlhbmcgcmVsZXZhbiwganVnYSBuaWxhaSBwIGRhcmkgcGVuZ3VqaWFuIHRlcnNlYnV0Lg0KDQpgYGB7cn0NCnN1bW1hcnkoc3RvcF9kaXN0X21vZGVsKQ0KYGBgDQoNClNlbGFpbiBpdHUsIGFuZGEgZGFwYXQgbWVuZ2d1bmFrYW4gZnVuZ3NpIGBhbm92YSgpYCB1bnR1ayBtZW5hbXBpbGthbiBpbmZvcm1hc2kgZGFyaSB0YWJlbCBBTk9WQS4NCg0KYGBge3J9DQphbm92YShzdG9wX2Rpc3RfbW9kZWwpDQpgYGANCg0KSW5pIGp1Z2EgbWVtYmVyaWthbiBuaWxhaSBwIGRhcmkgc3VhdHUgcGVuZ3VqaWFuLiBBbmRhIGhhcnVzIG1lbXBlcmhhdGlrYW4gYmFod2EgbmlsYWkgcCBkYXJpIHVqaSAkdCQgaXR1IHNhbWEuIEFuZGEganVnYSBtdW5na2luIHNhZGFyIGJhaHdhIG5pbGFpIGRhcmkgdWppIHN0YXRpc3RpayBkYXJpIHVqaSAkdCQsIDkuNDYzOTksIGJpc2EgZGkga3VhZHJhdGthbiB1bnR1ayBtZW5kYXBhdGthbiBuaWxhaSBkYXJpICRGJCBzdGF0aXN0aWssIDg5LjU2NzEwNjUuDQoNClBlcmhhdGlrYW4gYmFod2EgYWRhIGJlYmVyYXBhIGphbGFubGFpbiB5YW5nIHNhbWEgeWFuZyBkYXBhdCBkaWxha3VrYW4gZGkgYFJgLCB5YW5nIHNlcmluZyBraXRhIGxvaGF0IHVudHVrIG1lbWJhbmRpbmdrYW4gZHVhIG1vZGVsLg0KDQpgYGB7cn0NCmFub3ZhKGxtKGRpc3QgfiAxLCBkYXRhID0gY2FycyksIGxtKGRpc3QgfiBzcGVlZCwgZGF0YSA9IGNhcnMpKQ0KYGBgDQoNClBlcm55YXRhYW4gbW9kZWwgYGxtKGRpc3QgfiAxLCBkYXRhID0gY2FycylgIG1lbmVyYXBrYW4gbW9kZWwgJFlfaSA9IM6yXzAgKyDPtV9pJCBrZXBhZGEgZGF0YSBgY2Fyc2AuIFBlcmhhdGlrYW4gYmFod2EgJFxoYXQgeSA9IFxiYXIgeSQgZGlzYWF0ICRZX2kgPSAgzrJfMCArIM+1X2kkLg0KDQpQZXJueWF0YWFuIG1vZGVsIGBsbShkaXN0IH4gc3BlZWQsIGRhdGEgPSBjYXJzKWAgbWVuZXJhcGthbiBtb2RlbCAkWV9pID0gzrJfMCArIM6yXzF4X2kgKyDPtV9pJC4NCg0KTGFsdSBraXRhIGRhcGF0IG1lbWlraXJrYW4ga2VndW5hYW4gZGFyaSAgYGFub3ZhKClgIHNlYmFnYWkgcGVyYmFuZGluZ2FuIHNlY2FyYSBsYW5nc3VuZyBkYXJpIGR1YSBtb2RlbC4NCihQZXJoYXRpa2FuIGJhaHdhIGtpdGEgbWVuZGFwYXRrYW4gbGFnaSBuaWxhaSBwIHlhbmcgc2FtYS4pDQoNCg0KDQoNCg0KDQoNCg==