Oleh : Purwoko Haryadi Santoso
Prodi : Penelitian dan Evaluasi Pendidikan
Mata kuliah : Teori Tes

1. Menetapkan direktori kerja

dir = "D:/DOCUMENTS/Kuliah Strata-3/2. Kuliah Semester 1/7. Teori Tes (Kam, 15.35)/analisis IRT politomus"
setwd(dir)

2. Import packages yang akan digunakan untuk bekerja

Terdapat 6 library yang akan digunakan dalam pekerjaan ini. Urutannya mewakili daftar pekerjaan yang akan dilaksanakan yaitu deskripsi data, analisis EFA, analisis CFA, estimasi reliabilitas, diakhiri melalui pemodelan IRT dengan graded response model (GRM).

library(psych)
library(corrplot)
corrplot 0.92 loaded
library(sirt)
- sirt 3.11-21 (2021-12-09 11:21:10)
library(lavaan)
This is lavaan 0.6-10
lavaan is FREE software! Please report any bugs.

Attaching package: ‘lavaan’

The following object is masked from ‘package:psych’:

    cor2cov
library(semPlot)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(mirt)
Loading required package: stats4
Loading required package: lattice

3. Input data dan deskripsi data

Data diambil dari disertasi Haeruddin (2020) prodi S3 Ilmu Pendidikan UNY yang berjudul “Perilaku Metakognisi dalam Memecahkan Masalah Fisika Berdasarkan Gaya Berpikir pada Mahasiswa Universitas Tadulako”. Data yang dianalisis dalam tugas ini merupakan 10 butir kuesioner perilaku metakognisi Haeruddin (2020) yang aslinya mengandung 40 butir kuesioner. Kesepuluh butir kuesioner yang dianalisis pada tugas ini mengukur 2 aspek metakognisi dalam pemecahan masalah fisika yaitu pengetahuan deklaratif (1-6) dan pengetahuan prosedural (7-10). Berdasarkan data yang disajikan, kuesioner metakognisi menggunakan Likert 4 skala.Butir pernyataan kuesioner 1-10 adalah sebagai berikut :
PENGETAHUAN DEKLARATIF

  1. Saya tidak menyadari kemampuan yang saya miliki dalam menyelesaikan masalah kinematika (B1)
  2. Saya menyadari kelemahan yang saya miliki dalam menyelesaikan masalah kinematika (B2)
  3. Saya tidak perlu mengetahui cara yang pernah digunakan sebelumnya dalam menyelesaikan masalah kinematika (B3)
  4. Saya menyadari informasi penting yang diperlukan dalam menyelesaikan masalah kinematika (B4)
  5. Saya tidak menghirukan keberhasilan dalam menyelesaikan masalah kinematika (B5)
  6. Saya peduli terhadap satuan dalam menyelesaikan masalah kinematika (B6)

PENGETAHUAN PROSEDURAL

  1. Saya tidak menyadari terdapat strategi tertentu yang digunakan dalam menyelesaikan masalah kinematika (B7)
  2. Saya menyadari tujuan menggunakan strategi tertentu dalam menyelesaikan masalah kinematika (B8)
  3. Saya tidak menyadari bagaimana cara mudah memahami masalah kinematika (B9)
  4. Saya menggunakan strategi penyelesaian masalah kinematika yang telah saya gunakan sebelumnya (B10)
data <- read.table('(processed) Perilaku Metakognisi Menyelesaikan Masalah Fisika.txt', header = T)
head(data)
dim(data)
[1] 664  10

Hasil ini menunjukkan bahwa data kita terdiri dari 664 baris (responden) dan 10 kolom (butir kuesioner).

str(data)
'data.frame':   664 obs. of  10 variables:
 $ B1 : int  3 2 4 2 4 4 4 2 3 3 ...
 $ B2 : int  2 2 2 1 3 4 3 1 2 3 ...
 $ B3 : int  3 2 3 2 4 3 4 2 3 2 ...
 $ B4 : int  2 3 3 3 3 3 3 4 3 2 ...
 $ B5 : int  4 3 1 1 3 4 3 3 3 3 ...
 $ B6 : int  3 3 3 3 3 3 4 3 3 2 ...
 $ B7 : int  4 3 3 2 4 3 3 3 3 3 ...
 $ B8 : int  3 2 2 3 3 4 4 2 3 3 ...
 $ B9 : int  3 3 3 1 2 3 3 3 3 2 ...
 $ B10: int  2 2 4 2 3 4 3 2 3 2 ...

Output ini digunakan untuk mendeskripsikan tipe data dan observasi apakah ada data missing atau tidak. Tampak pada hasil, terdapat 664 observasi pada 10 variabel (butir kuesioner).

describe(data)

Output di atas merupakan deskripsi data yang bisa kita gunakan untuk memahami rata-rata, mean, missing data, normalitas data dengan melihat skew dan kurtosis, dan lain-lain.

apply(data, 2, table)
   B1  B2  B3  B4  B5  B6  B7  B8  B9 B10
1  16  23  26   9  22  22  30  17  32  32
2 141 159 190  51 146 183 185 135 215 178
3 388 380 365 341 374 346 367 374 371 363
4 119 102  83 263 122 113  82 138  46  91

Output distribusi respon peserta (1, 2, 3, 4) dalam setiap butir soal. Tabel juga menginformasikan apakah ada butir-butir yang memiliki respon yang sama sekali tidak ada yang memilih ?

4. Validitas konstruk melalui Exploratory Factor Analysis (EFA)

A. Memeriksa korelasi antar butir

corrplot(cor(data), method="number")

Analisis korelasi antar butir dengan visualisasi heatmap. Semakin “biru” atau “merah” artinya semakin memiliki korelasi. Biru berarti korelasi positif. Merah berarti korelasi negatif. Dapat dilihat bahwa terdapat 1 butir yang tidak memiliki korelasi dengan butir lainnya yaitu butir 4 (B4) yang seharusnya B4 berkorelasi dengan butir-butir lainnya dalam aspek PENGETAHUAN DEKLARATIF. Korelasi bisa menjadi indikator awal terbentuknya faktor di dalam data. Jika terdapat butir yang tidak memiliki korelasi dengan butir satu pun, dimungkinkan butir ini tidak bisa membentuk faktor dengan butir lainnya dalam setiap aspek dalam kuesioner.

B. Menilai kecukupan sampel dengan Kaiser-Mayer-Olkin Measure of Sampling Adequacy

KMO(data)
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = data)
Overall MSA =  0.76
MSA for each item = 
  B1   B2   B3   B4   B5   B6   B7   B8   B9  B10 
0.75 0.78 0.82 0.61 0.77 0.73 0.78 0.80 0.75 0.74 

Berdasarkan kriteria statistik, nilai KMO MSA yang disarankan adalah lebih dari 0.5 yang menunjukkan sampel yang dianalisis sudah cukup untuk menjalankan analisis faktor selanjutnya.

C. Bartlett’s Test of Sphericity

cortest.bartlett(data)
R was not square, finding R from data
$chisq
[1] 693.8181

$p.value
[1] 4.023131e-117

$df
[1] 45

Berdasarkan kriteria statistik, nilai p-value dari Bartlett test of Sphericity harus kurang dari 0.05 sehingga kita bisa melanjutkan analisis faktor.

D. Anti image correlation (AIC)

corrplot(KMO(data)$ImCo, method="number")

Nilai AIC pada diagonal utama harus lebih dari 0.5 agar kita dapat melanjutkan analisis faktor.

E. Determinan positif

det(cor(data))
[1] 0.3488543

Terdapat pendapat dari literatur bahwa nilai determinan positif dari matriks korelasi menunjukkan bahwa kita baru diperbolehkan untuk menjalankan analisis faktor.

F. Principal component analysis (PCA)

pca1 = princomp(data, scores=TRUE, cor=TRUE)
summary(pca1)
Importance of components:
                          Comp.1    Comp.2    Comp.3     Comp.4     Comp.5     Comp.6    Comp.7     Comp.8
Standard deviation     1.6140125 1.0673913 1.0263980 0.96857210 0.95635153 0.89147795 0.8572719 0.79767164
Proportion of Variance 0.2605036 0.1139324 0.1053493 0.09381319 0.09146082 0.07947329 0.0734915 0.06362801
Cumulative Proportion  0.2605036 0.3744361 0.4797854 0.57359855 0.66505938 0.74453267 0.8180242 0.88165218
                           Comp.9    Comp.10
Standard deviation     0.77953261 0.75881953
Proportion of Variance 0.06076711 0.05758071
Cumulative Proportion  0.94241929 1.00000000

Nilai standard deviation pada output diatas menunjukkan nilai eigen value setiap komponen yang terbentuk. Nilai eigen value yang lebih dari 1 merupakan banyaknya analisis faktor yang bisa dilaksanakan. Jika kesulitan membandingkan angka-angka ini kita bisa lebih mudah menentukan banyaknya faktor yang disarankan melalui visualisasi scree plot di bawah ini.

G. Scree plot

scree(data)

Berdasarkan visualisasi scree plot, terlihat bahwa terdapat 3 faktor yang disarankan dalam kriteria eigen value > 1.

H. Menentukan faktor loading

1. Analisis faktor loading

loadings(pca1)

Loadings:
    Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
B1   0.376  0.375         0.286  0.213                       0.551  0.522 
B2   0.324  0.375         0.168 -0.344 -0.467  0.364 -0.384        -0.314 
B3   0.316 -0.206  0.310        -0.200  0.698  0.436 -0.167 -0.105        
B4          0.587        -0.754         0.220        -0.106               
B5   0.300 -0.316  0.291 -0.456 -0.108 -0.417  0.291  0.452  0.181        
B6   0.319 -0.137 -0.620                0.212 -0.120  0.250  0.384 -0.467 
B7   0.349 -0.359  0.178 -0.190  0.228 -0.131 -0.440 -0.625  0.160        
B8   0.325  0.139  0.205  0.133 -0.564        -0.602  0.258 -0.236        
B9   0.323  0.248  0.260  0.103  0.626                0.293 -0.337 -0.403 
B10  0.354        -0.531 -0.215  0.132                      -0.547  0.465 

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9 Comp.10
SS loadings       1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0     1.0
Proportion Var    0.1    0.1    0.1    0.1    0.1    0.1    0.1    0.1    0.1     0.1
Cumulative Var    0.1    0.2    0.3    0.4    0.5    0.6    0.7    0.8    0.9     1.0

2. Rotasi untuk mengkonfirmasi hasil analisis loading

fa1 = factanal(data, factor=3, rotation="varimax")
fa1

Call:
factanal(x = data, factors = 3, rotation = "varimax")

Uniquenesses:
   B1    B2    B3    B4    B5    B6    B7    B8    B9   B10 
0.463 0.800 0.806 0.974 0.717 0.005 0.669 0.822 0.757 0.765 

Loadings:
    Factor1 Factor2 Factor3
B1   0.725   0.103         
B2   0.424   0.103         
B3   0.268           0.344 
B4                  -0.147 
B5   0.165           0.505 
B6   0.140   0.975   0.155 
B7   0.236           0.518 
B8   0.346           0.228 
B9   0.464           0.166 
B10  0.279   0.314   0.241 

               Factor1 Factor2 Factor3
SS loadings      1.294   1.093   0.834
Proportion Var   0.129   0.109   0.083
Cumulative Var   0.129   0.239   0.322

Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 31.24 on 18 degrees of freedom.
The p-value is 0.027 

I. Diagram jalur hasil analisis EFA dan menampilkan faktor loading-nya

fa.diagram(fa1$loadings, digits = 3)

Terbukti bahwa dugaan awal kita terhadap butir 4 (B4) yang berdasarkan diagram di atas, butir ini tidak bisa membentuk faktor dengan butir lainnya dan disarankan kita menghapus butir ini dalam kuesioner kita. Untuk selanjutnya butir ini harus dieliminasi untuk memperbaiki kualitas instrumen kita.
Evaluasi : berdasarkan hasil ini, dapat dikatakan bahwa butir-butir tidak membentuk aspek yang sesuai dengan deskripsi rancangan kuesioner yang dijelaskan di atas yaitu mengukur 2 aspek perilaku metakognisi yaitu deklaratif (B1-B6) dan prosedural (B7-B10). Bahkan B4 tidak membentuk kelompok dengan aspek yang terbentuk yang menandakan bahwa aspek ini tidak mencirikan penilaian pada setiap aspek tersebut.

5. Validitas konstruk melalui Confirmatory Factor Analysis (CFA)

A. Spesifikasi model

Berdasarkan hasil EFA, kita menetapkan spesifikasi model yang akan dikonfirmasi melalui CFA. Analisis CFA bertujuan untuk mengkonfirmasi hasil faktor-faktor atau aspek-aspek yang sudah diturunkan pada analisis sebelumnya yaitu EFA. Meskipun hasil analisis EFA ditemukan ketidaksesuaian dengan rancangan kuesioner Haeruddin (2020), analisis CFA tetap bisa dilakukan bahkan bisa menjadi perbaikan terhadap kuesioner yang telah dikembangkan Haeruddin (2020). Tanda “=~” menunjukkan bahwa faktor yang di-loading melalui butir-butir tertentu yang dispesifikasi. Simbol ~~ menunjukkan bahwa dimodelkan korelasi diantara faktor-faktor yang terbentuk.

model <- "
F1 =~ B1 + B9 + B2 + B8
F2 =~ B6 + B10
F3 =~ B7 + B5 + B3 
F1 ~~ F2
F2 ~~ F3
F1 ~~ F3 "

B. Pemodelan dengan CFA

Hasil yang perlu kita perhatikan adalah indeks fitting CFI, TLI yang harus lebih besar dari 0.9 dan indeks RMSEA dan SRMR yang harus lebih kecil dari 0.05. Jika batas ini dipenuhi, maka faktor yang dimodelkan sudah fit/ cocok dengan data yang tersedia.

fitmod = cfa(model, data)
summary(fitmod, fit.measures = TRUE, standardized = TRUE)
lavaan 0.6-9 ended normally after 43 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        21
                                                      
  Number of observations                           664
                                                      
Model Test User Model:
                                                      
  Test statistic                                52.051
  Degrees of freedom                                24
  P-value (Chi-square)                           0.001

Model Test Baseline Model:

  Test statistic                               685.040
  Degrees of freedom                                36
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.957
  Tucker-Lewis Index (TLI)                       0.935

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -6164.444
  Loglikelihood unrestricted model (H1)      -6138.418
                                                      
  Akaike (AIC)                               12370.888
  Bayesian (BIC)                             12465.352
  Sample-size adjusted Bayesian (BIC)        12398.676

Root Mean Square Error of Approximation:

  RMSEA                                          0.042
  90 Percent confidence interval - lower         0.026
  90 Percent confidence interval - upper         0.058
  P-value RMSEA <= 0.05                          0.788

Standardized Root Mean Square Residual:

  SRMR                                           0.034

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  F1 =~                                                                 
    B1                1.000                               0.431    0.621
    B9                0.764    0.092    8.279    0.000    0.329    0.484
    B2                0.801    0.097    8.284    0.000    0.345    0.484
    B8                0.736    0.094    7.829    0.000    0.317    0.443
  F2 =~                                                                 
    B6                1.000                               0.418    0.564
    B10               1.198    0.167    7.169    0.000    0.501    0.678
  F3 =~                                                                 
    B7                1.000                               0.409    0.566
    B5                0.861    0.118    7.286    0.000    0.352    0.486
    B3                0.803    0.113    7.104    0.000    0.329    0.460

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  F1 ~~                                                                 
    F2                0.100    0.016    6.098    0.000    0.557    0.557
  F2 ~~                                                                 
    F3                0.096    0.017    5.750    0.000    0.561    0.561
  F1 ~~                                                                 
    F3                0.112    0.016    6.917    0.000    0.635    0.635

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .B1                0.296    0.025   11.977    0.000    0.296    0.615
   .B9                0.354    0.023   15.202    0.000    0.354    0.766
   .B2                0.389    0.026   15.193    0.000    0.389    0.766
   .B8                0.411    0.026   15.821    0.000    0.411    0.804
   .B6                0.374    0.031   11.949    0.000    0.374    0.681
   .B10               0.295    0.038    7.859    0.000    0.295    0.541
   .B7                0.355    0.029   12.207    0.000    0.355    0.679
   .B5                0.401    0.028   14.337    0.000    0.401    0.764
   .B3                0.402    0.027   14.866    0.000    0.402    0.788
    F1                0.185    0.028    6.635    0.000    1.000    1.000
    F2                0.175    0.032    5.411    0.000    1.000    1.000
    F3                0.168    0.030    5.559    0.000    1.000    1.000

C. Beberapa indeks fitting hasil pemodelan

fitmeasures(fitmod)
               npar                fmin               chisq                  df              pvalue 
             21.000               0.039              52.051              24.000               0.001 
     baseline.chisq         baseline.df     baseline.pvalue                 cfi                 tli 
            685.040              36.000               0.000               0.957               0.935 
               nnfi                 rfi                 nfi                pnfi                 ifi 
              0.935               0.886               0.924               0.616               0.958 
                rni                logl   unrestricted.logl                 aic                 bic 
              0.957           -6164.444           -6138.418           12370.888           12465.352 
             ntotal                bic2               rmsea      rmsea.ci.lower      rmsea.ci.upper 
            664.000           12398.676               0.042               0.026               0.058 
       rmsea.pvalue                 rmr          rmr_nomean                srmr        srmr_bentler 
              0.788               0.017               0.017               0.034               0.034 
srmr_bentler_nomean                crmr         crmr_nomean          srmr_mplus   srmr_mplus_nomean 
              0.034               0.038               0.038               0.034               0.034 
              cn_05               cn_01                 gfi                agfi                pgfi 
            465.537             549.282               0.983               0.968               0.524 
                mfi                ecvi 
              0.979               0.142 

D. Diagram jalur CFA

Gambar di bawah ini merupakan representasi dari summary hasil pemodelan CFA yang tampil di atas. Panah dua arah di antara faktor merupakan nilai covariances pada summary CFA. Nilai yang berada di anak panah yang menghubungkan faktor dan butir kuesioner adalah faktor loading. Seberaba besar loading dalam satu faktor dapat digambarkan dengan tebal garis yang terbentuk. Semakin tebal artinya butir tersebut memiliki loading factor yang lebih besar. Anak panah putus-putus menunjukkan butir pertama yang kita sebutkan pada saat spesifikasi model setiap faktornya. Kemudian nilai paling bawah pada setiap butir (anak panah menunjuk butir itu sendiri) adalah nilai variances pada output summar CFA di atas yang menjelaskan seberapa besar varians yang bisa dijelaskan oleh setiap butir.

semPaths(fitmod, what='std', layout='tree', title = TRUE, posCol = 1, nDigits = 3, 
         edge.label.cex=0.7, exoVar = FALSE, sizeMan = 5, sizeLat = 5)

6. Estimasi Reliabilitas alpha cronbach

data_new = data[, c(1,2,3,5,6,7,8,9,10)]
alpha(data_new)

Reliability analysis   
Call: alpha(x = data_new)

 

 lower alpha upper     95% confidence boundaries
0.65 0.69 0.73 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
       1    2    3    4 miss
B1  0.02 0.21 0.58 0.18    0
B2  0.03 0.24 0.57 0.15    0
B3  0.04 0.29 0.55 0.12    0
B5  0.03 0.22 0.56 0.18    0
B6  0.03 0.28 0.52 0.17    0
B7  0.05 0.28 0.55 0.12    0
B8  0.03 0.20 0.56 0.21    0
B9  0.05 0.32 0.56 0.07    0
B10 0.05 0.27 0.55 0.14    0

Dari hasil ini diperoleh alpha sebesar 0.69 yang masih belum memenuhi syarat yang direkomendasikan sebagian besar literatur metodologi penelitian yaitu sebesar 0.7. Namun jika nilai ini dibulatkan mungkin kita bisa menganggap nilai ini sudah memenuhi syarat instrumen yang reliabel.

7. Pemodelan Generalized Linear Model (GRM)

A. Estimasi parameter butir

mod.grm <- mirt(data_new, model = 1, itemtype = 'graded', SE = TRUE)

Iteration: 1, Log-Lik: -6133.401, Max-Change: 0.38859
Iteration: 2, Log-Lik: -6120.611, Max-Change: 0.09692
Iteration: 3, Log-Lik: -6117.956, Max-Change: 0.07548
Iteration: 4, Log-Lik: -6117.181, Max-Change: 0.03550
Iteration: 5, Log-Lik: -6116.886, Max-Change: 0.02179
Iteration: 6, Log-Lik: -6116.788, Max-Change: 0.01301
Iteration: 7, Log-Lik: -6116.741, Max-Change: 0.00568
Iteration: 8, Log-Lik: -6116.735, Max-Change: 0.00331
Iteration: 9, Log-Lik: -6116.733, Max-Change: 0.00140
Iteration: 10, Log-Lik: -6116.733, Max-Change: 0.00197
Iteration: 11, Log-Lik: -6116.732, Max-Change: 0.00056
Iteration: 12, Log-Lik: -6116.732, Max-Change: 0.00019
Iteration: 13, Log-Lik: -6116.732, Max-Change: 0.00019
Iteration: 14, Log-Lik: -6116.732, Max-Change: 0.00088
Iteration: 15, Log-Lik: -6116.732, Max-Change: 0.00013
Iteration: 16, Log-Lik: -6116.732, Max-Change: 0.00013
Iteration: 17, Log-Lik: -6116.732, Max-Change: 0.00058
Iteration: 18, Log-Lik: -6116.732, Max-Change: 0.00007

Calculating information matrix...
mod.grm

Call:
mirt(data = data_new, model = 1, itemtype = "graded", SE = TRUE)

Full-information item factor analysis with 1 factor(s).
Converged within 1e-04 tolerance after 18 EM iterations.
mirt version: 1.35.1 
M-step optimizer: BFGS 
EM acceleration: Ramsay 
Number of rectangular quadrature: 61
Latent density type: Gaussian 

Information matrix estimated with method: Oakes
Second-order test: model is a possible local maximum
Condition number of information matrix =  19.77976

Log-likelihood = -6116.732
Estimated parameters: 36 
AIC = 12305.46
BIC = 12467.4; SABIC = 12353.1
G2 (262107) = 3971.04, p = 1
RMSEA = 0, CFI = NaN, TLI = NaN
extract.mirt(mod.grm, what='converged')
[1] TRUE

Hasil “TRUE” menunjukan tidak ada masalah yang terdeteksi di bawah kriteria konvergesi dalam proses estimasi yang dilaksanakan.

extract.mirt(mod.grm, what='secondordertest')
[1] TRUE

Hasil “TRUE” menunjukan tidak ada masalah yang terdeteksi di bawah kriteria konvergesi dalam proses estimasi yang dilaksanakan.

coef(mod.grm, simplify=T, IRTpars=T)
$items
        a     b1     b2    b3
B1  1.290 -3.456 -1.171 1.532
B2  0.995 -3.779 -1.188 2.002
B3  0.932 -3.859 -0.930 2.404
B5  0.865 -4.301 -1.435 1.980
B6  0.981 -3.870 -0.950 1.921
B7  1.066 -3.322 -0.838 2.205
B8  0.971 -4.187 -1.460 1.641
B9  0.999 -3.392 -0.633 2.997
B10 1.123 -3.139 -0.848 2.002

$means
F1 
 0 

$cov
   F1
F1  1

Output b1, b2, dan b3 adalah hasil estimasi parameter batas kategori setiap butir dan kemiringan (slope) a juga ditunjukkan. b1 adalah batas antara kategori 1 (P1) dan ketegori 2 (P2). b2 adalah batas antara kategori 2 (P2) dan kategori 3 (P3). b3 adalah batas antara kategori 3 (P3) dan kategori 4 (P4).

coef(mod.grm, IRTpars=T, printSE=T)
$B1
        a     b1     b2    b3
par 1.290 -3.456 -1.171 1.532
SE  0.143  0.345  0.122 0.147

$B2
        a     b1     b2    b3
par 0.995 -3.779 -1.188 2.002
SE  0.121  0.434  0.147 0.223

$B3
        a     b1     b2    b3
par 0.932 -3.859 -0.930 2.404
SE  0.114  0.447  0.134 0.270

$B5
        a     b1     b2    b3
par 0.865 -4.301 -1.435 1.980
SE  0.112  0.536  0.187 0.242

$B6
        a     b1     b2    b3
par 0.981 -3.870 -0.950 1.921
SE  0.118  0.444  0.134 0.213

$B7
        a     b1     b2    b3
par 1.066 -3.322 -0.838 2.205
SE  0.124  0.353  0.117 0.228

$B8
        a     b1     b2    b3
par 0.971 -4.187 -1.460 1.641
SE  0.118  0.495  0.175 0.189

$B9
        a     b1     b2    b3
par 0.999 -3.392 -0.633 2.997
SE  0.124  0.389  0.112 0.334

$B10
        a     b1     b2    b3
par 1.123 -3.139 -0.848 2.002
SE  0.126  0.318  0.113 0.200

$GroupPars
    MEAN_1 COV_11
par      0      1
SE      NA     NA

Output di atas juga menampilkan hasil estimasi parameter butir yang disertai dengan standard error-nya (SE). Dapat dilihat kategori b1 menunjukkan trend nilai standard error yang paling besar dibandingkan butir-butir yang lain.

coef(mod.grm, IRTpars=T)
$B1
            a     b1     b2    b3
par     1.290 -3.456 -1.171 1.532
CI_2.5  1.010 -4.132 -1.411 1.243
CI_97.5 1.569 -2.779 -0.931 1.821

$B2
            a     b1     b2    b3
par     0.995 -3.779 -1.188 2.002
CI_2.5  0.758 -4.630 -1.477 1.566
CI_97.5 1.232 -2.928 -0.899 2.439

$B3
            a     b1     b2    b3
par     0.932 -3.859 -0.930 2.404
CI_2.5  0.709 -4.736 -1.194 1.874
CI_97.5 1.155 -2.983 -0.667 2.933

$B5
            a     b1     b2    b3
par     0.865 -4.301 -1.435 1.980
CI_2.5  0.647 -5.352 -1.802 1.507
CI_97.5 1.084 -3.249 -1.068 2.453

$B6
            a    b1     b2    b3
par     0.981 -3.87 -0.950 1.921
CI_2.5  0.749 -4.74 -1.212 1.503
CI_97.5 1.213 -3.00 -0.688 2.338

$B7
            a     b1     b2    b3
par     1.066 -3.322 -0.838 2.205
CI_2.5  0.823 -4.014 -1.067 1.758
CI_97.5 1.308 -2.631 -0.608 2.651

$B8
            a     b1     b2    b3
par     0.971 -4.187 -1.460 1.641
CI_2.5  0.739 -5.158 -1.802 1.270
CI_97.5 1.202 -3.217 -1.118 2.011

$B9
            a     b1     b2    b3
par     0.999 -3.392 -0.633 2.997
CI_2.5  0.755 -4.155 -0.852 2.343
CI_97.5 1.242 -2.629 -0.414 3.652

$B10
            a     b1     b2    b3
par     1.123 -3.139 -0.848 2.002
CI_2.5  0.875 -3.762 -1.070 1.610
CI_97.5 1.370 -2.515 -0.626 2.393

$GroupPars
        MEAN_1 COV_11
par          0      1
CI_2.5      NA     NA
CI_97.5     NA     NA

Output hasil estimasi parameter butir beserta rentang confidence interval (CI) dengan taraf signifikansi 5%.

B. Estimasi latent trait/ ability

Di bawah ini adalah hasil estimasi kemampuan setiap peserta terhadap setiap butir soal. Semakin positif ability-nya artinya orang tersebut cenderung merespon setiap butir menuju angka 4 (maksimal). Sebaliknya semakin negatif artinya orang tersebut cenderung merespon setiap butir menuju angka 1 (minimal). Metode estimasi yang digunakan adalah EAP (Expected A Posteriori). Pola respon pada masing-masing butir setiap person juga ditampilkan. Empirical reliability juga ditampilkan yang nilainya berbeda sedikit dengan estimasi alpha cronbach. Untuk nilai sekarang sudah memenuhi kriteria yang disarankan literatur statistik.

fscores(mod.grm, method='EAP', full.scores=F)

Method:  EAP

Empirical Reliability:

    F1 
0.7042 
       B1 B2 B3 B5 B6 B7 B8 B9 B10           F1     SE_F1
  [1,]  1  2  1  2  4  1  1  2   2 -2.330711148 0.5719903
  [2,]  1  2  1  4  3  2  3  3   3 -0.758845632 0.5826364
  [3,]  1  2  2  2  1  2  2  1   2 -2.424130997 0.5280796
  [4,]  1  2  2  2  2  4  1  3   3 -1.259676044 0.5958022
  [5,]  1  2  2  3  2  1  3  2   2 -1.784187986 0.5404050
  [6,]  1  2  2  3  2  2  2  2   3 -1.552894936 0.5345534
  [7,]  1  2  2  3  4  2  2  1   2 -1.683282694 0.5585595
  [8,]  1  2  3  2  2  3  3  1   3 -1.204204017 0.5662629
  [9,]  1  2  3  2  3  2  3  2   3 -1.037195538 0.5440580
 [10,]  1  2  4  4  1  2  2  3   1 -1.513488571 0.6191286
 [11,]  1  3  2  2  2  2  2  3   2 -1.544255059 0.5355689
 [12,]  1  3  2  3  1  1  3  1   2 -1.976138154 0.5768559
 [13,]  1  3  2  4  3  3  3  3   4  0.222037551 0.5867546
 [14,]  1  3  3  2  3  2  3  1   4 -0.758229637 0.5955152
 [15,]  1  3  3  3  3  3  2  1   3 -0.674831029 0.5713148
 [16,]  1  4  2  2  4  1  3  2   3 -0.858593494 0.6146433
 [17,]  2  1  1  1  4  2  3  3   3 -1.101476614 0.5899722
 [18,]  2  1  2  1  1  3  1  3   1 -2.295898018 0.5921402
 [19,]  2  1  2  1  3  2  3  1   2 -1.827331193 0.5441743
 [20,]  2  1  2  2  1  2  2  2   2 -2.121825000 0.5179087
 [21,]  2  1  2  2  2  2  1  3   2 -1.875866743 0.5337091
 [22,]  2  1  2  3  2  3  2  3   3 -0.989222162 0.5414160
 [23,]  2  1  2  3  3  3  2  3   2 -1.021949636 0.5365461
 [24,]  2  1  2  3  3  4  3  1   2 -1.066564586 0.5702665
 [25,]  2  1  2  4  2  2  2  2   2 -1.637399812 0.5265733
 [26,]  2  1  2  4  2  2  3  2   2 -1.400130390 0.5314170
 [27,]  2  1  3  2  3  1  3  3   1 -1.421141207 0.5743496
 [28,]  2  1  3  2  4  3  3  3   3 -0.271852008 0.5677439
 [29,]  2  2  1  2  2  1  2  3   1 -2.185019770 0.5418813
 [30,]  2  2  1  2  2  2  2  3   3 -1.472126355 0.5285770
 [31,]  2  2  1  3  2  3  2  3   2 -1.272517807 0.5300355
 [32,]  2  2  1  3  3  3  4  3   3 -0.286953965 0.5611116
 [33,]  2  2  1  4  4  2  2  1   3 -1.182434356 0.5813720
 [34,]  2  2  2  2  1  1  2  1   2 -2.379248769 0.5227787
 [35,]  2  2  2  2  1  3  3  3   1 -1.457309384 0.5511424
 [36,]  2  2  2  2  3  2  3  2   2 -1.346415126 0.5046468
 [37,]  2  2  2  2  4  2  3  3   3 -0.711130408 0.5417804
 [38,]  2  2  2  3  1  4  2  3   2 -1.151678113 0.5545861
 [39,]  2  2  2  3  2  2  3  2   3 -1.127210641 0.5119452
 [40,]  2  2  2  3  2  3  2  1   3 -1.278699191 0.5318169
 [41,]  2  2  2  3  3  2  2  2   2 -1.372616072 0.5047527
 [42,]  2  2  2  3  3  2  2  2   3 -1.124565688 0.5138340
 [43,]  2  2  2  3  3  2  3  1   3 -1.057808804 0.5297779
 [44,]  2  2  2  3  3  3  1  2   4 -0.811653116 0.5620613
 [45,]  2  2  2  3  3  3  1  4   2 -0.873735903 0.5568144
 [46,]  2  2  2  3  3  3  2  3   2 -0.898180266 0.5212749
 [47,]  2  2  2  3  3  3  3  3   4 -0.184582565 0.5555476
 [48,]  2  2  3  1  3  2  4  2   4 -0.602763104 0.5783649
 [49,]  2  2  3  2  2  2  2  2   2 -1.572730828 0.5020185
 [50,]  2  2  3  2  2  2  3  3   2 -1.131546086 0.5139358
 [51,]  2  2  3  2  2  2  4  2   4 -0.781737365 0.5609831
 [52,]  2  2  3  2  3  2  4  3   4 -0.215126446 0.5757440
 [53,]  2  2  3  3  2  2  3  3   3 -0.666101175 0.5248737
 [54,]  2  2  3  3  2  3  2  3   2 -0.907622257 0.5225258
 [55,]  2  2  3  3  2  3  3  3   2 -0.677519632 0.5245325
 [56,]  2  2  3  3  2  4  1  2   2 -1.132742744 0.5505703
 [57,]  2  2  3  3  3  2  3  3   1 -0.852315358 0.5397779
 [58,]  2  2  3  3  3  3  2  2   2 -0.915960708 0.5179683
 [59,]  2  2  3  3  3  3  2  2   4 -0.459936396 0.5526366
 [60,]  2  2  3  3  3  3  3  2   2 -0.689800236 0.5196093
 [61,]  2  2  3  3  3  3  3  3   2 -0.441714439 0.5276651
 [62,]  2  2  3  3  3  4  2  1   3 -0.620953818 0.5668438
 [63,]  2  2  3  3  4  3  2  2   2 -0.771893114 0.5383273
 [64,]  2  2  3  3  4  3  2  3   3 -0.206594365 0.5550079
 [65,]  2  2  3  4  2  2  2  2   1 -1.460808831 0.5364612
 [66,]  2  2  3  4  3  2  3  2   4 -0.309407360 0.5645405
 [67,]  2  2  3  4  3  2  4  2   2 -0.608000485 0.5487195
 [68,]  2  2  3  4  3  3  3  2   4 -0.010165547 0.5678371
 [69,]  2  2  3  4  4  4  3  2   3  0.209696834 0.5877696
 [70,]  2  2  4  2  1  3  3  3   2 -0.879187285 0.5563706
 [71,]  2  2  4  2  2  3  2  2   1 -1.435563641 0.5447414
 [72,]  2  2  4  2  2  3  4  2   2 -0.820327957 0.5520004
 [73,]  2  2  4  3  2  2  3  2   3 -0.775062616 0.5348118
 [74,]  2  2  4  4  2  2  2  2   3 -0.862423322 0.5495900
 [75,]  2  2  4  4  3  3  2  2   3 -0.306805489 0.5629913
 [76,]  2  2  4  4  3  3  3  2   3 -0.056251180 0.5606520
 [77,]  2  3  1  2  2  2  3  3   4 -0.820254079 0.5628251
 [78,]  2  3  1  2  2  3  2  3   2 -1.238135047 0.5325273
 [79,]  2  3  1  3  3  3  3  1   1 -1.147585465 0.5706846
 [80,]  2  3  2  1  4  1  3  1   1 -1.762803661 0.5928603
 [81,]  2  3  2  2  1  1  1  2   2 -2.108177119 0.5412677
 [82,]  2  3  2  2  2  2  1  2   1 -1.918400367 0.5307922
 [83,]  2  3  2  2  2  2  2  1   3 -1.498998423 0.5253811
 [84,]  2  3  2  2  2  2  2  2   2 -1.558859624 0.5021724
 [85,]  2  3  2  2  2  2  3  2   2 -1.343168083 0.5052553
 [86,]  2  3  2  2  2  3  3  2   3 -0.843649305 0.5207521
 [87,]  2  3  2  2  3  1  3  1   2 -1.479308090 0.5394166
 [88,]  2  3  2  2  3  2  2  2   2 -1.342102967 0.5070816
 [89,]  2  3  2  2  3  2  3  2   3 -0.865256392 0.5173134
 [90,]  2  3  2  2  4  2  3  2   2 -0.996501959 0.5279480
 [ reached getOption("max.print") -- omitted 472 rows ]

C. Category Characteristic Curve (CCC) dan plot informasi

itemplot(mod.grm, 1)

itemplot(mod.grm, 1, CE = T)

itemplot(mod.grm, 2)

itemplot(mod.grm, 3)

itemplot(mod.grm, 4)

itemplot(mod.grm, 5)

itemplot(mod.grm, 6)

itemplot(mod.grm, 7)

itemplot(mod.grm, 8)

itemplot(mod.grm, 9)

Visualisasi CCC dalam satu plot. Dapat dilihat pada gambar di bawah ini, setiap butir bahkan hampir memiliki bentuk kurva CCC yang hampir sama.

plot(mod.grm, type = 'trace')

D. Plot Test Characteristic Curve (TCC)

plot(mod.grm)

E. Plot Test Information Curve (TIC) Instrumen

Informasi yang dimiliki instrumen cocok untuk menentukan ability peserta antara sekitar -4 sampai 2. Artinya instrumen lebih akurat mengestimasi peserta dengan estimasi dalam rentang ini.

plot(mod.grm, type='info')

Jika kita ingin menamplikan TIC pada butir tertentu. Misalkan yang ditampilkan di bawah ini adalah butir ke-9.

itemplot(mod.grm, 9, type='info')

F. Model-data fit, item fit, dan person fit

M2(mod.grm, type="M2*")

Nilai p-value dari uji M2* yang ditunjukkan masih kurang dari 0.05 yang artinya hipotesus nol ditolak atau data tidak cocok dengan pemodelan GRM yang sedang dianalisis.Indeks lainnya seperti RMSEA dan SRMR juga tidak sesuai kriteria (< 0.05). TLI dan CFI juga jauh dari kriteria kecocokan model (> 0.9). Jika ini terjadi kita sebaiknya memeriksa apakah terdapat butir-butir yang tidak cocok yang mungkin bisa menyebabkan ketidakcocokan ini. Atau bisa juga terjadi karakteristik rancangan kuesioner tidak sesuai dengan sifat pemodelan skala GRM yang seharusnya.

itemfit(mod.grm)

Namun, jika dilihat dari itemfit sebagian besar butir sudah fit yang ditunjukkan nilai p.S_X2 yang lebih dari 0.05, kecuali B6 (atau butir ke-7 pada data asal) yang menunjukkan ketakcocokan dengan model GRM. Butir 6 mungkin yang menyebabkan ketidak cocokan model berdasarkan hasil uji M* sebelumnya.

itemfit(mod.grm, empirical.plot=1)

Visualisasi di atas menunjukkan CCC (kurva garis) pemodelan dibandingkan dengan CCC empirik sesuai data yang sebenarnya dengan menggunakan fungsi “itemfit()”. Butir yang digambarkan adalah butir ke-1.

personfit(mod.grm, method='EAP')

Indeks person fit Iz (“Zh”) dihitung. Nilai yang rendah (misalkan < -3) menunjukkan potensi pola respon yang menyimpang.

p.fit <- cbind(1:664,data, personfit(mod.grm, method='EAP'))
p.fit[order(p.fit[,16]),]

Tabel di atas adalah hasil Zh yang sudah diurutkan dari yang paling rendah. Terdapat 14 person yang nilai Zh nya kurang dari -3 yaitu peserta 191, 273, …, 195 artinya kelompok ini adalah person yang responnya tidak cocok dengan pemodelan GRM yang dijalankan.

G. Uji Asumsi Unidimensi dengan indeks DETECT dan ASSI

Berdasarkan dokumentasi fungsi “conf.detect{sirt}”, indeks DETECT < 0.2 dan ASSI < 0.25 membuktikan konstruk yang sudah unidimensi. Nilai indeks DETECT juga bisa berupa hasil yang negatif untuk data unidimensi. Hasil data kali ini tidak menunjukkan sifat unidimensi karena DETECT 4.306 menunjukkan sangat multidimensi dan ASSI 0.778.

# estimate person score by simply using a transformed sum score
score <- stats::qnorm( (rowMeans(data_new)+.5 )  / ( 9 + 1 ) )

# extract item cluster
itemcluster <- substring(colnames(data_new), 1, 1 )

# DETECT Item cluster
detect1 <- sirt::conf.detect(data=data_new, score=score, itemcluster=itemcluster )
-----------------------------------------------------------
Confirmatory DETECT Analysis 
Conditioning on 1 Score
Bandwidth Scale: 1.1 
Pairwise Estimation of Conditional Covariances
...........................................................
Nonparametric ICC estimation 
 
...........................................................
Nonparametric Estimation of conditional covariances 
 5% 10% 15% 20% 25% 30% 35% 40% 45% 50% 
55% 60% 65% 70% 75% 80% 85% 90% 95% 
-----------------------------------------------------------

H. Memeriksa independensi lokal

residuals(mod.grm, type='LD')
LD matrix (lower triangle) and standardized values:

        B1     B2     B3     B5     B6     B7     B8     B9    B10
B1      NA  0.080 -0.070 -0.084 -0.084 -0.097  0.056  0.133 -0.083
B2  12.823     NA -0.071 -0.101 -0.120 -0.085  0.130 -0.078  0.085
B3   9.770  9.951     NA  0.061 -0.096  0.074  0.065 -0.083 -0.065
B5  14.050 20.306  7.413     NA -0.134  0.094 -0.062 -0.059 -0.107
B6  13.920 28.878 18.357 35.612     NA -0.109 -0.110 -0.079  0.193
B7  18.851 14.435 11.031 17.763 23.784     NA -0.064  0.055  0.068
B8   6.202 33.862  8.371  7.548 24.131  8.279     NA -0.070 -0.083
B9  35.317 12.189 13.863  6.965 12.465  5.944  9.805     NA -0.053
B10 13.690 14.368  8.291 22.764 74.179  9.233 13.679  5.693     NA

Hasil ini merupakan deteksi asumsi independensi lokal pada setiap butir dengan fungsi “function()”. Elemen diagonal bawah adalah nilai LD-X2 dan elemen bagian atas adalah koefisien Cramer V yang dihitung dengan menggunakan LD-X2. Nilai absolut yang besar pada LD-X2 menunjukkan potensi pelanggaran asumsi independensi lokal.

residuals(mod.grm, type='Q3')
Q3 matrix:

        B1     B2     B3     B5     B6     B7     B8     B9    B10
B1   1.000  0.013 -0.110 -0.217 -0.140 -0.197 -0.076  0.074 -0.164
B2   0.013  1.000 -0.132 -0.088 -0.096 -0.208  0.021 -0.095 -0.075
B3  -0.110 -0.132  1.000  0.025 -0.105 -0.025 -0.011 -0.091 -0.146
B5  -0.217 -0.088  0.025  1.000 -0.118  0.086 -0.060 -0.090 -0.086
B6  -0.140 -0.096 -0.105 -0.118  1.000 -0.092 -0.109 -0.201  0.150
B7  -0.197 -0.208 -0.025  0.086 -0.092  1.000 -0.090 -0.046 -0.084
B8  -0.076  0.021 -0.011 -0.060 -0.109 -0.090  1.000 -0.126 -0.191
B9   0.074 -0.095 -0.091 -0.090 -0.201 -0.046 -0.126  1.000 -0.133
B10 -0.164 -0.075 -0.146 -0.086  0.150 -0.084 -0.191 -0.133  1.000

Hasil ini juga menunjukkan deteksi asumsi independensi lokal tetapi dilakukan dengan metode “Q3”. Semakin besar nilai absolutnya menandakan potensi pelanggaran asumsi independensi lokal.

8. Kesimpulan

  1. Analisis EFA menghasilkan 3 faktor dimana butir 9 (B9) harus disingkirkan karena tidak menjelaskan satu pun aspek di dalam faktor yang terbentuk. Hasil EFA menyarankan pengelompokkan aspek yang berbeda dengan rancangan kuesioner metakognisi yang awalnya terdiri dari 2 aspek yaitu deklaratif dan prosedural.
  2. Analisis CFA membuktikan bahwa faktor-faktor yang diturunkan berdasarkan analisis EFA cocok dengan data (fit) yang seharusnya memberikan saran kepada perancang kuesioner untuk menyesuaikan instrumennya bersesuaian dengan ukuran ini.
  3. Instrumen masih belum memenuhi kriteria reliabilitas yang memadai (> 0.7)
  4. Pemodelan GRM yang dilaksanakan menunjukkan ketidakcocokan data dengan model namun menunjukkan kecocokkan item dan person terhadap model. Hasil ini mungkin bisa disebabkan asumsi unidimensi yang tidak dipenuhi dan terjadinya independensi lokal di antara butir. Analisis IRT multidimensi disarankan untuk memperbaiki pemodelan yang telah dilaksanakan.
LS0tDQp0aXRsZTogJyoqVmFsaWRhc2kgSW5zdHJ1bWVuIFBlcmlsYWt1IE1ldGFrb2duaXNpIGRhbGFtIFBlbWVjYWhhbiBNYXNhbGFoIEZpc2lrYSBkZW5nYW4NCiAgRUZBLCBDRkEsIGRhbiBHUk0gbWVsYWx1aSBSIFByb2dyYW1taW5nKionDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KT2xlaCAgICA6IFB1cndva28gSGFyeWFkaSBTYW50b3NvXA0KUHJvZGkgICA6IFBlbmVsaXRpYW4gZGFuIEV2YWx1YXNpIFBlbmRpZGlrYW5cDQpNYXRhIGt1bGlhaCA6IFRlb3JpIFRlc1wNCg0KXGJlZ2lue2NlbnRlcn0gT2xlaCAgICA6IFB1cndva28gSGFyeWFkaSBTYW50b3NvIChOSU0uIDIxNzAxMjYxMDQ0KSBcZW5ke2NlbnRlcn0NClxiZWdpbntjZW50ZXJ9IFByb2RpICAgICA6IFBlbmVsaXRpYW4gZGFuIEV2YWx1YXNpIFBlbmRpZGlrYW4gXGVuZHtjZW50ZXJ9DQpcYmVnaW57Y2VudGVyfSBNYXRhIGt1bGlhaCA6IFRlb3JpIFRlcyBcZW5ke2NlbnRlcn0NClxiZWdpbntjZW50ZXJ9IERvc2VuIFBlbmdhbXB1ICAgOiBEci4gSGFyeWFudG8sIE0uVC4gXGVuZHtjZW50ZXJ9DQoNCiMgMS4gTWVuZXRhcGthbiBkaXJla3Rvcmkga2VyamENCmBgYHtyfQ0KZGlyID0gIkQ6L0RPQ1VNRU5UUy9LdWxpYWggU3RyYXRhLTMvMi4gS3VsaWFoIFNlbWVzdGVyIDEvNy4gVGVvcmkgVGVzIChLYW0sIDE1LjM1KS9hbmFsaXNpcyBJUlQgcG9saXRvbXVzIg0Kc2V0d2QoZGlyKQ0KYGBgDQoNCiMgMi4gSW1wb3J0IHBhY2thZ2VzIHlhbmcgYWthbiBkaWd1bmFrYW4gdW50dWsgYmVrZXJqYQ0KVGVyZGFwYXQgNiBsaWJyYXJ5IHlhbmcgYWthbiBkaWd1bmFrYW4gZGFsYW0gcGVrZXJqYWFuIGluaS4gVXJ1dGFubnlhIG1ld2FraWxpIGRhZnRhciBwZWtlcmphYW4geWFuZyBha2FuIGRpbGFrc2FuYWthbiB5YWl0dSBkZXNrcmlwc2kgZGF0YSwgYW5hbGlzaXMgRUZBLCBhbmFsaXNpcyBDRkEsIGVzdGltYXNpIHJlbGlhYmlsaXRhcywgZGlha2hpcmkgbWVsYWx1aSBwZW1vZGVsYW4gSVJUIGRlbmdhbiAqZ3JhZGVkIHJlc3BvbnNlIG1vZGVsKiAoR1JNKS4NCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KHNpcnQpDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkoc2VtUGxvdCkNCmxpYnJhcnkobWlydCkNCmBgYA0KDQojIDMuIElucHV0IGRhdGEgZGFuIGRlc2tyaXBzaSBkYXRhDQpEYXRhIGRpYW1iaWwgZGFyaSBkaXNlcnRhc2kgSGFlcnVkZGluICgyMDIwKSBwcm9kaSBTMyBJbG11IFBlbmRpZGlrYW4gVU5ZIHlhbmcgYmVyanVkdWwgIipQZXJpbGFrdSBNZXRha29nbmlzaSBkYWxhbSBNZW1lY2Foa2FuIE1hc2FsYWggRmlzaWthIEJlcmRhc2Fya2FuIEdheWEgQmVycGlraXIgcGFkYSBNYWhhc2lzd2EgVW5pdmVyc2l0YXMgVGFkdWxha28qIi4gRGF0YSB5YW5nIGRpYW5hbGlzaXMgZGFsYW0gdHVnYXMgaW5pIG1lcnVwYWthbiAxMCBidXRpciBrdWVzaW9uZXIgcGVyaWxha3UgbWV0YWtvZ25pc2kgSGFlcnVkZGluICgyMDIwKSB5YW5nIGFzbGlueWEgbWVuZ2FuZHVuZyA0MCBidXRpciBrdWVzaW9uZXIuIEtlc2VwdWx1aCBidXRpciBrdWVzaW9uZXIgeWFuZyBkaWFuYWxpc2lzIHBhZGEgdHVnYXMgaW5pIG1lbmd1a3VyIDIgYXNwZWsgbWV0YWtvZ25pc2kgZGFsYW0gcGVtZWNhaGFuIG1hc2FsYWggZmlzaWthIHlhaXR1IHBlbmdldGFodWFuIGRla2xhcmF0aWYgKDEtNikgZGFuIHBlbmdldGFodWFuIHByb3NlZHVyYWwgKDctMTApLiBCZXJkYXNhcmthbiBkYXRhIHlhbmcgZGlzYWppa2FuLCBrdWVzaW9uZXIgbWV0YWtvZ25pc2kgbWVuZ2d1bmFrYW4gTGlrZXJ0IDQgc2thbGEuQnV0aXIgcGVybnlhdGFhbiBrdWVzaW9uZXIgMS0xMCBhZGFsYWggc2ViYWdhaSBiZXJpa3V0IDogXA0KKipQRU5HRVRBSFVBTiBERUtMQVJBVElGKioNCg0KMS4gU2F5YSAqKnRpZGFrKiogbWVueWFkYXJpIGtlbWFtcHVhbiB5YW5nIHNheWEgbWlsaWtpIGRhbGFtIG1lbnllbGVzYWlrYW4gbWFzYWxhaCBraW5lbWF0aWthIChCMSkNCjIuIFNheWEgbWVueWFkYXJpIGtlbGVtYWhhbiB5YW5nIHNheWEgbWlsaWtpIGRhbGFtIG1lbnllbGVzYWlrYW4gbWFzYWxhaCBraW5lbWF0aWthIChCMikNCjMuIFNheWEgKip0aWRhayoqIHBlcmx1IG1lbmdldGFodWkgY2FyYSB5YW5nIHBlcm5haCBkaWd1bmFrYW4gc2ViZWx1bW55YSBkYWxhbSBtZW55ZWxlc2Fpa2FuIG1hc2FsYWgga2luZW1hdGlrYSAoQjMpDQo0LiBTYXlhIG1lbnlhZGFyaSBpbmZvcm1hc2kgcGVudGluZyB5YW5nIGRpcGVybHVrYW4gZGFsYW0gbWVueWVsZXNhaWthbiBtYXNhbGFoIGtpbmVtYXRpa2EgKEI0KQ0KNS4gU2F5YSAqKnRpZGFrKiogbWVuZ2hpcnVrYW4ga2ViZXJoYXNpbGFuIGRhbGFtIG1lbnllbGVzYWlrYW4gbWFzYWxhaCBraW5lbWF0aWthIChCNSkNCjYuIFNheWEgcGVkdWxpIHRlcmhhZGFwIHNhdHVhbiBkYWxhbSBtZW55ZWxlc2Fpa2FuIG1hc2FsYWgga2luZW1hdGlrYSAoQjYpDQoNCioqUEVOR0VUQUhVQU4gUFJPU0VEVVJBTCoqDQoNCjcuIFNheWEgKip0aWRhayoqIG1lbnlhZGFyaSB0ZXJkYXBhdCBzdHJhdGVnaSB0ZXJ0ZW50dSB5YW5nIGRpZ3VuYWthbiBkYWxhbSBtZW55ZWxlc2Fpa2FuIG1hc2FsYWgga2luZW1hdGlrYSAoQjcpDQo4LiBTYXlhIG1lbnlhZGFyaSB0dWp1YW4gbWVuZ2d1bmFrYW4gc3RyYXRlZ2kgdGVydGVudHUgZGFsYW0gbWVueWVsZXNhaWthbiBtYXNhbGFoIGtpbmVtYXRpa2EgKEI4KQ0KOS4gU2F5YSAqKnRpZGFrKiogbWVueWFkYXJpIGJhZ2FpbWFuYSBjYXJhIG11ZGFoIG1lbWFoYW1pIG1hc2FsYWgga2luZW1hdGlrYSAoQjkpDQoxMC4gU2F5YSBtZW5nZ3VuYWthbiBzdHJhdGVnaSBwZW55ZWxlc2FpYW4gbWFzYWxhaCBraW5lbWF0aWthIHlhbmcgdGVsYWggc2F5YSBndW5ha2FuIHNlYmVsdW1ueWEgKEIxMCkNCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQudGFibGUoJyhwcm9jZXNzZWQpIFBlcmlsYWt1IE1ldGFrb2duaXNpIE1lbnllbGVzYWlrYW4gTWFzYWxhaCBGaXNpa2EudHh0JywgaGVhZGVyID0gVCkNCmhlYWQoZGF0YSkNCmBgYA0KYGBge3J9DQpkaW0oZGF0YSkNCmBgYA0KSGFzaWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIGRhdGEga2l0YSB0ZXJkaXJpIGRhcmkgNjY0IGJhcmlzIChyZXNwb25kZW4pIGRhbiAxMCBrb2xvbSAoYnV0aXIga3Vlc2lvbmVyKS4NCmBgYHtyfQ0Kc3RyKGRhdGEpDQpgYGANCk91dHB1dCBpbmkgZGlndW5ha2FuIHVudHVrIG1lbmRlc2tyaXBzaWthbiB0aXBlIGRhdGEgZGFuIG9ic2VydmFzaSBhcGFrYWggYWRhIGRhdGEgbWlzc2luZyBhdGF1IHRpZGFrLiBUYW1wYWsgcGFkYSBoYXNpbCwgdGVyZGFwYXQgNjY0IG9ic2VydmFzaSBwYWRhIDEwIHZhcmlhYmVsIChidXRpciBrdWVzaW9uZXIpLg0KYGBge3J9DQpkZXNjcmliZShkYXRhKQ0KYGBgDQpPdXRwdXQgZGkgYXRhcyBtZXJ1cGFrYW4gZGVza3JpcHNpIGRhdGEgeWFuZyBiaXNhIGtpdGEgZ3VuYWthbiB1bnR1ayBtZW1haGFtaSByYXRhLXJhdGEsIG1lYW4sIG1pc3NpbmcgZGF0YSwgbm9ybWFsaXRhcyBkYXRhIGRlbmdhbiBtZWxpaGF0IHNrZXcgZGFuIGt1cnRvc2lzLCBkYW4gbGFpbi1sYWluLg0KYGBge3J9DQphcHBseShkYXRhLCAyLCB0YWJsZSkNCmBgYA0KT3V0cHV0IGRpc3RyaWJ1c2kgcmVzcG9uIHBlc2VydGEgKDEsIDIsIDMsIDQpIGRhbGFtIHNldGlhcCBidXRpciBzb2FsLiBUYWJlbCBqdWdhIG1lbmdpbmZvcm1hc2lrYW4gYXBha2FoIGFkYSBidXRpci1idXRpciB5YW5nIG1lbWlsaWtpIHJlc3BvbiB5YW5nIHNhbWEgc2VrYWxpIHRpZGFrIGFkYSB5YW5nIG1lbWlsaWggPw0KDQojIDQuIFZhbGlkaXRhcyBrb25zdHJ1ayBtZWxhbHVpICpFeHBsb3JhdG9yeSBGYWN0b3IgQW5hbHlzaXMqIChFRkEpDQojIyBBLiBNZW1lcmlrc2Ega29yZWxhc2kgYW50YXIgYnV0aXINCmBgYHtyfQ0KY29ycnBsb3QoY29yKGRhdGEpLCBtZXRob2Q9Im51bWJlciIpDQpgYGANCkFuYWxpc2lzIGtvcmVsYXNpIGFudGFyIGJ1dGlyIGRlbmdhbiB2aXN1YWxpc2FzaSAqaGVhdG1hcCouIFNlbWFraW4gImJpcnUiIGF0YXUgIm1lcmFoIiBhcnRpbnlhIHNlbWFraW4gbWVtaWxpa2kga29yZWxhc2kuIEJpcnUgYmVyYXJ0aSBrb3JlbGFzaSBwb3NpdGlmLiBNZXJhaCBiZXJhcnRpIGtvcmVsYXNpIG5lZ2F0aWYuIERhcGF0IGRpbGloYXQgYmFod2EgdGVyZGFwYXQgMSBidXRpciB5YW5nIHRpZGFrIG1lbWlsaWtpIGtvcmVsYXNpIGRlbmdhbiBidXRpciBsYWlubnlhIHlhaXR1IGJ1dGlyIDQgKEI0KSB5YW5nIHNlaGFydXNueWEgQjQgYmVya29yZWxhc2kgZGVuZ2FuIGJ1dGlyLWJ1dGlyIGxhaW5ueWEgZGFsYW0gYXNwZWsgKipQRU5HRVRBSFVBTiBERUtMQVJBVElGKiouIEtvcmVsYXNpIGJpc2EgbWVuamFkaSBpbmRpa2F0b3IgYXdhbCB0ZXJiZW50dWtueWEgZmFrdG9yIGRpIGRhbGFtIGRhdGEuIEppa2EgdGVyZGFwYXQgYnV0aXIgeWFuZyB0aWRhayBtZW1pbGlraSBrb3JlbGFzaSBkZW5nYW4gYnV0aXIgc2F0dSBwdW4sIGRpbXVuZ2tpbmthbiBidXRpciBpbmkgdGlkYWsgYmlzYSBtZW1iZW50dWsgZmFrdG9yIGRlbmdhbiBidXRpciBsYWlubnlhIGRhbGFtIHNldGlhcCBhc3BlayBkYWxhbSBrdWVzaW9uZXIuDQoNCiMjIEIuIE1lbmlsYWkga2VjdWt1cGFuIHNhbXBlbCBkZW5nYW4gS2Fpc2VyLU1heWVyLU9sa2luIE1lYXN1cmUgb2YgU2FtcGxpbmcgQWRlcXVhY3kNCmBgYHtyfQ0KS01PKGRhdGEpDQpgYGANCkJlcmRhc2Fya2FuIGtyaXRlcmlhIHN0YXRpc3RpaywgbmlsYWkgS01PIE1TQSB5YW5nIGRpc2FyYW5rYW4gYWRhbGFoIGxlYmloIGRhcmkgMC41IHlhbmcgbWVudW5qdWtrYW4gc2FtcGVsIHlhbmcgZGlhbmFsaXNpcyBzdWRhaCBjdWt1cCB1bnR1ayBtZW5qYWxhbmthbiBhbmFsaXNpcyBmYWt0b3Igc2VsYW5qdXRueWEuDQoNCiMjIEMuIEJhcnRsZXR04oCZcyBUZXN0IG9mIFNwaGVyaWNpdHkNCmBgYHtyfQ0KY29ydGVzdC5iYXJ0bGV0dChkYXRhKQ0KYGBgDQpCZXJkYXNhcmthbiBrcml0ZXJpYSBzdGF0aXN0aWssIG5pbGFpICpwLXZhbHVlKiBkYXJpICoqQmFydGxldHQgdGVzdCBvZiBTcGhlcmljaXR5KiogaGFydXMga3VyYW5nIGRhcmkgMC4wNSBzZWhpbmdnYSBraXRhIGJpc2EgbWVsYW5qdXRrYW4gYW5hbGlzaXMgZmFrdG9yLg0KDQojIyBELiBBbnRpIGltYWdlIGNvcnJlbGF0aW9uIChBSUMpDQpgYGB7cn0NCmNvcnJwbG90KEtNTyhkYXRhKSRJbUNvLCBtZXRob2Q9Im51bWJlciIpDQpgYGANCk5pbGFpIEFJQyBwYWRhIGRpYWdvbmFsIHV0YW1hIGhhcnVzIGxlYmloIGRhcmkgMC41IGFnYXIga2l0YSBkYXBhdCBtZWxhbmp1dGthbiBhbmFsaXNpcyBmYWt0b3IuDQoNCiMjIEUuIERldGVybWluYW4gcG9zaXRpZg0KYGBge3J9DQpkZXQoY29yKGRhdGEpKQ0KYGBgDQpUZXJkYXBhdCBwZW5kYXBhdCBkYXJpIGxpdGVyYXR1ciBiYWh3YSBuaWxhaSBkZXRlcm1pbmFuIHBvc2l0aWYgZGFyaSBtYXRyaWtzIGtvcmVsYXNpIG1lbnVuanVra2FuIGJhaHdhIGtpdGEgYmFydSBkaXBlcmJvbGVoa2FuIHVudHVrIG1lbmphbGFua2FuIGFuYWxpc2lzIGZha3Rvci4NCg0KIyMgRi4gUHJpbmNpcGFsIGNvbXBvbmVudCBhbmFseXNpcyAoUENBKQ0KYGBge3J9DQpwY2ExID0gcHJpbmNvbXAoZGF0YSwgc2NvcmVzPVRSVUUsIGNvcj1UUlVFKQ0Kc3VtbWFyeShwY2ExKQ0KYGBgDQpOaWxhaSBzdGFuZGFyZCBkZXZpYXRpb24gcGFkYSBvdXRwdXQgZGlhdGFzIG1lbnVuanVra2FuIG5pbGFpIGVpZ2VuIHZhbHVlIHNldGlhcCBrb21wb25lbiB5YW5nIHRlcmJlbnR1ay4gTmlsYWkgZWlnZW4gdmFsdWUgeWFuZyBsZWJpaCBkYXJpIDEgbWVydXBha2FuIGJhbnlha255YSBhbmFsaXNpcyBmYWt0b3IgeWFuZyBiaXNhIGRpbGFrc2FuYWthbi4gSmlrYSBrZXN1bGl0YW4gbWVtYmFuZGluZ2thbiBhbmdrYS1hbmdrYSBpbmkga2l0YSBiaXNhIGxlYmloIG11ZGFoIG1lbmVudHVrYW4gYmFueWFrbnlhIGZha3RvciB5YW5nIGRpc2FyYW5rYW4gbWVsYWx1aSB2aXN1YWxpc2FzaSBzY3JlZSBwbG90IGRpIGJhd2FoIGluaS4NCg0KIyMgRy4gU2NyZWUgcGxvdA0KYGBge3J9DQpzY3JlZShkYXRhKQ0KYGBgDQpCZXJkYXNhcmthbiB2aXN1YWxpc2FzaSBzY3JlZSBwbG90LCB0ZXJsaWhhdCBiYWh3YSB0ZXJkYXBhdCAzIGZha3RvciB5YW5nIGRpc2FyYW5rYW4gZGFsYW0ga3JpdGVyaWEgZWlnZW4gdmFsdWUgPiAxLg0KDQojIyBILiBNZW5lbnR1a2FuIGZha3RvciBsb2FkaW5nIA0KDQojIyMgMS4gQW5hbGlzaXMgZmFrdG9yIGxvYWRpbmcNCmBgYHtyfQ0KbG9hZGluZ3MocGNhMSkNCmBgYA0KDQojIyMgMi4gUm90YXNpIHVudHVrIG1lbmdrb25maXJtYXNpIGhhc2lsIGFuYWxpc2lzIGxvYWRpbmcNCmBgYHtyfQ0KZmExID0gZmFjdGFuYWwoZGF0YSwgZmFjdG9yPTMsIHJvdGF0aW9uPSJ2YXJpbWF4IikNCmZhMQ0KYGBgDQoNCiMjIEkuIERpYWdyYW0gamFsdXIgaGFzaWwgYW5hbGlzaXMgRUZBIGRhbiBtZW5hbXBpbGthbiBmYWt0b3IgbG9hZGluZy1ueWENCmBgYHtyfQ0KZmEuZGlhZ3JhbShmYTEkbG9hZGluZ3MsIGRpZ2l0cyA9IDMpDQpgYGANClRlcmJ1a3RpIGJhaHdhIGR1Z2FhbiBhd2FsIGtpdGEgdGVyaGFkYXAgYnV0aXIgNCAoQjQpIHlhbmcgYmVyZGFzYXJrYW4gZGlhZ3JhbSBkaSBhdGFzLCBidXRpciBpbmkgdGlkYWsgYmlzYSBtZW1iZW50dWsgZmFrdG9yIGRlbmdhbiBidXRpciBsYWlubnlhIGRhbiBkaXNhcmFua2FuIGtpdGEgbWVuZ2hhcHVzIGJ1dGlyIGluaSBkYWxhbSBrdWVzaW9uZXIga2l0YS4gVW50dWsgc2VsYW5qdXRueWEgYnV0aXIgaW5pIGhhcnVzIGRpZWxpbWluYXNpIHVudHVrIG1lbXBlcmJhaWtpIGt1YWxpdGFzIGluc3RydW1lbiBraXRhLlwNCioqRXZhbHVhc2kqKiA6IGJlcmRhc2Fya2FuIGhhc2lsIGluaSwgZGFwYXQgZGlrYXRha2FuIGJhaHdhIGJ1dGlyLWJ1dGlyIHRpZGFrIG1lbWJlbnR1ayBhc3BlayB5YW5nIHNlc3VhaSBkZW5nYW4gZGVza3JpcHNpIHJhbmNhbmdhbiBrdWVzaW9uZXIgeWFuZyBkaWplbGFza2FuIGRpIGF0YXMgeWFpdHUgbWVuZ3VrdXIgMiBhc3BlayBwZXJpbGFrdSBtZXRha29nbmlzaSB5YWl0dSBkZWtsYXJhdGlmIChCMS1CNikgZGFuIHByb3NlZHVyYWwgKEI3LUIxMCkuIEJhaGthbiBCNCB0aWRhayBtZW1iZW50dWsga2Vsb21wb2sgZGVuZ2FuIGFzcGVrIHlhbmcgdGVyYmVudHVrIHlhbmcgbWVuYW5kYWthbiBiYWh3YSBhc3BlayBpbmkgdGlkYWsgbWVuY2lyaWthbiBwZW5pbGFpYW4gcGFkYSBzZXRpYXAgYXNwZWsgdGVyc2VidXQuDQoNCiMgNS4gVmFsaWRpdGFzIGtvbnN0cnVrIG1lbGFsdWkgKkNvbmZpcm1hdG9yeSBGYWN0b3IgQW5hbHlzaXMqIChDRkEpDQoNCiMjIEEuIFNwZXNpZmlrYXNpIG1vZGVsDQpCZXJkYXNhcmthbiBoYXNpbCBFRkEsIGtpdGEgbWVuZXRhcGthbiBzcGVzaWZpa2FzaSBtb2RlbCB5YW5nIGFrYW4gZGlrb25maXJtYXNpIG1lbGFsdWkgQ0ZBLiBBbmFsaXNpcyBDRkEgYmVydHVqdWFuIHVudHVrIG1lbmdrb25maXJtYXNpIGhhc2lsIGZha3Rvci1mYWt0b3IgYXRhdSBhc3Blay1hc3BlayB5YW5nIHN1ZGFoIGRpdHVydW5rYW4gcGFkYSBhbmFsaXNpcyBzZWJlbHVtbnlhIHlhaXR1IEVGQS4gTWVza2lwdW4gaGFzaWwgYW5hbGlzaXMgRUZBIGRpdGVtdWthbiBrZXRpZGFrc2VzdWFpYW4gZGVuZ2FuIHJhbmNhbmdhbiBrdWVzaW9uZXIgSGFlcnVkZGluICgyMDIwKSwgYW5hbGlzaXMgQ0ZBIHRldGFwIGJpc2EgZGlsYWt1a2FuIGJhaGthbiBiaXNhIG1lbmphZGkgcGVyYmFpa2FuIHRlcmhhZGFwIGt1ZXNpb25lciB5YW5nIHRlbGFoIGRpa2VtYmFuZ2thbiBIYWVydWRkaW4gKDIwMjApLiBUYW5kYSAiPX4iIG1lbnVuanVra2FuIGJhaHdhIGZha3RvciB5YW5nIGRpLWxvYWRpbmcgbWVsYWx1aSBidXRpci1idXRpciB0ZXJ0ZW50dSB5YW5nIGRpc3Blc2lmaWthc2kuIFNpbWJvbCB+fiBtZW51bmp1a2thbiBiYWh3YSBkaW1vZGVsa2FuIGtvcmVsYXNpIGRpYW50YXJhIGZha3Rvci1mYWt0b3IgeWFuZyB0ZXJiZW50dWsuDQpgYGB7cn0NCm1vZGVsIDwtICINCkYxID1+IEIxICsgQjkgKyBCMiArIEI4DQpGMiA9fiBCNiArIEIxMA0KRjMgPX4gQjcgKyBCNSArIEIzIA0KRjEgfn4gRjINCkYyIH5+IEYzDQpGMSB+fiBGMyAiDQpgYGANCg0KIyMgQi4gUGVtb2RlbGFuIGRlbmdhbiBDRkENCkhhc2lsIHlhbmcgcGVybHUga2l0YSBwZXJoYXRpa2FuIGFkYWxhaCBpbmRla3MgZml0dGluZyBDRkksIFRMSSB5YW5nIGhhcnVzIGxlYmloIGJlc2FyIGRhcmkgMC45IGRhbiBpbmRla3MgUk1TRUEgZGFuIFNSTVIgeWFuZyBoYXJ1cyBsZWJpaCBrZWNpbCBkYXJpIDAuMDUuIEppa2EgYmF0YXMgaW5pIGRpcGVudWhpLCBtYWthIGZha3RvciB5YW5nIGRpbW9kZWxrYW4gc3VkYWggZml0LyBjb2NvayBkZW5nYW4gZGF0YSB5YW5nIHRlcnNlZGlhLg0KYGBge3J9DQpmaXRtb2QgPSBjZmEobW9kZWwsIGRhdGEpDQpzdW1tYXJ5KGZpdG1vZCwgZml0Lm1lYXN1cmVzID0gVFJVRSwgc3RhbmRhcmRpemVkID0gVFJVRSkNCmBgYA0KDQojIyBDLiBCZWJlcmFwYSBpbmRla3MgZml0dGluZyBoYXNpbCBwZW1vZGVsYW4NCmBgYHtyfQ0KZml0bWVhc3VyZXMoZml0bW9kKQ0KYGBgDQoNCiMjIEQuIERpYWdyYW0gamFsdXIgQ0ZBDQpHYW1iYXIgZGkgYmF3YWggaW5pIG1lcnVwYWthbiByZXByZXNlbnRhc2kgZGFyaSBzdW1tYXJ5IGhhc2lsIHBlbW9kZWxhbiBDRkEgeWFuZyB0YW1waWwgZGkgYXRhcy4gUGFuYWggZHVhIGFyYWggZGkgYW50YXJhIGZha3RvciBtZXJ1cGFrYW4gbmlsYWkgY292YXJpYW5jZXMgcGFkYSBzdW1tYXJ5IENGQS4gTmlsYWkgeWFuZyBiZXJhZGEgZGkgYW5hayBwYW5haCB5YW5nIG1lbmdodWJ1bmdrYW4gZmFrdG9yIGRhbiBidXRpciBrdWVzaW9uZXIgYWRhbGFoIGZha3RvciBsb2FkaW5nLiBTZWJlcmFiYSBiZXNhciBsb2FkaW5nIGRhbGFtIHNhdHUgZmFrdG9yIGRhcGF0IGRpZ2FtYmFya2FuIGRlbmdhbiB0ZWJhbCBnYXJpcyB5YW5nIHRlcmJlbnR1ay4gU2VtYWtpbiB0ZWJhbCBhcnRpbnlhIGJ1dGlyIHRlcnNlYnV0IG1lbWlsaWtpIGxvYWRpbmcgZmFjdG9yIHlhbmcgbGViaWggYmVzYXIuIEFuYWsgcGFuYWggcHV0dXMtcHV0dXMgbWVudW5qdWtrYW4gYnV0aXIgcGVydGFtYSB5YW5nIGtpdGEgc2VidXRrYW4gcGFkYSBzYWF0IHNwZXNpZmlrYXNpIG1vZGVsIHNldGlhcCBmYWt0b3JueWEuIEtlbXVkaWFuIG5pbGFpIHBhbGluZyBiYXdhaCBwYWRhIHNldGlhcCBidXRpciAoYW5hayBwYW5haCBtZW51bmp1ayBidXRpciBpdHUgc2VuZGlyaSkgYWRhbGFoIG5pbGFpIHZhcmlhbmNlcyBwYWRhIG91dHB1dCBzdW1tYXIgQ0ZBIGRpIGF0YXMgeWFuZyBtZW5qZWxhc2thbiBzZWJlcmFwYSBiZXNhciB2YXJpYW5zIHlhbmcgYmlzYSBkaWplbGFza2FuIG9sZWggc2V0aWFwIGJ1dGlyLg0KYGBge3J9DQpzZW1QYXRocyhmaXRtb2QsIHdoYXQ9J3N0ZCcsIGxheW91dD0ndHJlZScsIHRpdGxlID0gVFJVRSwgcG9zQ29sID0gMSwgbkRpZ2l0cyA9IDMsIA0KICAgICAgICAgZWRnZS5sYWJlbC5jZXg9MC43LCBleG9WYXIgPSBGQUxTRSwgc2l6ZU1hbiA9IDUsIHNpemVMYXQgPSA1KQ0KYGBgDQoNCiMgNi4gRXN0aW1hc2kgUmVsaWFiaWxpdGFzIGFscGhhIGNyb25iYWNoDQpgYGB7cn0NCmRhdGFfbmV3ID0gZGF0YVssIGMoMSwyLDMsNSw2LDcsOCw5LDEwKV0NCmFscGhhKGRhdGFfbmV3KQ0KYGBgDQpEYXJpIGhhc2lsIGluaSBkaXBlcm9sZWggYWxwaGEgc2ViZXNhciAwLjY5IHlhbmcgbWFzaWggYmVsdW0gbWVtZW51aGkgc3lhcmF0IHlhbmcgZGlyZWtvbWVuZGFzaWthbiBzZWJhZ2lhbiBiZXNhciBsaXRlcmF0dXIgbWV0b2RvbG9naSBwZW5lbGl0aWFuIHlhaXR1IHNlYmVzYXIgMC43LiBOYW11biBqaWthIG5pbGFpIGluaSBkaWJ1bGF0a2FuIG11bmdraW4ga2l0YSBiaXNhIG1lbmdhbmdnYXAgbmlsYWkgaW5pIHN1ZGFoIG1lbWVudWhpIHN5YXJhdCBpbnN0cnVtZW4geWFuZyByZWxpYWJlbC4NCg0KIyA3LiBQZW1vZGVsYW4gKkdlbmVyYWxpemVkIExpbmVhciBNb2RlbCogKEdSTSkNCg0KIyMgQS4gRXN0aW1hc2kgcGFyYW1ldGVyIGJ1dGlyDQpgYGB7cn0NCm1vZC5ncm0gPC0gbWlydChkYXRhX25ldywgbW9kZWwgPSAxLCBpdGVtdHlwZSA9ICdncmFkZWQnLCBTRSA9IFRSVUUpDQptb2QuZ3JtDQpgYGANCmBgYHtyfQ0KZXh0cmFjdC5taXJ0KG1vZC5ncm0sIHdoYXQ9J2NvbnZlcmdlZCcpDQpgYGANCkhhc2lsICJUUlVFIiBtZW51bmp1a2FuIHRpZGFrIGFkYSBtYXNhbGFoIHlhbmcgdGVyZGV0ZWtzaSBkaSBiYXdhaCBrcml0ZXJpYSBrb252ZXJnZXNpIGRhbGFtIHByb3NlcyBlc3RpbWFzaSB5YW5nIGRpbGFrc2FuYWthbi4NCmBgYHtyfQ0KZXh0cmFjdC5taXJ0KG1vZC5ncm0sIHdoYXQ9J3NlY29uZG9yZGVydGVzdCcpDQpgYGANCkhhc2lsICJUUlVFIiBtZW51bmp1a2FuIHRpZGFrIGFkYSBtYXNhbGFoIHlhbmcgdGVyZGV0ZWtzaSBkaSBiYXdhaCBrcml0ZXJpYSBrb252ZXJnZXNpIGRhbGFtIHByb3NlcyBlc3RpbWFzaSB5YW5nIGRpbGFrc2FuYWthbi4NCmBgYHtyfQ0KY29lZihtb2QuZ3JtLCBzaW1wbGlmeT1ULCBJUlRwYXJzPVQpDQpgYGANCk91dHB1dCBiMSwgYjIsIGRhbiBiMyBhZGFsYWggaGFzaWwgZXN0aW1hc2kgcGFyYW1ldGVyIGJhdGFzIGthdGVnb3JpIHNldGlhcCBidXRpciBkYW4ga2VtaXJpbmdhbiAoc2xvcGUpIGEganVnYSBkaXR1bmp1a2thbi4gYjEgYWRhbGFoIGJhdGFzIGFudGFyYSBrYXRlZ29yaSAxIChQMSkgZGFuIGtldGVnb3JpIDIgKFAyKS4gYjIgYWRhbGFoIGJhdGFzIGFudGFyYSBrYXRlZ29yaSAyIChQMikgZGFuIGthdGVnb3JpIDMgKFAzKS4gYjMgYWRhbGFoIGJhdGFzIGFudGFyYSBrYXRlZ29yaSAzIChQMykgZGFuIGthdGVnb3JpIDQgKFA0KS4NCmBgYHtyfQ0KY29lZihtb2QuZ3JtLCBJUlRwYXJzPVQsIHByaW50U0U9VCkNCmBgYA0KT3V0cHV0IGRpIGF0YXMganVnYSBtZW5hbXBpbGthbiBoYXNpbCBlc3RpbWFzaSBwYXJhbWV0ZXIgYnV0aXIgeWFuZyBkaXNlcnRhaSBkZW5nYW4gc3RhbmRhcmQgZXJyb3ItbnlhIChTRSkuIERhcGF0IGRpbGloYXQga2F0ZWdvcmkgYjEgbWVudW5qdWtrYW4gdHJlbmQgbmlsYWkgc3RhbmRhcmQgZXJyb3IgeWFuZyBwYWxpbmcgYmVzYXIgZGliYW5kaW5na2FuIGJ1dGlyLWJ1dGlyIHlhbmcgbGFpbi4NCmBgYHtyfQ0KY29lZihtb2QuZ3JtLCBJUlRwYXJzPVQpDQpgYGANCk91dHB1dCBoYXNpbCBlc3RpbWFzaSBwYXJhbWV0ZXIgYnV0aXIgYmVzZXJ0YSByZW50YW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKENJKSBkZW5nYW4gdGFyYWYgc2lnbmlmaWthbnNpIDUlLg0KDQojIyBCLiBFc3RpbWFzaSBsYXRlbnQgdHJhaXQvIGFiaWxpdHkNCkRpIGJhd2FoIGluaSBhZGFsYWggaGFzaWwgZXN0aW1hc2kga2VtYW1wdWFuIHNldGlhcCBwZXNlcnRhIHRlcmhhZGFwIHNldGlhcCBidXRpciBzb2FsLiBTZW1ha2luIHBvc2l0aWYgYWJpbGl0eS1ueWEgYXJ0aW55YSBvcmFuZyB0ZXJzZWJ1dCBjZW5kZXJ1bmcgbWVyZXNwb24gc2V0aWFwIGJ1dGlyIG1lbnVqdSBhbmdrYSA0IChtYWtzaW1hbCkuIFNlYmFsaWtueWEgc2VtYWtpbiBuZWdhdGlmIGFydGlueWEgb3JhbmcgdGVyc2VidXQgY2VuZGVydW5nIG1lcmVzcG9uIHNldGlhcCBidXRpciBtZW51anUgYW5na2EgMSAobWluaW1hbCkuIE1ldG9kZSBlc3RpbWFzaSB5YW5nIGRpZ3VuYWthbiBhZGFsYWggRUFQIChFeHBlY3RlZCBBIFBvc3RlcmlvcmkpLiBQb2xhIHJlc3BvbiBwYWRhIG1hc2luZy1tYXNpbmcgYnV0aXIgc2V0aWFwIHBlcnNvbiBqdWdhIGRpdGFtcGlsa2FuLiBFbXBpcmljYWwgcmVsaWFiaWxpdHkganVnYSBkaXRhbXBpbGthbiB5YW5nIG5pbGFpbnlhIGJlcmJlZGEgc2VkaWtpdCBkZW5nYW4gZXN0aW1hc2kgYWxwaGEgY3JvbmJhY2guIFVudHVrIG5pbGFpIHNla2FyYW5nIHN1ZGFoIG1lbWVudWhpIGtyaXRlcmlhIHlhbmcgZGlzYXJhbmthbiBsaXRlcmF0dXIgc3RhdGlzdGlrLg0KYGBge3J9DQpmc2NvcmVzKG1vZC5ncm0sIG1ldGhvZD0nRUFQJywgZnVsbC5zY29yZXM9RikNCmBgYA0KDQojIyBDLiAqQ2F0ZWdvcnkgQ2hhcmFjdGVyaXN0aWMgQ3VydmUqIChDQ0MpIGRhbiBwbG90IGluZm9ybWFzaQ0KYGBge3J9DQppdGVtcGxvdChtb2QuZ3JtLCAxKQ0KYGBgDQoNCmBgYHtyfQ0KaXRlbXBsb3QobW9kLmdybSwgMSwgQ0UgPSBUKQ0KYGBgDQoNCmBgYHtyfQ0KaXRlbXBsb3QobW9kLmdybSwgMikNCmBgYA0KDQpgYGB7cn0NCml0ZW1wbG90KG1vZC5ncm0sIDMpDQpgYGANCg0KYGBge3J9DQppdGVtcGxvdChtb2QuZ3JtLCA0KQ0KYGBgDQoNCmBgYHtyfQ0KaXRlbXBsb3QobW9kLmdybSwgNSkNCmBgYA0KDQpgYGB7cn0NCml0ZW1wbG90KG1vZC5ncm0sIDYpDQpgYGANCg0KYGBge3J9DQppdGVtcGxvdChtb2QuZ3JtLCA3KQ0KYGBgDQoNCmBgYHtyfQ0KaXRlbXBsb3QobW9kLmdybSwgOCkNCmBgYA0KDQpgYGB7cn0NCml0ZW1wbG90KG1vZC5ncm0sIDkpDQpgYGANClZpc3VhbGlzYXNpIENDQyBkYWxhbSBzYXR1IHBsb3QuIERhcGF0IGRpbGloYXQgcGFkYSBnYW1iYXIgZGkgYmF3YWggaW5pLCBzZXRpYXAgYnV0aXIgYmFoa2FuIGhhbXBpciBtZW1pbGlraSBiZW50dWsga3VydmEgQ0NDIHlhbmcgaGFtcGlyIHNhbWEuDQoNCmBgYHtyfQ0KcGxvdChtb2QuZ3JtLCB0eXBlID0gJ3RyYWNlJykNCmBgYA0KDQojIyBELiBQbG90ICpUZXN0IENoYXJhY3RlcmlzdGljIEN1cnZlKiAoVENDKQ0KYGBge3J9DQpwbG90KG1vZC5ncm0pDQpgYGANCg0KIyMgRS4gUGxvdCAqVGVzdCBJbmZvcm1hdGlvbiBDdXJ2ZSogKFRJQykgSW5zdHJ1bWVuDQpJbmZvcm1hc2kgeWFuZyBkaW1pbGlraSBpbnN0cnVtZW4gY29jb2sgdW50dWsgbWVuZW50dWthbiBhYmlsaXR5IHBlc2VydGEgYW50YXJhIHNla2l0YXIgLTQgc2FtcGFpIDIuIEFydGlueWEgaW5zdHJ1bWVuIGxlYmloIGFrdXJhdCBtZW5nZXN0aW1hc2kgcGVzZXJ0YSBkZW5nYW4gZXN0aW1hc2kgZGFsYW0gcmVudGFuZyBpbmkuDQpgYGB7cn0NCnBsb3QobW9kLmdybSwgdHlwZT0naW5mbycpDQpgYGANCkppa2Ega2l0YSBpbmdpbiBtZW5hbXBsaWthbiBUSUMgcGFkYSBidXRpciB0ZXJ0ZW50dS4gTWlzYWxrYW4geWFuZyBkaXRhbXBpbGthbiBkaSBiYXdhaCBpbmkgYWRhbGFoIGJ1dGlyIGtlLTkuDQpgYGB7cn0NCml0ZW1wbG90KG1vZC5ncm0sIDksIHR5cGU9J2luZm8nKQ0KYGBgDQoNCiMjIEYuIE1vZGVsLWRhdGEgZml0LCBpdGVtIGZpdCwgZGFuIHBlcnNvbiBmaXQNCmBgYHtyfQ0KTTIobW9kLmdybSwgdHlwZT0iTTIqIikNCmBgYA0KTmlsYWkgKnAtdmFsdWUqIGRhcmkgdWppIE0yKiB5YW5nIGRpdHVuanVra2FuIG1hc2loIGt1cmFuZyBkYXJpIDAuMDUgeWFuZyBhcnRpbnlhIGhpcG90ZXN1cyBub2wgZGl0b2xhayBhdGF1IGRhdGEgdGlkYWsgY29jb2sgZGVuZ2FuIHBlbW9kZWxhbiBHUk0geWFuZyBzZWRhbmcgZGlhbmFsaXNpcy5JbmRla3MgbGFpbm55YSBzZXBlcnRpIFJNU0VBIGRhbiBTUk1SIGp1Z2EgdGlkYWsgc2VzdWFpIGtyaXRlcmlhICg8IDAuMDUpLiBUTEkgZGFuIENGSSBqdWdhIGphdWggZGFyaSBrcml0ZXJpYSBrZWNvY29rYW4gbW9kZWwgKD4gMC45KS4gSmlrYSBpbmkgdGVyamFkaSBraXRhIHNlYmFpa255YSBtZW1lcmlrc2EgYXBha2FoIHRlcmRhcGF0IGJ1dGlyLWJ1dGlyIHlhbmcgdGlkYWsgY29jb2sgeWFuZyBtdW5na2luIGJpc2EgbWVueWViYWJrYW4ga2V0aWRha2NvY29rYW4gaW5pLiBBdGF1IGJpc2EganVnYSB0ZXJqYWRpIGthcmFrdGVyaXN0aWsgcmFuY2FuZ2FuIGt1ZXNpb25lciB0aWRhayBzZXN1YWkgZGVuZ2FuIHNpZmF0IHBlbW9kZWxhbiBza2FsYSBHUk0geWFuZyBzZWhhcnVzbnlhLg0KDQpgYGB7cn0NCml0ZW1maXQobW9kLmdybSkNCmBgYA0KTmFtdW4sIGppa2EgZGlsaWhhdCBkYXJpIGl0ZW1maXQgc2ViYWdpYW4gYmVzYXIgYnV0aXIgc3VkYWggZml0IHlhbmcgZGl0dW5qdWtrYW4gbmlsYWkgcC5TX1gyIHlhbmcgbGViaWggZGFyaSAwLjA1LCBrZWN1YWxpIEI2IChhdGF1IGJ1dGlyIGtlLTcgcGFkYSBkYXRhIGFzYWwpIHlhbmcgbWVudW5qdWtrYW4ga2V0YWtjb2Nva2FuIGRlbmdhbiBtb2RlbCBHUk0uIEJ1dGlyIDYgbXVuZ2tpbiB5YW5nIG1lbnllYmFia2FuIGtldGlkYWsgY29jb2thbiBtb2RlbCBiZXJkYXNhcmthbiBoYXNpbCB1amkgTSogc2ViZWx1bW55YS4NCg0KYGBge3J9DQppdGVtZml0KG1vZC5ncm0sIGVtcGlyaWNhbC5wbG90PTEpDQpgYGANClZpc3VhbGlzYXNpIGRpIGF0YXMgbWVudW5qdWtrYW4gQ0NDIChrdXJ2YSBnYXJpcykgcGVtb2RlbGFuIGRpYmFuZGluZ2thbiBkZW5nYW4gQ0NDIGVtcGlyaWsgc2VzdWFpIGRhdGEgeWFuZyBzZWJlbmFybnlhIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kgIml0ZW1maXQoKSIuIEJ1dGlyIHlhbmcgZGlnYW1iYXJrYW4gYWRhbGFoIGJ1dGlyIGtlLTEuDQoNCmBgYHtyfQ0KcGVyc29uZml0KG1vZC5ncm0sIG1ldGhvZD0nRUFQJykNCmBgYA0KSW5kZWtzIHBlcnNvbiBmaXQgSXogKCJaaCIpIGRpaGl0dW5nLiBOaWxhaSB5YW5nIHJlbmRhaCAobWlzYWxrYW4gPCAtMykgbWVudW5qdWtrYW4gcG90ZW5zaSBwb2xhIHJlc3BvbiB5YW5nIG1lbnlpbXBhbmcuDQoNCmBgYHtyfQ0KcC5maXQgPC0gY2JpbmQoMTo2NjQsZGF0YSwgcGVyc29uZml0KG1vZC5ncm0sIG1ldGhvZD0nRUFQJykpDQpwLmZpdFtvcmRlcihwLmZpdFssMTZdKSxdDQpgYGANClRhYmVsIGRpIGF0YXMgYWRhbGFoIGhhc2lsIFpoIHlhbmcgc3VkYWggZGl1cnV0a2FuIGRhcmkgeWFuZyBwYWxpbmcgcmVuZGFoLiBUZXJkYXBhdCAxNCBwZXJzb24geWFuZyBuaWxhaSBaaCBueWEga3VyYW5nIGRhcmkgLTMgeWFpdHUgcGVzZXJ0YSAxOTEsIDI3MywgLi4uLCAxOTUgYXJ0aW55YSBrZWxvbXBvayBpbmkgYWRhbGFoIHBlcnNvbiB5YW5nIHJlc3Bvbm55YSB0aWRhayBjb2NvayBkZW5nYW4gcGVtb2RlbGFuIEdSTSB5YW5nIGRpamFsYW5rYW4uDQoNCiMjIEcuIFVqaSBBc3Vtc2kgVW5pZGltZW5zaSBkZW5nYW4gaW5kZWtzIERFVEVDVCBkYW4gQVNTSQ0KQmVyZGFzYXJrYW4gZG9rdW1lbnRhc2kgZnVuZ3NpICJjb25mLmRldGVjdHtzaXJ0fSIsIGluZGVrcyBERVRFQ1QgPCAwLjIgZGFuIEFTU0kgPCAwLjI1IG1lbWJ1a3Rpa2FuIGtvbnN0cnVrIHlhbmcgc3VkYWggdW5pZGltZW5zaS4gTmlsYWkgaW5kZWtzIERFVEVDVCBqdWdhIGJpc2EgYmVydXBhIGhhc2lsIHlhbmcgbmVnYXRpZiB1bnR1ayBkYXRhIHVuaWRpbWVuc2kuIEhhc2lsIGRhdGEga2FsaSBpbmkgdGlkYWsgbWVudW5qdWtrYW4gc2lmYXQgdW5pZGltZW5zaSBrYXJlbmEgREVURUNUIDQuMzA2IG1lbnVuanVra2FuIHNhbmdhdCBtdWx0aWRpbWVuc2kgZGFuIEFTU0kgMC43NzguDQoNCmBgYHtyfQ0KIyBlc3RpbWF0ZSBwZXJzb24gc2NvcmUgYnkgc2ltcGx5IHVzaW5nIGEgdHJhbnNmb3JtZWQgc3VtIHNjb3JlDQpzY29yZSA8LSBzdGF0czo6cW5vcm0oIChyb3dNZWFucyhkYXRhX25ldykrLjUgKSAgLyAoIDkgKyAxICkgKQ0KDQojIGV4dHJhY3QgaXRlbSBjbHVzdGVyDQppdGVtY2x1c3RlciA8LSBzdWJzdHJpbmcoY29sbmFtZXMoZGF0YV9uZXcpLCAxLCAxICkNCg0KIyBERVRFQ1QgSXRlbSBjbHVzdGVyDQpkZXRlY3QxIDwtIHNpcnQ6OmNvbmYuZGV0ZWN0KGRhdGE9ZGF0YV9uZXcsIHNjb3JlPXNjb3JlLCBpdGVtY2x1c3Rlcj1pdGVtY2x1c3RlciApDQpgYGANCg0KIyMgSC4gTWVtZXJpa3NhIGluZGVwZW5kZW5zaSBsb2thbA0KYGBge3J9DQpyZXNpZHVhbHMobW9kLmdybSwgdHlwZT0nTEQnKQ0KYGBgDQpIYXNpbCBpbmkgbWVydXBha2FuIGRldGVrc2kgYXN1bXNpIGluZGVwZW5kZW5zaSBsb2thbCBwYWRhIHNldGlhcCBidXRpciBkZW5nYW4gZnVuZ3NpICJmdW5jdGlvbigpIi4gRWxlbWVuIGRpYWdvbmFsIGJhd2FoIGFkYWxhaCBuaWxhaSBMRC1YMiBkYW4gZWxlbWVuIGJhZ2lhbiBhdGFzIGFkYWxhaCBrb2VmaXNpZW4gQ3JhbWVyIFYgeWFuZyBkaWhpdHVuZyBkZW5nYW4gbWVuZ2d1bmFrYW4gTEQtWDIuIE5pbGFpIGFic29sdXQgeWFuZyBiZXNhciBwYWRhIExELVgyIG1lbnVuanVra2FuIHBvdGVuc2kgcGVsYW5nZ2FyYW4gYXN1bXNpIGluZGVwZW5kZW5zaSBsb2thbC4NCg0KYGBge3J9DQpyZXNpZHVhbHMobW9kLmdybSwgdHlwZT0nUTMnKQ0KYGBgDQpIYXNpbCBpbmkganVnYSBtZW51bmp1a2thbiBkZXRla3NpIGFzdW1zaSBpbmRlcGVuZGVuc2kgbG9rYWwgdGV0YXBpIGRpbGFrdWthbiBkZW5nYW4gbWV0b2RlICJRMyIuIFNlbWFraW4gYmVzYXIgbmlsYWkgYWJzb2x1dG55YSBtZW5hbmRha2FuIHBvdGVuc2kgcGVsYW5nZ2FyYW4gYXN1bXNpIGluZGVwZW5kZW5zaSBsb2thbC4NCg0KIyA4LiBLZXNpbXB1bGFuDQoNCjEuIEFuYWxpc2lzIEVGQSBtZW5naGFzaWxrYW4gMyBmYWt0b3IgZGltYW5hIGJ1dGlyIDkgKEI5KSBoYXJ1cyBkaXNpbmdraXJrYW4ga2FyZW5hIHRpZGFrIG1lbmplbGFza2FuIHNhdHUgcHVuIGFzcGVrIGRpIGRhbGFtIGZha3RvciB5YW5nIHRlcmJlbnR1ay4gSGFzaWwgRUZBIG1lbnlhcmFua2FuIHBlbmdlbG9tcG9ra2FuIGFzcGVrIHlhbmcgYmVyYmVkYSBkZW5nYW4gcmFuY2FuZ2FuIGt1ZXNpb25lciBtZXRha29nbmlzaSB5YW5nIGF3YWxueWEgdGVyZGlyaSBkYXJpIDIgYXNwZWsgeWFpdHUgZGVrbGFyYXRpZiBkYW4gcHJvc2VkdXJhbC4NCjIuIEFuYWxpc2lzIENGQSBtZW1idWt0aWthbiBiYWh3YSBmYWt0b3ItZmFrdG9yIHlhbmcgZGl0dXJ1bmthbiBiZXJkYXNhcmthbiBhbmFsaXNpcyBFRkEgY29jb2sgZGVuZ2FuIGRhdGEgKGZpdCkgeWFuZyBzZWhhcnVzbnlhIG1lbWJlcmlrYW4gc2FyYW4ga2VwYWRhIHBlcmFuY2FuZyBrdWVzaW9uZXIgdW50dWsgbWVueWVzdWFpa2FuIGluc3RydW1lbm55YSBiZXJzZXN1YWlhbiBkZW5nYW4gdWt1cmFuIGluaS4NCjMuIEluc3RydW1lbiBtYXNpaCBiZWx1bSBtZW1lbnVoaSBrcml0ZXJpYSByZWxpYWJpbGl0YXMgeWFuZyBtZW1hZGFpICg+IDAuNykNCjQuIFBlbW9kZWxhbiBHUk0geWFuZyBkaWxha3NhbmFrYW4gbWVudW5qdWtrYW4ga2V0aWRha2NvY29rYW4gZGF0YSBkZW5nYW4gbW9kZWwgbmFtdW4gbWVudW5qdWtrYW4ga2Vjb2Nva2thbiBpdGVtIGRhbiBwZXJzb24gdGVyaGFkYXAgbW9kZWwuIEhhc2lsIGluaSBtdW5na2luIGJpc2EgZGlzZWJhYmthbiBhc3Vtc2kgdW5pZGltZW5zaSB5YW5nIHRpZGFrIGRpcGVudWhpIGRhbiB0ZXJqYWRpbnlhIGluZGVwZW5kZW5zaSBsb2thbCBkaSBhbnRhcmEgYnV0aXIuIEFuYWxpc2lzIElSVCBtdWx0aWRpbWVuc2kgZGlzYXJhbmthbiB1bnR1ayBtZW1wZXJiYWlraSBwZW1vZGVsYW4geWFuZyB0ZWxhaCBkaWxha3NhbmFrYW4u