Pendahuluan

Insight

Dataset ini diambil dari data penjualan Coffee Chain dan telah difilter khusus untuk negara bagian Florida. Selanjutnya, dilakukan pengambilan sampel sebanyak 25 observasi secara acak untuk setiap jenis produk. Jenis produk yang dianalisis terdiri dari empat kategori yaitu Coffee, Espresso, Herbal Tea, dan Tea. Total data yang dianalisis berjumlah 100 observasi. Setiap jenis produk terdiri dari 25 sampel, sehingga distribusi data antar kategori merata.Uji yang akan dilakukan pada observasi ini adalah uji analisis variansi satu arah(one way ANOVA). Tujuan dari uji ANAVA adalah untuk mengetahui apakah terdapat perbedaan rata-rata penjualan yang signifikan antara keempat jenis produk di Florida. Dengan demikian, perusahaan dapat mengidentifikasi apakah jenis produk tertentu memiliki performa penjualan yang lebih tinggi dibandingkan yang lain secara statistik.

Uji Analisis Variansi Satu Arah

Analisis variansi (ANAVA) adalah suatu metode analisis statistik yang termasuk ke dalam cabang statistika inferensial. Analisis variansi digunakan untuk menguji perbedaan nilai rata-rata dari dua kelompok data atau lebih. Analisis variansi satu arah (One-Way ANOVA) merupakan teknik analisis yang digunakan untuk menguji perbedaan nilai rata-rata dari beberapa kelompok data yang dipengaruhi oleh satu faktor perlakuan. Asumsi yang harus terpenuhi sebelum melakukan uji anova adalah:

  1. Normalitas : residu setiap kelompok perlakuan dalam populasi harus berdistribusi normal.
  2. Homogenitas : variabilitas data pada setiap kelompok perlakuan dalam populasi haruslah relatif sama.

Model Matematis

Model linier analisis variansi satu arah (one-way ANOVA) yaitu: \[Y_{ij}= \mu+ \tau_i+ \varepsilon_{ij}\] dimana:

  • \(Y_{ij}\) = Nilai pengamatan ke-\(j\) dalam perlakuan (kelompok) ke-\(i\)
  • \(\mu_i\) = Rata-rata umum dari keseluruhan populasi
  • \(\tau_i\) = Efek perlakuan ke-\(i\),yaitu penyimpangan dari rata-rata perlakuan ke-\(i\) terhadap rata-rata umum
  • \(\varepsilon_{ij}\) = Galat (error) pengamatan ke-\(j\) dalam perlakuan ke-\(i\)
  • \(i=1,2,3,...,k\) (\(k\) adalah jumlah perlakuan/kelompok)
  • \(j=1,2,3,...,n_i\) (\(n_i\) adalah jumlah pengamatan dalam perlakuan ke-\(i\))

Tabel ANAVA

Menguji hipotesis yang telah dirumuskan dapat dilakukan dengan menggunakan analisis variansi satu arah terhadap data yang ingin dianalisis. Analisis ini memiliki tujuan untuk mengevaluasi perbedaan rata-rata antar kelompok perlakuan. Hasil perhitungan analisis variansi satu arah ditampilkan dalam tabel berikut.

Sumber.Keragaman Derajat.Kebebasan Jumlah.Kuadrat Rata.rata.Kuadrat F.Hitung
Perlakuan \(k - 1\) \(JKP = \frac{y_{i.}^2}{n_i}-\frac{y_{..}^2}{N}\) \(RKP = \frac{JKP}{k-1}\) \(\frac{RKP}{RKS}\)
Sesatan \(N - k\) \(JKS = JKT - JKP\) \(RKS = \frac{JKS}{N-k}\)
Total \(N - 1\) \(JKT = \sum_{i=1}^{k} y_{ij}^2 -\frac{y_{..}^2}{N}\)

Uji Tukey

Uji Tukey sering juga disebut dengan uji beda nyata jujur (BNJ) atau atau Honest Significant Difference (HSD) test, diperkenalkan oleh Tukey pada tahun 1953. Uji Tukey digunakan untuk membandingkan seluruh pasangan rata-rata perlakuan setelah uji Analisis variansi dilakukan. Uji Tukey dilakukan dilakukan jika hasil dari tabel ANAVA ditolak yang menyatakan bahwa terdapat peredaan yang signifikan sehingga untuk mengetahui kelompok mana yang memiliki perbedaan rata-rata yang signifikan dilakukan uji Tukey. Metode ini memperhitungkan tingkat kesalahan eksperimen secara keseluruhan (experiment-wise error rate) sehingga lebih tepat untuk perbandingan simultan antara banyak kelompok.

Hasil dan Pemahasan

Library

Berikut merupakan library yang diperlukan dalam membantu dalam melakukan analisis data.

library(readxl)
library(dplyr)
library(car)
library(knitr)
library(ggplot2)
library(DT)
library(kableExtra)

Data

Data yang digunakan merupakan sampel dari data penjualan Coffee Chain pada negara bagian Florida. Data terdiri dari 100 observasi yang diambil secara acak, dengan pembagian merata yaitu 25 observasi untuk setiap kategori produk, yaitu Coffee, Espresso, Herbal Tea, dan Tea. Dataset lengkapnya dapat diakses pada Chain Coffe Dataset.

set.seed(345)
data <- read_excel("D:/SIM/3. CM1 - Coffee Chain Datasets.xlsx") %>%
  filter(State == "Florida") %>%
  select(Product_Type = `Product Type`, Sales) %>%
  group_by(Product_Type) %>%
  sample_n(25)
DT::datatable(data, 
              filter = 'top', 
              options = list(
                pageLength = 10,
                lengthMenu = c(10, 20, 25, 50, 100) 
              ),
              caption = 'Data Penjualan Coffee Chain di Florida')

Analisis Deskriptif

Statistika Deskriptif

Pada langkah ini, dilakukan penghitungan statistika deskriptif untuk empat Product Type, yaitu Coffee, Espresso, Herbal Tea, dan Tea. Statistika deskriptif ini memberikan gambaran tentang sebaran dan karakteristik data pada variabel-variabel tersebut.

sumarry <- data %>%  
  mutate(row = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = Product_Type, values_from = Sales) %>%
  select(-row)
summary(sumarry)
##      Coffee       Espresso       Herbal Tea         Tea       
##  Min.   :197   Min.   :180.0   Min.   : 54.0   Min.   : 75.0  
##  1st Qu.:218   1st Qu.:201.0   1st Qu.:110.0   1st Qu.: 88.0  
##  Median :235   Median :221.0   Median :129.0   Median :113.0  
##  Mean   :245   Mean   :221.1   Mean   :128.2   Mean   :111.1  
##  3rd Qu.:277   3rd Qu.:234.0   3rd Qu.:154.0   3rd Qu.:129.0  
##  Max.   :341   Max.   :294.0   Max.   :194.0   Max.   :154.0

Boxplot

Boxplot akan membantu dalam memvisualisasi distribusi penjualan berdasarkan jenis produk. boxplot membantu dalam mengidentifikasi median penjualan, rentang interkuartil, dan nilai minimum serta nilai maksimum penjualan untuk setiap jenis produk. Visualisasi dibawah ini merupakan perbandingan langsung pola penjualan Coffee, Espresso, Herbal Tea, dan Tea.

ggplot(data, aes(x = Product_Type, y = Sales)) +
  geom_boxplot(fill = "#6BAE52", color = "#347928") +
  labs(title = "Boxplot Sales per Product Type",
       x = "Product Type",
       y = "Sales") +
  theme_minimal()

Uji Asumsi

Uji Normalitas (Saphiro-Wilk)

Dilakukan uji normalitas residu pada model anava.

  1. Hipotesis
    \(H_0=\) Data berdistribusi normal
    \(H_1=\) Data tidak berdistribusi normal
  2. Tingkat Signifikansi
    \(\alpha=0.05\)
  3. Daerah Kritis
    \(H_0\) ditolak jika \(P-value<\alpha\)
  4. Statistik Uji

    Menggunakan shapiro.test() untuk menguji normalitas residu pada model anava.

  5. anava <- aov(Sales ~ Product_Type, data = data)
    shapiro.test(anava$residuals)
    ## 
    ##  Shapiro-Wilk normality test
    ## 
    ## data:  anava$residuals
    ## W = 0.99232, p-value = 0.8442
  6. Kesimpulan

    \(P-value = 0.8442 > 0.05\) sehingga \(H_0\) gagal ditolak, yang berarti data berdistribusi normal dan uji asumsi normalitas terpenuhi.

Uji Homogenitas

DIlakukan uji homogenitas pada data.

  1. Hipotesis
    \(H_0=\) Varians penjualan keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di Florida adalah homogen (sama).
    \(H_1=\)Varians penjualan keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di Florida tidak homogen (berbeda).
  2. Tingkat Signifikansi
    \(\alpha=0.05\)
  3. Daerah Kritis
    \(H_0\) ditolak jika \(P-value<\alpha\)
  4. Statistik Uji

    Untuk menguji hmogenitas dapat menggunakan leveneTest().

    leveneTest(Sales ~ factor(Product_Type) ,data=data)
    ## Levene's Test for Homogeneity of Variance (center = median)
    ##       Df F value Pr(>F)
    ## group  3  1.8529 0.1428
    ##       96
  5. Kesimpulan

    \(P-value=0.1428>0.05\), sehingga \(H_0\) gagal ditolak, maka Varians penjualan keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di Florida adalah homogen (sama). Uji asumsi homogenitas terpenuhi.

Uji ANAVA

Dilakukan uji analisis variansi satu arah adalah untuk menganalisis apakah terdapat perbedaan signifikan pada tingkat penjualan (sales) antara empat jenis produk yaitu Coffee, Espresso, Herbal Tea, dan Tea di negara bagian Florida.Dipilih uji ANAVA karena memiliki kemampuan untuk membandingkan rata-rata penjualan ldari lebih 2 kelompok produk. Berikut langkah-langkah pengujian hipotesis.

  1. Hipotesis
    \(H_0=\)Tidak terdapat perbedaan yang signifikan pada rata-rata penjualan antara keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di negara bagian Florida.
    \(H_1=\)Terdapat perbedaan yang signifikan pada rata-rata penjualan antara keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di negara bagian Florida.
  2. Tingkat signifikansi
    \(\alpha=0.05\)
  3. Daerah Kritis
    \(H_0\) ditolak jika \(F_{hitung}>F_{tabel}\) atau \(P_{value}<0.05\)
  4. Statistik Uji

    telah didapatkan model anava sebelumnya, untuk mendapatkan hasil tabel ANAVA dapat diperoleh dengansummary()

    summary(anava)
    ##              Df Sum Sq Mean Sq F value Pr(>F)    
    ## Product_Type  3 332497  110832   99.94 <2e-16 ***
    ## Residuals    96 106460    1109                   
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  5. Kesimpulan

    \(P_{value}<0.05\) sehingga \(H_0\) ditolak, yang berarti terdapat perbedaan yang signifikan pada rata-rata penjualan antara keempat jenis produk (Coffee, Espresso, Herbal Tea, dan Tea) di negara bagian Florida.

Melalui kesimpulan yang telah didapatkan yang menyatakan \(H_0\) ditolak sehingga terdapat perbedaan rata-rata yang signifikan, maka dilanjutkan dengan uji lajut yaitu uji Tukey.

Uji Tukey

Setelah melalui uji ANAVA yang diketahui terdapat perbedaan yang signifikan terhadap rata-rata penjualan keempat jenis produk. Langkah selanjutnya adalah mengidentifikasi secara spesifik jenis produk mana yang memiliki perbedaan rata-rata penjualan yang signifikan dengan menggunakan uji Tukey Honestly Significant Difference (HSD). Berikut hasil uji Tukey.

TukeyHSD(anava)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Sales ~ Product_Type, data = data)
## 
## $Product_Type
##                        diff        lwr          upr     p adj
## Espresso-Coffee      -23.92  -48.54681    0.7068106 0.0602137
## Herbal Tea-Coffee   -116.88 -141.50681  -92.2531894 0.0000000
## Tea-Coffee          -133.92 -158.54681 -109.2931894 0.0000000
## Herbal Tea-Espresso  -92.96 -117.58681  -68.3331894 0.0000000
## Tea-Espresso        -110.00 -134.62681  -85.3731894 0.0000000
## Tea-Herbal Tea       -17.04  -41.66681    7.5868106 0.2754017

Berdasarkan output uji Tukey HSD yang diberikan, berikut interpretasi dari perbandingan rata-rata penjualan antara keempat jenis produk di Florida.

  1. Espresso vs Coffee
    • Selisih rata-rata: -23.92 (Coffee leih tinggi daripada Esresso)
    • Interval kepercayaan 95%: [-48.54681, 0.7068106]
    • Nilai p adj: 0.0602137 > 0.05
    • Interpretasi: Tidak terdapat perbedaan yang signifikan secara statistik antara penjualan Coffee dengan Espresso pada tingkat signifikan 5%. Meskipun ada selisih rata-rata sebesar 23.92 unit, perbedaan ini tidak cukup besar untuk dianggap berbeda signifikan pada tingkat kepercayaan 95%.
  2. Herbal Tea vs Coffee
    • Selisih rata-rata: -116.88 (Coffee leih tinggi daripada Herbal Tea)
    • Interval kepercayaan 95%: [-141.50681, -92.2531894]
    • Nilai p adj: 0.0000000 < 0.05
    • Interpretasi: Terdapat perbedaan yang signifikan secara statistik antara penjualan Coffee dengan Herbal Tea pada tingkat signifikan 5%. Coffee memiliki rata-rata penjualan yang jauh lebih tinggi dengan selisih 116.88 unit dibandingkan Herbal Tea.
  3. Tea vs Coffee
    • Selisih rata-rata: -133.92 (Coffee leih tinggi daripada Tea)
    • Interval kepercayaan 95%: [-158.54681, -109.2931894]
    • Nilai p adj: 0.0000000 < 0.05
    • Interpretasi: Terdapat perbedaan yang signifikan secara statistik antara penjualan Coffee dengan Tea pada tingkat signifikan 5%. Coffee memiliki rata-rata penjualan yang jauh lebih tinggi dengan selisih 133.92 unit dibandingkan Tea.
  4. Herbal Tea vs Espresso
    • Selisih rata-rata: -92.96 (Espresso leih tinggi daripada Herbal Tea)
    • Interval kepercayaan 95%: [-117.58681, -68.3331894]
    • Nilai p adj: 0.0000000 < 0.05
    • Interpretasi: Terdapat perbedaan yang signifikan secara statistik antara penjualan Herbal Tea dengan Espresso pada tingkat signifikan 5%. Espresso memiliki rata-rata penjualan yang jauh lebih tinggi dengan selisih 92.96 unit dibandingkan Herbal Tea.
  5. Tea vs Espresso
    • Selisih rata-rata: -110.00 (Espresso leih tinggi daripada Tea)
    • Interval kepercayaan 95%: [-134.62681, -85.3731894]
    • Nilai p adj: 0.0000000 < 0.05
    • Interpretasi: Terdapat perbedaan yang signifikan secara statistik antara penjualan Tea dengan Espresso pada tingkat signifikan 5%. Espresso memiliki rata-rata penjualan yang jauh lebih tinggi dengan selisih 110.00 unit dibandingkan Tea.
  6. Tea vs Herbal Tea
    • Selisih rata-rata: -17.04 (Herbal Tea leih tinggi daripada Tea)
    • Interval kepercayaan 95%: [-41.66681, 7.5868106]
    • Nilai p adj: 0.0000000 < 0.05
    • Interpretasi: Terdapat perbedaan yang signifikan secara statistik antara penjualan Tea dengan Herbal Tea pada tingkat signifikan 5%. Meskipun ada selisih rata-rata sebesar 17.04 unit, perbedaan ini tidak cukup besar untuk dianggap berbeda signifikan pada tingkat kepercayaan 95%.

Kesimpulan

Berdasarkan hasil analisis ANAVA satu arah terhadap rata-rata penjualan empat jenis produk Coffee Chain (Coffee, Espresso, Herbal Tea, dan Tea) di negara bagian Florida, diperoleh bahwa asumsi normalitas dan homogenitas varians terpenuhi. Namun, hasil uji ANOVA menunjukkan bahwa terdapat perbedaan yang signifikan secara statistik antara rata-rata penjualan keempat jenis produk tersebut (nilai \(P-value < 0.05\)), sehingga hipotesis nol ditolak.

Selanjutnya, uji lanjutan Tukey HSD dilakukan untuk mengetahui pasangan jenis produk mana yang memiliki perbedaan signifikan. Hasil uji Tukey menunjukkan bahwa:

  1. Coffee memiliki rata-rata penjualan yang secara signifikan lebih tinggi dibandingkan Herbal Tea dan Tea.
  2. Espresso memiliki rata-rata penjualan yang secara signifikan lebih tinggi dibandingkan Herbal Tea dan Tea.
  3. Tidak terdapat perbedaan yang signifikan antara penjualan Coffee dan Espresso, meskipun Coffee sedikit lebih tinggi secara rata-rata.
  4. Terdapat perbedaan signifikan antara Herbal Tea dan Tea, meskipun Herbal Tea sedikit lebih tinggi secara rata-rata.

Dengan demikian, produk Coffee dan Espresso merupakan dua jenis minuman dengan performa penjualan tertinggi, sedangkan Herbal Tea dan Tea merupakan dua jenis produk dengan performa penjualan yang lebih rendah secara signifikan. Analisis ini dapat menjadi dasar dalam pengambilan keputusan strategis, seperti fokus promosi atau alokasi persediaan, khususnya untuk pasar di wilayah Florida.

LS0tDQp0aXRsZTogIlBlcmJhbmRpbmdhbiBSYXRhLVJhdGEgUGVuanVhbGFuIEVtcGF0IEplbmlzIFByb2R1ayBDb2ZmZWUgQ2hhaW4gZGkgRmxvcmlkYSBNZW5nZ3VuYWthbiBBbmFsaXNpcyBWYXJpYW5zaSBTYXR1IEFyYWggIg0KYXV0aG9yOiAiUmF0cmlhIEF6ZWxpYSBQdXRyaSBDaGlhcmEgQWd1bWkgKE0wNzIzMDczKSINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KPHN0eWxlPg0KLnRpdGxlIHsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiBmb250LXdlaWdodDogYm9sZDsNCiBjb2xvcjogIzM0NzkyODsNCiBmb250LXNpemU6IDYwcHg7DQogdGV4dC1hbGlnbjogY2VudGVyDQp9DQoNCi5hdXRob3Igew0KIGZvbnQtZmFtaWx5OiBDYW5kYXJhOw0KIGZvbnQtc2l6ZTogMThweDsNCiB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQogDQouYXV0aG9yOmJlZm9yZSB7DQogIGNvbnRlbnQ6ICLwn5GkICI7DQogIGZvbnQtc2l6ZTogMC44ZW07IA0KfQ0KIA0KYm9keXsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmNWVkOw0KfQ0KDQpoMSB7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogY29sb3I6ICM1NDMzMTA7DQogdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LXNpemU6IDM1cHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCmgyIHsNCiBjb2xvciA6ICM3NDUxMkQ7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCiBmb250LXNpemU6IDI1cHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCmgzIHsNCiBjb2xvciA6ICNBRjhGNkY7DQogZm9udC1mYW1pbHk6IENhbmRhcmE7DQogdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCiBmb250LXNpemU6IDIycHg7DQogZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQoNCm9sIHsNCiBjb2xvciA6IGJsYWNrOw0KIGZvbnQtZmFtaWx5OiBDYW5kYXJhOw0KIHRleHQtYWxpZ246IGp1c3RpZnk7DQogZm9udC1zaXplOiAxNnB4Ow0KfQ0KDQp1bCB7DQogY29sb3IgOiBibGFjazsNCiBmb250LWZhbWlseTogQ2FuZGFyYTsNCiB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KIGZvbnQtc2l6ZTogMTZweDsNCn0NCg0KcHsNCiB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KIGZvbnQtc2l6ZTogMTZweDsNCiBjb2xvcjogYmxhY2s7DQp9DQoNCi5tYXRoIHsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogbm9ybWFsOw0KfQ0KDQpwcmUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KICBib3JkZXI6IDFweCBzb2xpZCAjRTBFMEUwOw0KICBwYWRkaW5nOiAxMHB4Ow0KICBib3JkZXItcmFkaXVzOiA2cHg7DQp9DQoNCi50b2NpZnkgLnRvY2lmeS1pdGVtLmFjdGl2ZSwNCi50b2NpZnkgLnRvY2lmeS1pdGVtLmhpZ2hsaWdodCB7DQogIGJhY2tncm91bmQtY29sb3I6ICM1NDMzMTAgIWltcG9ydGFudDsgDQogIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Ow0KfQ0KDQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQo8aDE+UGVuZGFodWx1YW48L2gxPg0KDQo8aDI+Kkluc2lnaHQqPC9oMj4NCg0KPHA+IERhdGFzZXQgaW5pIGRpYW1iaWwgZGFyaSBkYXRhIHBlbmp1YWxhbiBDb2ZmZWUgQ2hhaW4gZGFuIHRlbGFoIGRpZmlsdGVyIGtodXN1cyB1bnR1ayBuZWdhcmEgYmFnaWFuIEZsb3JpZGEuIFNlbGFuanV0bnlhLCBkaWxha3VrYW4gcGVuZ2FtYmlsYW4gc2FtcGVsIHNlYmFueWFrIDI1IG9ic2VydmFzaSBzZWNhcmEgYWNhayB1bnR1ayBzZXRpYXAgamVuaXMgcHJvZHVrLiBKZW5pcyBwcm9kdWsgeWFuZyBkaWFuYWxpc2lzIHRlcmRpcmkgZGFyaSBlbXBhdCBrYXRlZ29yaSB5YWl0dSAqQ29mZmVlLCBFc3ByZXNzbywgSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gVG90YWwgZGF0YSB5YW5nIGRpYW5hbGlzaXMgYmVyanVtbGFoIDEwMCBvYnNlcnZhc2kuIFNldGlhcCBqZW5pcyBwcm9kdWsgdGVyZGlyaSBkYXJpIDI1IHNhbXBlbCwgc2VoaW5nZ2EgZGlzdHJpYnVzaSBkYXRhIGFudGFyIGthdGVnb3JpIG1lcmF0YS5VamkgeWFuZyBha2FuIGRpbGFrdWthbiBwYWRhIG9ic2VydmFzaSBpbmkgYWRhbGFoIHVqaSBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWgoKm9uZSB3YXkgQU5PVkEqKS4gVHVqdWFuIGRhcmkgdWppIEFOQVZBIGFkYWxhaCB1bnR1ayBtZW5nZXRhaHVpIGFwYWthaCB0ZXJkYXBhdCBwZXJiZWRhYW4gcmF0YS1yYXRhIHBlbmp1YWxhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrIGRpIEZsb3JpZGEuIERlbmdhbiBkZW1pa2lhbiwgcGVydXNhaGFhbiBkYXBhdCBtZW5naWRlbnRpZmlrYXNpIGFwYWthaCBqZW5pcyBwcm9kdWsgdGVydGVudHUgbWVtaWxpa2kgcGVyZm9ybWEgcGVuanVhbGFuIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiB5YW5nIGxhaW4gc2VjYXJhIHN0YXRpc3Rpay4gPC9wPg0KDQo8aDI+VWppIEFuYWxpc2lzIFZhcmlhbnNpIFNhdHUgQXJhaDwvaDI+DQoNCjxwPkFuYWxpc2lzIHZhcmlhbnNpIChBTkFWQSkgYWRhbGFoIHN1YXR1IG1ldG9kZSBhbmFsaXNpcyBzdGF0aXN0aWsgeWFuZyB0ZXJtYXN1ayBrZSBkYWxhbSBjYWJhbmcgc3RhdGlzdGlrYSBpbmZlcmVuc2lhbC4gQW5hbGlzaXMgdmFyaWFuc2kgZGlndW5ha2FuIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIG5pbGFpIHJhdGEtcmF0YSBkYXJpIGR1YSBrZWxvbXBvayBkYXRhIGF0YXUgbGViaWguIEFuYWxpc2lzIHZhcmlhbnNpIHNhdHUgYXJhaCAoKk9uZS1XYXkgQU5PVkEqKSBtZXJ1cGFrYW4gdGVrbmlrIGFuYWxpc2lzIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIG5pbGFpIHJhdGEtcmF0YSBkYXJpIGJlYmVyYXBhIGtlbG9tcG9rIGRhdGEgeWFuZyBkaXBlbmdhcnVoaSBvbGVoIHNhdHUgZmFrdG9yIHBlcmxha3Vhbi4gQXN1bXNpIHlhbmcgaGFydXMgdGVycGVudWhpIHNlYmVsdW0gbWVsYWt1a2FuIHVqaSBhbm92YSBhZGFsYWg6PGJyPg0KPG9sPg0KPGxpPk5vcm1hbGl0YXMgOiByZXNpZHUgc2V0aWFwIGtlbG9tcG9rIHBlcmxha3VhbiBkYWxhbSBwb3B1bGFzaSBoYXJ1cyBiZXJkaXN0cmlidXNpIG5vcm1hbC48L2xpPg0KPGxpPkhvbW9nZW5pdGFzIDogdmFyaWFiaWxpdGFzIGRhdGEgcGFkYSBzZXRpYXAga2Vsb21wb2sgcGVybGFrdWFuIGRhbGFtIHBvcHVsYXNpIGhhcnVzbGFoIHJlbGF0aWYgc2FtYS48L2xpPg0KPC9vbD4NCjwvcD4NCg0KPGgzPk1vZGVsIE1hdGVtYXRpczwvaDM+DQoNCjxwPiBNb2RlbCBsaW5pZXIgYW5hbGlzaXMgdmFyaWFuc2kgc2F0dSBhcmFoICgqb25lLXdheSBBTk9WQSopIHlhaXR1Og0KJCRZX3tpan09IFxtdSsgXHRhdV9pKyBcdmFyZXBzaWxvbl97aWp9JCQNCmRpbWFuYToNCjx1bD4NCiAgPGxpPiRZX3tpan0kID0gTmlsYWkgcGVuZ2FtYXRhbiBrZS0kaiQgZGFsYW0gcGVybGFrdWFuIChrZWxvbXBvaykga2UtJGkkPC9saT4NCiAgPGxpPiRcbXVfaSQgPSBSYXRhLXJhdGEgdW11bSBkYXJpIGtlc2VsdXJ1aGFuIHBvcHVsYXNpPC9saT4NCiAgPGxpPiRcdGF1X2kkID0gIEVmZWsgcGVybGFrdWFuIGtlLSRpJCx5YWl0dSBwZW55aW1wYW5nYW4gZGFyaSByYXRhLXJhdGEgcGVybGFrdWFuIGtlLSRpJCB0ZXJoYWRhcCByYXRhLXJhdGEgdW11bTwvbGk+DQogIDxsaT4kXHZhcmVwc2lsb25fe2lqfSQgPSBHYWxhdCAoKmVycm9yKikgcGVuZ2FtYXRhbiBrZS0kaiQgZGFsYW0gcGVybGFrdWFuIGtlLSRpJDwvbGk+DQogIDxsaT4kaT0xLDIsMywuLi4sayQgKCRrJCBhZGFsYWgganVtbGFoIHBlcmxha3Vhbi9rZWxvbXBvayk8L2xpPg0KICA8bGk+JGo9MSwyLDMsLi4uLG5faSQgKCRuX2kkIGFkYWxhaCBqdW1sYWggcGVuZ2FtYXRhbiBkYWxhbSBwZXJsYWt1YW4ga2UtJGkkKTwvbGk+DQo8L3VsPg0KDQo8aDM+VGFiZWwgQU5BVkE8L2gzPg0KDQo8cD5NZW5ndWppIGhpcG90ZXNpcyB5YW5nIHRlbGFoIGRpcnVtdXNrYW4gZGFwYXQgZGlsYWt1a2FuIGRlbmdhbiBtZW5nZ3VuYWthbiBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWggdGVyaGFkYXAgZGF0YSB5YW5nIGluZ2luIGRpYW5hbGlzaXMuIEFuYWxpc2lzIGluaSBtZW1pbGlraSB0dWp1YW4gdW50dWsgbWVuZ2V2YWx1YXNpIHBlcmJlZGFhbiByYXRhLXJhdGEgYW50YXIga2Vsb21wb2sgcGVybGFrdWFuLiBIYXNpbCBwZXJoaXR1bmdhbiBhbmFsaXNpcyB2YXJpYW5zaSBzYXR1IGFyYWggZGl0YW1waWxrYW4gZGFsYW0gdGFiZWwgYmVyaWt1dC48L3A+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KYGBgDQoNCmBgYHtyIHRhYmVsLWFuYXZhLCBlY2hvPUZBTFNFfQ0KYW5hdmFfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgYFN1bWJlciBLZXJhZ2FtYW5gID0gYygiUGVybGFrdWFuIiwgIlNlc2F0YW4iLCAiVG90YWwiKSwNCiAgYERlcmFqYXQgS2ViZWJhc2FuYCA9IGMoIiRrIC0gMSQiLCAiJE4gLSBrJCIsICIkTiAtIDEkIiksDQogIGBKdW1sYWggS3VhZHJhdGAgPSBjKCIkSktQID0gXFxmcmFje3lfe2kufV4yfXtuX2l9LVxcZnJhY3t5X3suLn1eMn17Tn0kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICIkSktTID0gSktUIC0gSktQJCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiJEpLVCA9IFxcc3VtX3tpPTF9XntrfSB5X3tpan1eMiAtXFxmcmFje3lfey4ufV4yfXtOfSQiKSwNCiAgYFJhdGEtcmF0YSBLdWFkcmF0YCA9IGMoIiRSS1AgPSBcXGZyYWN7SktQfXtrLTF9JCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiJFJLUyA9IFxcZnJhY3tKS1N9e04ta30kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICIiKSwNCiAgYEYgSGl0dW5nYCA9IGMoIiRcXGZyYWN7UktQfXtSS1N9JCIsICIiLCAiIikNCikNCg0Ka2FibGUoYW5hdmFfdGFibGUsIGVzY2FwZSA9IEZBTFNFLCBhbGlnbiA9ICJjIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSwgDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IFRSVUUNCiAgICAgICAgICAgICAgICApICU+JQ0KICByb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gIiM0QTk0MzUiLCBjb2xvciA9ICIjZmZmYWVkIiwgZm9udF9zaXplID0gMTYpICU+JQ0KICByb3dfc3BlYygxOjMsIGZvbnRfc2l6ZSA9IDE2KSAgJT4lDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmZmZhZWQiKSAlPiUNCiAgcm93X3NwZWMoMiwgYmFja2dyb3VuZCA9ICIjZmZmYWVkIikgJT4lIA0KICByb3dfc3BlYygzLCBiYWNrZ3JvdW5kID0gIiNmZmZhZWQiKQ0KYGBgDQoNCjxoMj5VamkgVHVrZXk8L2gyPg0KDQo8cD5VamkgVHVrZXkgc2VyaW5nIGp1Z2EgZGlzZWJ1dCBkZW5nYW4gdWppIGJlZGEgbnlhdGEganVqdXIgKEJOSikgYXRhdSAgYXRhdSBIb25lc3QgKlNpZ25pZmljYW50IERpZmZlcmVuY2UqIChIU0QpICp0ZXN0KiwgZGlwZXJrZW5hbGthbiBvbGVoIFR1a2V5IHBhZGEgdGFodW4gMTk1My4gVWppIFR1a2V5IGRpZ3VuYWthbiB1bnR1ayBtZW1iYW5kaW5na2FuIHNlbHVydWggcGFzYW5nYW4gcmF0YS1yYXRhIHBlcmxha3VhbiBzZXRlbGFoIHVqaSBBbmFsaXNpcyB2YXJpYW5zaSBkaWxha3VrYW4uIFVqaSBUdWtleSBkaWxha3VrYW4gZGlsYWt1a2FuIGppa2EgaGFzaWwgZGFyaSB0YWJlbCBBTkFWQSBkaXRvbGFrIHlhbmcgbWVueWF0YWthbiBiYWh3YSB0ZXJkYXBhdCBwZXJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VoaW5nZ2EgdW50dWsgbWVuZ2V0YWh1aSBrZWxvbXBvayBtYW5hIHlhbmcgbWVtaWxpa2kgcGVyYmVkYWFuIHJhdGEtcmF0YSB5YW5nIHNpZ25pZmlrYW4gZGlsYWt1a2FuIHVqaSBUdWtleS4gTWV0b2RlIGluaSBtZW1wZXJoaXR1bmdrYW4gdGluZ2thdCBrZXNhbGFoYW4gZWtzcGVyaW1lbiBzZWNhcmEga2VzZWx1cnVoYW4gKCpleHBlcmltZW50LXdpc2UgZXJyb3IgcmF0ZSopIHNlaGluZ2dhIGxlYmloIHRlcGF0IHVudHVrIHBlcmJhbmRpbmdhbiBzaW11bHRhbiBhbnRhcmEgYmFueWFrIGtlbG9tcG9rLjwvcD4NCg0KDQo8aDE+SGFzaWwgZGFuIFBlbWFoYXNhbjwvaDE+DQoNCjxoMj4qTGlicmFyeSo8L2gyPg0KDQo8cD5CZXJpa3V0IG1lcnVwYWthbiBsaWJyYXJ5IHlhbmcgZGlwZXJsdWthbiBkYWxhbSBtZW1iYW50dSBkYWxhbSBtZWxha3VrYW4gYW5hbGlzaXMgZGF0YS48L3A+DQoNCmBgYHtyIEJ1dHVoLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmBgYA0KDQo8aDI+RGF0YTwvaDI+DQoNCjxwPkRhdGEgeWFuZyBkaWd1bmFrYW4gbWVydXBha2FuIHNhbXBlbCBkYXJpIGRhdGEgcGVuanVhbGFuIENvZmZlZSBDaGFpbiBwYWRhIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS4gRGF0YSB0ZXJkaXJpIGRhcmkgMTAwIG9ic2VydmFzaSB5YW5nIGRpYW1iaWwgc2VjYXJhIGFjYWssIGRlbmdhbiBwZW1iYWdpYW4gbWVyYXRhIHlhaXR1IDI1IG9ic2VydmFzaSB1bnR1ayBzZXRpYXAga2F0ZWdvcmkgcHJvZHVrLCB5YWl0dSAqQ29mZmVlLCBFc3ByZXNzbywgSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gRGF0YXNldCBsZW5na2FwbnlhIGRhcGF0IGRpYWtzZXMgcGFkYSA8YSBocmVmPSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xdWxRdUpNVnpzemlRZnNTcVVEZDNFN2FFU3h0OUtWZkV2Um5KMjNDMUkzRS9lZGl0P3VzcD1zaGFyaW5nIj5DaGFpbiBDb2ZmZSBEYXRhc2V0PC9hPi48L3A+IA0KDQpgYGB7ciBqYWxhbiwgZWNobz1UUlVFLCBmaWcuaGVpZ2h0PTQwMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpzZXQuc2VlZCgzNDUpDQpkYXRhIDwtIHJlYWRfZXhjZWwoIkQ6L1NJTS8zLiBDTTEgLSBDb2ZmZWUgQ2hhaW4gRGF0YXNldHMueGxzeCIpICU+JQ0KICBmaWx0ZXIoU3RhdGUgPT0gIkZsb3JpZGEiKSAlPiUNCiAgc2VsZWN0KFByb2R1Y3RfVHlwZSA9IGBQcm9kdWN0IFR5cGVgLCBTYWxlcykgJT4lDQogIGdyb3VwX2J5KFByb2R1Y3RfVHlwZSkgJT4lDQogIHNhbXBsZV9uKDI1KQ0KRFQ6OmRhdGF0YWJsZShkYXRhLCANCiAgICAgICAgICAgICAgZmlsdGVyID0gJ3RvcCcsIA0KICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdCgNCiAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTAsDQogICAgICAgICAgICAgICAgbGVuZ3RoTWVudSA9IGMoMTAsIDIwLCAyNSwgNTAsIDEwMCkgDQogICAgICAgICAgICAgICksDQogICAgICAgICAgICAgIGNhcHRpb24gPSAnRGF0YSBQZW5qdWFsYW4gQ29mZmVlIENoYWluIGRpIEZsb3JpZGEnKQ0KYGBgDQoNCg0KPGgyPkFuYWxpc2lzIERlc2tyaXB0aWY8L2gyPg0KDQo8aDM+U3RhdGlzdGlrYSBEZXNrcmlwdGlmPC9oMz4NCg0KPHA+UGFkYSBsYW5na2FoIGluaSwgZGlsYWt1a2FuIHBlbmdoaXR1bmdhbiBzdGF0aXN0aWthIGRlc2tyaXB0aWYgdW50dWsgZW1wYXQgKlByb2R1Y3QgVHlwZSosIHlhaXR1ICpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKi4gU3RhdGlzdGlrYSBkZXNrcmlwdGlmIGluaSBtZW1iZXJpa2FuIGdhbWJhcmFuIHRlbnRhbmcgc2ViYXJhbiBkYW4ga2FyYWt0ZXJpc3RpayBkYXRhIHBhZGEgdmFyaWFiZWwtdmFyaWFiZWwgdGVyc2VidXQuPC9wPg0KDQpgYGB7ciBkZXNrcmlwdGlmfQ0Kc3VtYXJyeSA8LSBkYXRhICU+JSAgDQogIG11dGF0ZShyb3cgPSByb3dfbnVtYmVyKCkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQcm9kdWN0X1R5cGUsIHZhbHVlc19mcm9tID0gU2FsZXMpICU+JQ0KICBzZWxlY3QoLXJvdykNCnN1bW1hcnkoc3VtYXJyeSkNCmBgYA0KDQo8aDM+Qm94cGxvdDwvaDM+DQoNCjxwPkJveHBsb3QgYWthbiBtZW1iYW50dSBkYWxhbSBtZW12aXN1YWxpc2FzaSBkaXN0cmlidXNpIHBlbmp1YWxhbiBiZXJkYXNhcmthbiBqZW5pcyBwcm9kdWsuIGJveHBsb3QgbWVtYmFudHUgZGFsYW0gbWVuZ2lkZW50aWZpa2FzaSBtZWRpYW4gcGVuanVhbGFuLCByZW50YW5nIGludGVya3VhcnRpbCwgZGFuIG5pbGFpIG1pbmltdW0gc2VydGEgbmlsYWkgbWFrc2ltdW0gcGVuanVhbGFuIHVudHVrIHNldGlhcCBqZW5pcyBwcm9kdWsuIFZpc3VhbGlzYXNpIGRpYmF3YWggaW5pIG1lcnVwYWthbiBwZXJiYW5kaW5nYW4gbGFuZ3N1bmcgcG9sYSBwZW5qdWFsYW4gKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqLjwvcD4NCg0KYGBge3Iga290YWt9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBQcm9kdWN0X1R5cGUsIHkgPSBTYWxlcykpICsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzZCQUU1MiIsIGNvbG9yID0gIiMzNDc5MjgiKSArDQogIGxhYnModGl0bGUgPSAiQm94cGxvdCBTYWxlcyBwZXIgUHJvZHVjdCBUeXBlIiwNCiAgICAgICB4ID0gIlByb2R1Y3QgVHlwZSIsDQogICAgICAgeSA9ICJTYWxlcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KPGgyPlVqaSBBc3Vtc2k8L2gyPg0KDQo8aDM+VWppIE5vcm1hbGl0YXMgKFNhcGhpcm8tV2lsayk8L2gzPg0KPHA+RGlsYWt1a2FuIHVqaSBub3JtYWxpdGFzIHJlc2lkdSBwYWRhIG1vZGVsIGFuYXZhLjwvcD4NCjxvbD4NCiAgPGxpPioqSGlwb3Rlc2lzKio8YnI+DQogICAgICAkSF8wPSQgRGF0YSBiZXJkaXN0cmlidXNpIG5vcm1hbCA8YnI+DQogICAgICAkSF8xPSQgRGF0YSB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbDwvbGk+DQogIDxsaT4qKlRpbmdrYXQgU2lnbmlmaWthbnNpKio8YnI+DQogICAgICAkXGFscGhhPTAuMDUkPC9saT4NCiAgPGxpPioqRGFlcmFoIEtyaXRpcyoqPGJyPg0KICAgICAgJEhfMCQgZGl0b2xhayBqaWthICRQLXZhbHVlPFxhbHBoYSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgIDxwPk1lbmdndW5ha2FuIGBgYHNoYXBpcm8udGVzdCgpYGBgIHVudHVrIG1lbmd1amkgbm9ybWFsaXRhcyByZXNpZHUgcGFkYSBtb2RlbCBhbmF2YS48L1A+IDwvbGk+DQoNCmBgYHtyIG5vcm1hbGl0YXN9DQphbmF2YSA8LSBhb3YoU2FsZXMgfiBQcm9kdWN0X1R5cGUsIGRhdGEgPSBkYXRhKQ0Kc2hhcGlyby50ZXN0KGFuYXZhJHJlc2lkdWFscykNCmBgYA0KDQogIDxsaT4qKktlc2ltcHVsYW4qKjxicj4NCiAgICAgIDxwPiRQLXZhbHVlID0gMC44NDQyID4gMC4wNSQgc2VoaW5nZ2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBiZXJhcnRpIGRhdGEgYmVyZGlzdHJpYnVzaSBub3JtYWwgZGFuIHVqaSBhc3Vtc2kgbm9ybWFsaXRhcyAqKnRlcnBlbnVoaSoqLjwvbGk+PC9QPg0KPC9vbD4NCg0KPGgzPlVqaSBIb21vZ2VuaXRhczwvaDM+DQoNCjxwPkRJbGFrdWthbiB1amkgaG9tb2dlbml0YXMgcGFkYSBkYXRhLjwvcD4NCg0KPG9sPg0KICA8bGk+KipIaXBvdGVzaXMqKjxicj4NCiAgICAgICRIXzA9JCBWYXJpYW5zIHBlbmp1YWxhbiBrZWVtcGF0IGplbmlzIHByb2R1ayAoKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqKSBkaSBGbG9yaWRhIGFkYWxhaCBob21vZ2VuIChzYW1hKS48YnI+DQogICAgICAkSF8xPSRWYXJpYW5zIHBlbmp1YWxhbiBrZWVtcGF0IGplbmlzIHByb2R1ayAoKkNvZmZlZSosICpFc3ByZXNzbyosICpIZXJiYWwgVGVhKiwgZGFuICpUZWEqKSBkaSBGbG9yaWRhIHRpZGFrIGhvbW9nZW4gKGJlcmJlZGEpLjwvbGk+DQogIDxsaT4qKlRpbmdrYXQgU2lnbmlmaWthbnNpKio8YnI+DQogICAgICAkXGFscGhhPTAuMDUkPC9saT4NCiAgPGxpPioqRGFlcmFoIEtyaXRpcyoqPGJyPg0KICAgICAgJEhfMCQgZGl0b2xhayBqaWthICRQLXZhbHVlPFxhbHBoYSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgICA8cD5VbnR1ayBtZW5ndWppIGhtb2dlbml0YXMgZGFwYXQgbWVuZ2d1bmFrYW4gYGBgbGV2ZW5lVGVzdCgpYGBgLjwvcD4NCiAgICAgIA0KYGBge3IgaG9tb2dlbml0YXN9DQpsZXZlbmVUZXN0KFNhbGVzIH4gZmFjdG9yKFByb2R1Y3RfVHlwZSkgLGRhdGE9ZGF0YSkNCmBgYA0KICANCiAgPC9saT4NCiAgPGxpPioqS2VzaW1wdWxhbioqPGJyPg0KICAgICAgPHA+JFAtdmFsdWU9MC4xNDI4PjAuMDUkLCBzZWhpbmdnYSAkSF8wJCBnYWdhbCBkaXRvbGFrLCBtYWthIFZhcmlhbnMgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIEZsb3JpZGEgYWRhbGFoIGhvbW9nZW4gKHNhbWEpLiBVamkgYXN1bXNpIGhvbW9nZW5pdGFzICoqdGVycGVudWhpKiouPC9saT48L3A+DQo8L29sPg0KDQoNCjxoMj5VamkgQU5BVkE8L2gyPg0KDQo8cD5EaWxha3VrYW4gdWppIGFuYWxpc2lzIHZhcmlhbnNpIHNhdHUgYXJhaCBhZGFsYWggdW50dWsgbWVuZ2FuYWxpc2lzIGFwYWthaCB0ZXJkYXBhdCBwZXJiZWRhYW4gc2lnbmlmaWthbiBwYWRhIHRpbmdrYXQgcGVuanVhbGFuICgqc2FsZXMqKSBhbnRhcmEgZW1wYXQgamVuaXMgcHJvZHVrIHlhaXR1ICpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKiBkaSBuZWdhcmEgYmFnaWFuIEZsb3JpZGEuRGlwaWxpaCB1amkgQU5BVkEga2FyZW5hIG1lbWlsaWtpIGtlbWFtcHVhbiB1bnR1ayBtZW1iYW5kaW5na2FuIHJhdGEtcmF0YSBwZW5qdWFsYW4gbGRhcmkgbGViaWggMiBrZWxvbXBvayBwcm9kdWsuIEJlcmlrdXQgbGFuZ2thaC1sYW5na2FoIHBlbmd1amlhbiBoaXBvdGVzaXMuPC9wPg0KDQo8b2w+DQogIDxsaT4qKkhpcG90ZXNpcyoqPGJyPg0KICAgICAgJEhfMD0kVGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBwYWRhIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS48YnI+DQogICAgICAkSF8xPSRUZXJkYXBhdCBwZXJiZWRhYW4geWFuZyBzaWduaWZpa2FuIHBhZGEgcmF0YS1yYXRhIHBlbmp1YWxhbiBhbnRhcmEga2VlbXBhdCBqZW5pcyBwcm9kdWsgKCpDb2ZmZWUqLCAqRXNwcmVzc28qLCAqSGVyYmFsIFRlYSosIGRhbiAqVGVhKikgZGkgbmVnYXJhIGJhZ2lhbiBGbG9yaWRhLg0KICA8L2xpPg0KICA8bGk+KipUaW5na2F0IHNpZ25pZmlrYW5zaSoqPGJyPg0KICAgICAgJFxhbHBoYT0wLjA1JCA8L2xpPg0KICA8bGk+KipEYWVyYWggS3JpdGlzKio8YnI+DQogICAgICAkSF8wJCBkaXRvbGFrIGppa2EgJEZfe2hpdHVuZ30+Rl97dGFiZWx9JCBhdGF1ICRQX3t2YWx1ZX08MC4wNSQ8L2xpPg0KICA8bGk+KipTdGF0aXN0aWsgVWppKio8YnI+DQogICAgICA8cD50ZWxhaCBkaWRhcGF0a2FuIG1vZGVsIGFuYXZhIHNlYmVsdW1ueWEsIHVudHVrIG1lbmRhcGF0a2FuIGhhc2lsIHRhYmVsIEFOQVZBIGRhcGF0IGRpcGVyb2xlaCBkZW5nYW5gYGBzdW1tYXJ5KClgYGA8L3A+DQogICAgICANCmBgYHtyIGFuYXZhfQ0Kc3VtbWFyeShhbmF2YSkNCmBgYA0KICA8L2xpPg0KICA8bGk+KipLZXNpbXB1bGFuKio8YnI+DQogICAgICA8cD4kUF97dmFsdWV9PDAuMDUkIHNlaGluZ2dhICRIXzAkICoqZGl0b2xhayoqLCB5YW5nIGJlcmFydGkgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBwYWRhIHJhdGEtcmF0YSBwZW5qdWFsYW4gYW50YXJhIGtlZW1wYXQgamVuaXMgcHJvZHVrICgqQ29mZmVlKiwgKkVzcHJlc3NvKiwgKkhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYS48L2xpPjwvcD4NCjwvb2w+DQo8cD5NZWxhbHVpIGtlc2ltcHVsYW4geWFuZyB0ZWxhaCBkaWRhcGF0a2FuIHlhbmcgbWVueWF0YWthbiAkSF8wJCBkaXRvbGFrIHNlaGluZ2dhIHRlcmRhcGF0IHBlcmJlZGFhbiByYXRhLXJhdGEgeWFuZyBzaWduaWZpa2FuLCBtYWthIGRpbGFuanV0a2FuIGRlbmdhbiB1amkgbGFqdXQgeWFpdHUgdWppIFR1a2V5LjwvcD4NCg0KPGgyPlVqaSBUdWtleTwvaDI+DQo8cD4NClNldGVsYWggbWVsYWx1aSB1amkgQU5BVkEgeWFuZyBkaWtldGFodWkgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiB0ZXJoYWRhcCByYXRhLXJhdGEgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrLiBMYW5na2FoIHNlbGFuanV0bnlhIGFkYWxhaCBtZW5naWRlbnRpZmlrYXNpIHNlY2FyYSBzcGVzaWZpayBqZW5pcyBwcm9kdWsgbWFuYSB5YW5nIG1lbWlsaWtpIHBlcmJlZGFhbiByYXRhLXJhdGEgcGVuanVhbGFuIHlhbmcgc2lnbmlmaWthbiBkZW5nYW4gbWVuZ2d1bmFrYW4gdWppICpUdWtleSBIb25lc3RseSBTaWduaWZpY2FudCBEaWZmZXJlbmNlKiAoSFNEKS4gQmVyaWt1dCBoYXNpbCB1amkgVHVrZXkuPC9QPg0KDQpgYGB7ciB1amkgdHVrZXl9DQpUdWtleUhTRChhbmF2YSkNCmBgYA0KDQo8cD5CZXJkYXNhcmthbiAqb3V0cHV0KiB1amkgVHVrZXkgSFNEIHlhbmcgZGliZXJpa2FuLCBiZXJpa3V0IGludGVycHJldGFzaSBkYXJpIHBlcmJhbmRpbmdhbiByYXRhLXJhdGEgcGVuanVhbGFuIGFudGFyYSBrZWVtcGF0IGplbmlzIHByb2R1ayBkaSBGbG9yaWRhLjxicj48L3A+DQoNCjxvbD4NCjxsaT4qRXNwcmVzc28qIHZzICpDb2ZmZWUqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTIzLjkyICgqQ29mZmVlKiBsZWloIHRpbmdnaSBkYXJpcGFkYSAqRXNyZXNzbyopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstNDguNTQ2ODEsIDAuNzA2ODEwNl0gPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wNjAyMTM3ID4gMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkNvZmZlZSogZGVuZ2FuICpFc3ByZXNzbyogcGFkYSB0aW5na2F0IHNpZ25pZmlrYW4gNSUuIE1lc2tpcHVuIGFkYSBzZWxpc2loIHJhdGEtcmF0YSBzZWJlc2FyIDIzLjkyIHVuaXQsIHBlcmJlZGFhbiBpbmkgdGlkYWsgY3VrdXAgYmVzYXIgdW50dWsgZGlhbmdnYXAgYmVyYmVkYSBzaWduaWZpa2FuIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5NSUuPC9saT4NCiA8L3VsPiA8L2xpPg0KIA0KPGxpPipIZXJiYWwgVGVhKiB2cyAqQ29mZmVlKjxicj4NCiA8dWw+DQogICA8bGk+U2VsaXNpaCByYXRhLXJhdGE6IC0xMTYuODggKCpDb2ZmZWUqIGxlaWggdGluZ2dpIGRhcmlwYWRhICpIZXJiYWwgVGVhKik8L2xpPg0KICAgPGxpPkludGVydmFsIGtlcGVyY2F5YWFuIDk1JTogWy0xNDEuNTA2ODEsIC05Mi4yNTMxODk0XTwvbGk+DQogICA8bGk+TmlsYWkgcCBhZGo6IDAuMDAwMDAwMCA8IDAuMDU8L2xpPg0KICAgPGxpPioqSW50ZXJwcmV0YXNpKio6IFRlcmRhcGF0IHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBhbnRhcmEgcGVuanVhbGFuICpDb2ZmZWUqIGRlbmdhbiAqSGVyYmFsIFRlYSogcGFkYSB0aW5na2F0IHNpZ25pZmlrYW4gNSUuICpDb2ZmZWUqIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCAxMTYuODggdW5pdCBkaWJhbmRpbmdrYW4gKkhlcmJhbCBUZWEqLjwvbGk+DQogPC91bD48L2xpPg0KIA0KPGxpPipUZWEqIHZzICpDb2ZmZWUqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTEzMy45MiAoKkNvZmZlZSogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKlRlYSopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstMTU4LjU0NjgxLCAtMTA5LjI5MzE4OTRdPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wMDAwMDAwIDwgMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkNvZmZlZSogZGVuZ2FuICpUZWEqIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqQ29mZmVlKiBtZW1pbGlraSByYXRhLXJhdGEgcGVuanVhbGFuIHlhbmcgamF1aCBsZWJpaCB0aW5nZ2kgZGVuZ2FuIHNlbGlzaWggMTMzLjkyIHVuaXQgZGliYW5kaW5na2FuICpUZWEqLjwvbGk+DQogPC91bD48L2xpPg0KDQo8bGk+KkhlcmJhbCBUZWEqIHZzICpFc3ByZXNzbyo8YnI+DQogPHVsPg0KICAgPGxpPlNlbGlzaWggcmF0YS1yYXRhOiAtOTIuOTYgKCpFc3ByZXNzbyogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKkhlcmJhbCBUZWEqKTwvbGk+DQogICA8bGk+SW50ZXJ2YWwga2VwZXJjYXlhYW4gOTUlOiBbLTExNy41ODY4MSwgLTY4LjMzMzE4OTRdPC9saT4NCiAgIDxsaT5OaWxhaSBwIGFkajogMC4wMDAwMDAwIDwgMC4wNTwvbGk+DQogICA8bGk+KipJbnRlcnByZXRhc2kqKjogVGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSBwZW5qdWFsYW4gKkhlcmJhbCBUZWEqIGRlbmdhbiAqRXNwcmVzc28qIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCA5Mi45NiB1bml0IGRpYmFuZGluZ2thbiAqSGVyYmFsIFRlYSouPC9saT4NCiA8L3VsPjwvbGk+DQoNCjxsaT4qVGVhKiB2cyAqRXNwcmVzc28qPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTExMC4wMCAoKkVzcHJlc3NvKiBsZWloIHRpbmdnaSBkYXJpcGFkYSAqVGVhKik8L2xpPg0KICAgPGxpPkludGVydmFsIGtlcGVyY2F5YWFuIDk1JTogWy0xMzQuNjI2ODEsIC04NS4zNzMxODk0XTwvbGk+DQogICA8bGk+TmlsYWkgcCBhZGo6IDAuMDAwMDAwMCA8IDAuMDU8L2xpPg0KICAgPGxpPioqSW50ZXJwcmV0YXNpKio6IFRlcmRhcGF0IHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBhbnRhcmEgcGVuanVhbGFuICpUZWEqIGRlbmdhbiAqRXNwcmVzc28qIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiAqRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBqYXVoIGxlYmloIHRpbmdnaSBkZW5nYW4gc2VsaXNpaCAxMTAuMDAgdW5pdCBkaWJhbmRpbmdrYW4gKlRlYSouPC9saT4NCiA8L3VsPjwvbGk+DQogDQo8bGk+KlRlYSogdnMgKkhlcmJhbCBUZWEqPGJyPg0KIDx1bD4NCiAgIDxsaT5TZWxpc2loIHJhdGEtcmF0YTogLTE3LjA0ICgqSGVyYmFsIFRlYSogbGVpaCB0aW5nZ2kgZGFyaXBhZGEgKlRlYSopPC9saT4NCiAgIDxsaT5JbnRlcnZhbCBrZXBlcmNheWFhbiA5NSU6IFstNDEuNjY2ODEsIDcuNTg2ODEwNl08L2xpPg0KICAgPGxpPk5pbGFpIHAgYWRqOiAwLjAwMDAwMDAgPCAwLjA1PC9saT4NCiAgIDxsaT4qKkludGVycHJldGFzaSoqOiBUZXJkYXBhdCBwZXJiZWRhYW4geWFuZyBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgYW50YXJhIHBlbmp1YWxhbiAqVGVhKiBkZW5nYW4gKkhlcmJhbCBUZWEqIHBhZGEgdGluZ2thdCBzaWduaWZpa2FuIDUlLiBNZXNraXB1biBhZGEgc2VsaXNpaCByYXRhLXJhdGEgc2ViZXNhciAxNy4wNCB1bml0LCBwZXJiZWRhYW4gaW5pIHRpZGFrIGN1a3VwIGJlc2FyIHVudHVrIGRpYW5nZ2FwIGJlcmJlZGEgc2lnbmlmaWthbiBwYWRhIHRpbmdrYXQga2VwZXJjYXlhYW4gOTUlLjwvbGk+DQogPC91bD48L2xpPg0KPC9vbD48L3A+DQoNCjxoMT5LZXNpbXB1bGFuPC9oMT4NCg0KPHA+QmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgQU5BVkEgc2F0dSBhcmFoIHRlcmhhZGFwIHJhdGEtcmF0YSBwZW5qdWFsYW4gZW1wYXQgamVuaXMgcHJvZHVrIENvZmZlZSBDaGFpbiAoKkNvZmZlZSwgRXNwcmVzc28sIEhlcmJhbCBUZWEqLCBkYW4gKlRlYSopIGRpIG5lZ2FyYSBiYWdpYW4gRmxvcmlkYSwgZGlwZXJvbGVoIGJhaHdhIGFzdW1zaSBub3JtYWxpdGFzIGRhbiBob21vZ2VuaXRhcyB2YXJpYW5zICoqdGVycGVudWhpKiouIE5hbXVuLCBoYXNpbCB1amkgQU5PVkEgbWVudW5qdWtrYW4gYmFod2EgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrIGFudGFyYSByYXRhLXJhdGEgcGVuanVhbGFuIGtlZW1wYXQgamVuaXMgcHJvZHVrIHRlcnNlYnV0IChuaWxhaSAkUC12YWx1ZSA8IDAuMDUkKSwgc2VoaW5nZ2EgaGlwb3Rlc2lzIG5vbCAqKmRpdG9sYWsqKi48L3A+DQoNCjxwPlNlbGFuanV0bnlhLCB1amkgbGFuanV0YW4gVHVrZXkgSFNEIGRpbGFrdWthbiB1bnR1ayBtZW5nZXRhaHVpIHBhc2FuZ2FuIGplbmlzIHByb2R1ayBtYW5hIHlhbmcgbWVtaWxpa2kgcGVyYmVkYWFuIHNpZ25pZmlrYW4uIEhhc2lsIHVqaSBUdWtleSBtZW51bmp1a2thbiBiYWh3YTo8L3A+DQoNCjxvbD4NCiA8bGk+KkNvZmZlZSogbWVtaWxpa2kgcmF0YS1yYXRhIHBlbmp1YWxhbiB5YW5nIHNlY2FyYSBzaWduaWZpa2FuIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gKkhlcmJhbCBUZWEqIGRhbiAqVGVhKi48L2xpPg0KIDxsaT4qRXNwcmVzc28qIG1lbWlsaWtpIHJhdGEtcmF0YSBwZW5qdWFsYW4geWFuZyBzZWNhcmEgc2lnbmlmaWthbiBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuICpIZXJiYWwgVGVhKiBkYW4gKlRlYSouPC9saT4NCiA8bGk+VGlkYWsgdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgcGVuanVhbGFuICpDb2ZmZWUqIGRhbiAqRXNwcmVzc28qLCBtZXNraXB1biAqQ29mZmVlKiBzZWRpa2l0IGxlYmloIHRpbmdnaSBzZWNhcmEgcmF0YS1yYXRhLjwvbGk+DQogPGxpPlRlcmRhcGF0IHBlcmJlZGFhbiBzaWduaWZpa2FuIGFudGFyYSAqSGVyYmFsIFRlYSogZGFuICpUZWEqLCBtZXNraXB1biAqSGVyYmFsIFRlYSogc2VkaWtpdCBsZWJpaCB0aW5nZ2kgc2VjYXJhIHJhdGEtcmF0YS48L2xpPg0KPC9vbD4NCg0KPHA+RGVuZ2FuIGRlbWlraWFuLCBwcm9kdWsgKkNvZmZlZSogZGFuICpFc3ByZXNzbyogbWVydXBha2FuIGR1YSBqZW5pcyBtaW51bWFuIGRlbmdhbiBwZXJmb3JtYSBwZW5qdWFsYW4gdGVydGluZ2dpLCBzZWRhbmdrYW4gKkhlcmJhbCBUZWEqIGRhbiAqVGVhKiBtZXJ1cGFrYW4gZHVhIGplbmlzIHByb2R1ayBkZW5nYW4gcGVyZm9ybWEgcGVuanVhbGFuIHlhbmcgbGViaWggcmVuZGFoIHNlY2FyYSBzaWduaWZpa2FuLiBBbmFsaXNpcyBpbmkgZGFwYXQgbWVuamFkaSBkYXNhciBkYWxhbSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gc3RyYXRlZ2lzLCBzZXBlcnRpIGZva3VzIHByb21vc2kgYXRhdSBhbG9rYXNpIHBlcnNlZGlhYW4sIGtodXN1c255YSB1bnR1ayBwYXNhciBkaSB3aWxheWFoIEZsb3JpZGEuPC9wPg0KDQoNCg0K