Deskripsi

Petumbuhan super market di kota-kota terpadat meningkat dan persaingan pasar juga tinggi. Dataset tersebut merupakan salah satu history penjualan perusahaan supermarket yang tercatat di 3 cabang berbeda selama 3 bulan. metode data analysis prediktif mudah diterapkan dengan kumpulan data ini.

Invoice id : Nomer indentifikasi slip penjualan yang dihasilkan komputer

Branch : Cabang supermarket (3 cabang tersedia diindetifikasi oleh A,B,C)

City : Lokasi Supermarket

Customers type : Jenis pelanggan, dicatat oleh Anggota untuk pelanggan yang menggunakan Kartu anggota pelanggan dan Normal tidak mengguanakan kartu anggota pelanggan

Gender : Jenis kelamin pelanggan

Unit price : Group kategoris barang umum - mode aksesoris, Makanan dan Minuman, Kesehatan dan Kecantikan, Rumah dan Gaya hidup, Olahraga dan perjalan.

Quantity : Harga setiap Produk dalam $

Tax : 5% biayaa pajak untuk pembelian pelanggan

Total : Total harga termasuk pajak

Date : Tanggal pembelian (catatan tersedia dari bulan januari 2019 sampai maret 2019)

Time : Waktu pembelian (jam 10 pagi hingga jam 9 malam)

Payment : Pembayaran yang digunakan oleh pelanggan untuk pembelian (3 metode tersedia - Tunai, Kartu Kredit, dan Dompet Elektronik)

COGS : Harga Pokok Terjual

Gros margin percentage : Persentasi Margin

Gros income : Pendapatan kotor

Rating : Peringkat stratifikasi pelanggan pada keseluruhan pengalaman berbelanja pelanggan (pada skala 1 sampai 10)

Pertanyaan

saya akan menganalysis datases penjualan supermarket dibagian berikut, saya sangat tertarik pada korelasi antara beberapa variabel, serta perbedaan anatara kualitas tertentu dari beberapa variabel dalam hal pendaptan , saya ingin melihat masalah berikut secara khusus :

Pertanyaan 1

Apakah ada hubungan antara gender dan cabang ? Apakah jenis kelamin mendistribusikan diri secara berbeda di antara cabang?

Pertanyaan 2

Apakah ada hubungan antara variabel gender dan pembayaran ? Apakah ada perbedaan dalam pemilihan metode pembayaran antara pelanggan pria dan wanita ?

Pertanyaan 3

Apakah ada hubungan antara variabel Gender dan Produk Line ?

Pertanyaan 4

Apakah rata-rata penjualan pria dan wanita berbeda ?

Pertanyaan 5

Apakah ada perbedaan Total rata-rata mengenai tiga cabang A, B, dan C dari rantai supermarket ?

Input Data

Dataset EDA

Saya akan mempelajari kumpulan data setelah memuat data dan packpage, dengan fokus khusus pada variabel yang diperlukan untuk menganalysis lebih lanjut. untuk beberap varabel, revisi data dan perubahan data mungkin diperlukan.

glimpse(data)
Rows: 1,000
Columns: 17
$ Invoice.ID              <chr> "750-67-8428", "226-31-3081", "631-41-3108", "123-19-1176", "373-73-791~
$ Branch                  <chr> "A", "C", "A", "A", "A", "C", "A", "C", "A", "B", "B", "B", "A", "A", "~
$ City                    <chr> "Yangon", "Naypyitaw", "Yangon", "Yangon", "Yangon", "Naypyitaw", "Yang~
$ Customer.type           <chr> "Member", "Normal", "Normal", "Member", "Normal", "Normal", "Member", "~
$ Gender                  <chr> "Female", "Female", "Male", "Male", "Male", "Male", "Female", "Female",~
$ Product.line            <chr> "Health and beauty", "Electronic accessories", "Home and lifestyle", "H~
$ Unit.price              <dbl> 74.69, 15.28, 46.33, 58.22, 86.31, 85.39, 68.84, 73.56, 36.26, 54.84, 1~
$ Quantity                <int> 7, 5, 7, 8, 7, 7, 6, 10, 2, 3, 4, 4, 5, 10, 10, 6, 7, 6, 3, 2, 5, 3, 2,~
$ Tax.5.                  <dbl> 26.1415, 3.8200, 16.2155, 23.2880, 30.2085, 29.8865, 20.6520, 36.7800, ~
$ Total                   <dbl> 548.9715, 80.2200, 340.5255, 489.0480, 634.3785, 627.6165, 433.6920, 77~
$ Date                    <chr> "1/5/2019", "3/8/2019", "3/3/2019", "1/27/2019", "2/8/2019", "3/25/2019~
$ Time                    <chr> "13:08", "10:29", "13:23", "20:33", "10:37", "18:30", "14:36", "11:38",~
$ Payment                 <chr> "Ewallet", "Cash", "Credit card", "Ewallet", "Ewallet", "Ewallet", "Ewa~
$ cogs                    <dbl> 522.83, 76.40, 324.31, 465.76, 604.17, 597.73, 413.04, 735.60, 72.52, 1~
$ gross.margin.percentage <dbl> 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4~
$ gross.income            <dbl> 26.1415, 3.8200, 16.2155, 23.2880, 30.2085, 29.8865, 20.6520, 36.7800, ~
$ Rating                  <dbl> 9.1, 9.6, 7.4, 8.4, 5.3, 4.1, 5.8, 8.0, 7.2, 5.9, 4.5, 6.8, 7.1, 8.2, 5~

Menyusun beberapa data deskriptif

summary(data)
  Invoice.ID           Branch              City           Customer.type         Gender         
 Length:1000        Length:1000        Length:1000        Length:1000        Length:1000       
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
 Product.line         Unit.price       Quantity         Tax.5.            Total        
 Length:1000        Min.   :10.08   Min.   : 1.00   Min.   : 0.5085   Min.   :  10.68  
 Class :character   1st Qu.:32.88   1st Qu.: 3.00   1st Qu.: 5.9249   1st Qu.: 124.42  
 Mode  :character   Median :55.23   Median : 5.00   Median :12.0880   Median : 253.85  
                    Mean   :55.67   Mean   : 5.51   Mean   :15.3794   Mean   : 322.97  
                    3rd Qu.:77.94   3rd Qu.: 8.00   3rd Qu.:22.4453   3rd Qu.: 471.35  
                    Max.   :99.96   Max.   :10.00   Max.   :49.6500   Max.   :1042.65  
     Date               Time             Payment               cogs        gross.margin.percentage
 Length:1000        Length:1000        Length:1000        Min.   : 10.17   Min.   :4.762          
 Class :character   Class :character   Class :character   1st Qu.:118.50   1st Qu.:4.762          
 Mode  :character   Mode  :character   Mode  :character   Median :241.76   Median :4.762          
                                                          Mean   :307.59   Mean   :4.762          
                                                          3rd Qu.:448.90   3rd Qu.:4.762          
                                                          Max.   :993.00   Max.   :4.762          
  gross.income         Rating      
 Min.   : 0.5085   Min.   : 4.000  
 1st Qu.: 5.9249   1st Qu.: 5.500  
 Median :12.0880   Median : 7.000  
 Mean   :15.3794   Mean   : 6.973  
 3rd Qu.:22.4453   3rd Qu.: 8.500  
 Max.   :49.6500   Max.   :10.000  

Data Processing

Pemrosesan data : saya akan dapat melihat bahwa bebarapa variabel kategori, seperti Gender, Cabang, Lini Produk, dan sebaginya, tampak dalam format karkater, saya ingin ingin mereka menjadi faktor untuk tujuan analysis saya.

Konversi variabel character ke factor.

glimpse(data)
Rows: 1,000
Columns: 17
$ Invoice.ID              <chr> "750-67-8428", "226-31-3081", "631-41-3108", "123-19-1176", "373-73-791~
$ Branch                  <fct> A, C, A, A, A, C, A, C, A, B, B, B, A, A, A, B, A, A, A, B, C, B, B, A,~
$ City                    <fct> Yangon, Naypyitaw, Yangon, Yangon, Yangon, Naypyitaw, Yangon, Naypyitaw~
$ Customer.type           <fct> Member, Normal, Normal, Member, Normal, Normal, Member, Normal, Member,~
$ Gender                  <fct> Female, Female, Male, Male, Male, Male, Female, Female, Female, Female,~
$ Product.line            <fct> Health and beauty, Electronic accessories, Home and lifestyle, Health a~
$ Unit.price              <dbl> 74.69, 15.28, 46.33, 58.22, 86.31, 85.39, 68.84, 73.56, 36.26, 54.84, 1~
$ Quantity                <int> 7, 5, 7, 8, 7, 7, 6, 10, 2, 3, 4, 4, 5, 10, 10, 6, 7, 6, 3, 2, 5, 3, 2,~
$ Tax.5.                  <dbl> 26.1415, 3.8200, 16.2155, 23.2880, 30.2085, 29.8865, 20.6520, 36.7800, ~
$ Total                   <dbl> 548.9715, 80.2200, 340.5255, 489.0480, 634.3785, 627.6165, 433.6920, 77~
$ Date                    <chr> "1/5/2019", "3/8/2019", "3/3/2019", "1/27/2019", "2/8/2019", "3/25/2019~
$ Time                    <chr> "13:08", "10:29", "13:23", "20:33", "10:37", "18:30", "14:36", "11:38",~
$ Payment                 <fct> Ewallet, Cash, Credit card, Ewallet, Ewallet, Ewallet, Ewallet, Ewallet~
$ cogs                    <dbl> 522.83, 76.40, 324.31, 465.76, 604.17, 597.73, 413.04, 735.60, 72.52, 1~
$ gross.margin.percentage <dbl> 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4.761905, 4~
$ gross.income            <dbl> 26.1415, 3.8200, 16.2155, 23.2880, 30.2085, 29.8865, 20.6520, 36.7800, ~
$ Rating                  <dbl> 9.1, 9.6, 7.4, 8.4, 5.3, 4.1, 5.8, 8.0, 7.2, 5.9, 4.5, 6.8, 7.1, 8.2, 5~

Setelah persiapan varaibel yang ingin saya gunakan, saya akan langsung menjawab pertayaan awal saya menggunakan uji statistik.

Uji Statistik

Pertanyaan 1

Apakah ada hubungan antara gender dan cabang ? Apakah jenis kelamin mendistribusikan diri secara berbeda di antara cabang ?

table(data$Gender)

Female   Male 
   501    499 
table(data$Branch)

  A   B   C 
340 332 328 
table(data$Gender, data$Branch)
        
           A   B   C
  Female 161 162 178
  Male   179 170 150

sampel berisi jumlah Pelanggan pria dan wanita yang hampir sama sebagai hasil sementara. Jumlah total transaksi dataset juga sangat merata di seluruh cabang. Jenis kelamin tersebar agak merata di atas cabang, menurut tabel silang dengan dua variabel.

Jenis kelamin dan cabang menguji hubungan dengan uji chi-kuadarat dan uji fisher. gb = GenderBranch

chisq.test(gb)

    Pearson's Chi-squared test

data:  gb
X-squared = 3.532, df = 2, p-value = 0.171
fisher.test(gb)

    Fisher's Exact Test for Count Data

data:  gb
p-value = 0.1695
alternative hypothesis: two.sided

Hasil data diatas menghasilkan nol harus dipertahankan karena nilai p yang tinggi di kedua tes, ini menunjukkan bahwa para variabel gender dan cabang memiliki tidak berarti hubungan.

Pertanyaan 2

Apakah ada hubungan antara variabel gender dan pembayaran ? Apakah ada perbedaan dalam pemilihan metode pembayaran antara pelanggan pria dan wanita ?

Untuk menjawab pertayaan ke -2 : pertama-tama buat tabel silang yang akan memberikan input untuk data frame baru (prosuder yang dipersingkat). gp = gender payment

gp
        
         Cash Credit card Ewallet
  Female  178         163     160
  Male    166         148     185
chisq.test(gp)

    Pearson's Chi-squared test

data:  gp
X-squared = 2.9497, df = 2, p-value = 0.2288
fisher.test(gp)

    Fisher's Exact Test for Count Data

data:  gp
p-value = 0.2293
alternative hypothesis: two.sided

hasil data diatas nilai p untuk keduat tes lebih besar dari 0,05, yang mengarah pada kesimpulan bahwa variabel tidak terkait (hipotesis nol)

Pertanyaan 3

Apakah ada hubungan antara variabel Gender dan Line Produk ?

gpl = gender product line

gpl
        
         Electronic accessories Fashion accessories Food and beverages Health and beauty
  Female                     84                  96                 90                64
  Male                       86                  82                 84                88
        
         Home and lifestyle Sports and travel
  Female                 79                88
  Male                   81                78
chisq.test(gpl)

    Pearson's Chi-squared test

data:  gpl
X-squared = 5.7445, df = 5, p-value = 0.3319
fisher.test(gpl, simulate.p.value = T)

    Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)

data:  gpl
p-value = 0.3243
alternative hypothesis: two.sided

hasil data diatas akibatnya, tidak ada perbedaan subtansial antara prefensi produk pria dan wanita. saya dapat menyimpulkan bahwa Gender dan line produk tidak memiliki hubungan.

Pertanyaan 4

Apakah rata-rata penjualan pria dan wanita berbeda ?

Untuk memulai, saya suka untuk melihat di dalam rata-rata total untuk kedua jenis kelamin.

Pertama, hanya ada sedikit perbedaan dalam total penjualan rata-rata antara pria dan wanita, dengan wanita menghasilkan lebih banyak pendapatan secara rata-rata dan secara keseluruhan. Menggunakan uji - t dua sampel, saya ingin melihat apakah ada perbedaan populasi.

Memeriksa persyaratan Uji-t : tidak ada outlier dan normal signifikan. #memerikas outlier secara visual dam melalui fungsi

Tes shapiro - Test dan visualisai digunakan untuk memeriksa kenormalan

nilai p dari shapiro - test - kurang dari 0,05, yang merupakan hasil parsial. Hal ini menunjukkan bahwa data tidak tersebara secara normal. hal ini menunjukkan bahwa prasyarat uji-t belum terpenuhi

saya akan meggunakan uji wilcoxon sebagai alternatif uji-t, yang disarankan jika persyaratan normalitas tidak terpenuhi.

wilcox.test(Total~Gender,data = data)

    Wilcoxon rank sum test with continuity correction

data:  Total by Gender
W = 132498, p-value = 0.1006
alternative hypothesis: true location shift is not equal to 0
str(wilcox.test(Total~Gender, data = data))
List of 7
 $ statistic  : Named num 132498
  ..- attr(*, "names")= chr "W"
 $ parameter  : NULL
 $ p.value    : num 0.101
 $ null.value : Named num 0
  ..- attr(*, "names")= chr "location shift"
 $ alternative: chr "two.sided"
 $ method     : chr "Wilcoxon rank sum test with continuity correction"
 $ data.name  : chr "Total by Gender"
 - attr(*, "class")= chr "htest"

Hasil : nilai P dari uji wilcox jauh di atas 0,05 dan dengan demikian tidak signifikan, saya harus berasumsi bahwa tidak ada perbedaan total rata-rata antara klien supermarket antara pria dan wanita

Pertanyaan 5

Apakah ada perbedaan Total rata-rata mengenai tiga cabang A, B, dan C dari rantai supermarket ?

Untuk menjawab pertayaan ini, saya akan melakukan analisis varians (ANOVA), yang memungkinkan membandingkan rata-rata dari beberapa kelompok, Seperti pertayaan sebelumnya. pertama-tama saya harus memeriksa prasyarat tertentu dari test ini adalah tidak ada outlier yang signifikan, normalitas dan homogenitas varias.

Saya akan mengguanakan analisis varians (ANOVA) untuk memecahkan pertayaan ke -5, yang memungkinkan saya membandingkan rata-rata dari berbagai kelompok, saya harus terlebih dahulu memverifikasi prasyarat ujian tertentu, seperti yang saya lakukan dengan pertayaan terakhir, tidak ada outlier yang menonjol, normalitas, dan homgenitas varians adalah ketiga kriteria.

Pertama saya ingin mendaptakan gambaran dari total rata-rata dan jumlah total mengenani tiga cabang

Terakhir saya ingin melakukan analysis visual terhadap pandangan tersebut

selanjutnya saya ingin memiriksa apakah outliernya signifkan

Cabang A dan B memiliki outlier, tetapi mereka tidak signifikan, dengan demikian persyaratan tidak dilengkapi

Uji normalitas : ini akan dilakukan dengan bantuan Tes shapiro dan model linier.

Tes shapiro

shapiro.test(data$Total)

    Shapiro-Wilk normality test

data:  data$Total
W = 0.90876, p-value < 2.2e-16

Model Linier

Hasil uji normalitas : uji shapiro menunjukkan bahwa data tidak berdistribusi normal, karena nilai p lebih kecil dari 0,05. Plot qq mendukung hasil ini, karena normalitas dapat diasumsikan jika titik-titik didistribusikan secara merata di sekitar garis referensi, yang jelah tidak demikian. Akibatnya, saya harus menahan diri dari Uji ANOVA dan menggunakan alternatif non-parametek. Alternatif yang direkomendasikan dalam hal ini adalah Uji Kruskal-Wallis

Melakukan Uji Kruskal-Wallis

kruskal.test(Total~Branch, data = data)

    Kruskal-Wallis rank sum test

data:  Total by Branch
Kruskal-Wallis chi-squared = 0.41678, df = 2, p-value = 0.8119

Hasil : P > 0,05 oleh karena itu saya harus mengasumsikan bahwa tidak ada perbedaan yang signifikan antara Total rata-rata pada ketiga cabang

Kesimpulan

Ringkasan hasil dari lima pertanyaan pada Dataset Penjualan supermarke yang sudah di jawab, hasilnya adalah sebagai berikut :

Pertanyaan 1

Uji Chi-Square dilakukan untuk menguji hubungan antara variabel Gender dan Branch. tidak ditemukan hubungan yang signifikan.

Pertanyaan 2

Uji Chi-Square dilakukan untuk menguji hubungan antara variabel Gender dan Payment. Tidak ada hubungan signifikan yang ditemukan.

Pertanyaan 3

Uji Chi-Square dilakukan untuk menguji hubungan antara variabel Gender dan Product Line. Tidak ditemukan hubungan yang signifikan.

Pertanyaan 4

Uji Wilcoxon dilakukan untuk menguji perbedaan antara nilai-nilai variabel Gender terhadap Total Sales. Tidak ditemukan yang signifikan.

Pertanyaan 5

Uji Kruskal-Wallis dilakukan untuk menguji perbedaan antara nilai-nilai variabel Branch terhadap Total Sales. tidak ditemukan yang signifikan.

LS0tDQp0aXRsZTogIkRBVEEgQU5BTFlTSVMgUEVOSlVBTEFOIFNVUEVSTUFSS0VUIg0KYXV0aG9yOiAiXFUwMDAxRjVFMyBKYW1hbGx1ZGluIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGZpZ193aWR0aDogNw0KICAgIGZpZ19oZWlnaHQ6IDQuNQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQoNCiMgRGVza3JpcHNpDQoNCg0KIVtdKERpc2tyaXBzaS5naWYpDQoNClBldHVtYnVoYW4gc3VwZXIgbWFya2V0IGRpIGtvdGEta290YSB0ZXJwYWRhdCBtZW5pbmdrYXQgZGFuIHBlcnNhaW5nYW4gcGFzYXIganVnYSB0aW5nZ2kuIERhdGFzZXQgdGVyc2VidXQgbWVydXBha2FuIHNhbGFoIHNhdHUgaGlzdG9yeSBwZW5qdWFsYW4gcGVydXNhaGFhbiBzdXBlcm1hcmtldCB5YW5nIHRlcmNhdGF0IGRpIDMgY2FiYW5nIGJlcmJlZGEgc2VsYW1hIDMgYnVsYW4uIG1ldG9kZSBkYXRhIGFuYWx5c2lzIHByZWRpa3RpZiBtdWRhaCBkaXRlcmFwa2FuIGRlbmdhbiBrdW1wdWxhbiBkYXRhIGluaS4NCiANCg0KDQohW10oRGF0YSBBdHJpYnV0LmdpZikNCg0KDQpJbnZvaWNlIGlkIDogTm9tZXIgaW5kZW50aWZpa2FzaSBzbGlwIHBlbmp1YWxhbiB5YW5nIGRpaGFzaWxrYW4ga29tcHV0ZXIgDQoNCkJyYW5jaCA6IENhYmFuZyBzdXBlcm1hcmtldCAoMyBjYWJhbmcgdGVyc2VkaWEgZGlpbmRldGlmaWthc2kgb2xlaCBBLEIsQykNCg0KQ2l0eSA6IExva2FzaSBTdXBlcm1hcmtldCANCg0KQ3VzdG9tZXJzIHR5cGUgOiBKZW5pcyBwZWxhbmdnYW4sIGRpY2F0YXQgb2xlaCBBbmdnb3RhIHVudHVrIHBlbGFuZ2dhbiB5YW5nIG1lbmdndW5ha2FuIEthcnR1IGFuZ2dvdGEgcGVsYW5nZ2FuIGRhbiBOb3JtYWwgdGlkYWsgbWVuZ2d1YW5ha2FuIGthcnR1IGFuZ2dvdGEgcGVsYW5nZ2FuIA0KDQpHZW5kZXIgOiBKZW5pcyBrZWxhbWluIHBlbGFuZ2dhbiANCg0KVW5pdCBwcmljZSA6IEdyb3VwIGthdGVnb3JpcyBiYXJhbmcgdW11bSAtIG1vZGUgYWtzZXNvcmlzLCBNYWthbmFuIGRhbiBNaW51bWFuLCBLZXNlaGF0YW4gZGFuIEtlY2FudGlrYW4sIFJ1bWFoIGRhbiBHYXlhIGhpZHVwLCBPbGFocmFnYSBkYW4gcGVyamFsYW4uDQoNClF1YW50aXR5IDogSGFyZ2Egc2V0aWFwIFByb2R1ayBkYWxhbSAkDQoNClRheCA6IDUlIGJpYXlhYSBwYWphayB1bnR1ayBwZW1iZWxpYW4gcGVsYW5nZ2FuIA0KDQpUb3RhbCA6IFRvdGFsIGhhcmdhIHRlcm1hc3VrIHBhamFrIA0KDQpEYXRlIDogVGFuZ2dhbCBwZW1iZWxpYW4gKGNhdGF0YW4gdGVyc2VkaWEgZGFyaSBidWxhbiBqYW51YXJpIDIwMTkgc2FtcGFpIG1hcmV0IDIwMTkpDQoNClRpbWUgOiBXYWt0dSBwZW1iZWxpYW4gKGphbSAxMCBwYWdpIGhpbmdnYSBqYW0gOSBtYWxhbSkNCg0KUGF5bWVudCA6IFBlbWJheWFyYW4geWFuZyBkaWd1bmFrYW4gb2xlaCBwZWxhbmdnYW4gdW50dWsgcGVtYmVsaWFuICgzIG1ldG9kZSB0ZXJzZWRpYSAtIFR1bmFpLCBLYXJ0dSBLcmVkaXQsIGRhbiBEb21wZXQgRWxla3Ryb25paykNCg0KQ09HUyA6IEhhcmdhIFBva29rIFRlcmp1YWwgDQoNCkdyb3MgbWFyZ2luIHBlcmNlbnRhZ2UgOiBQZXJzZW50YXNpIE1hcmdpbg0KDQpHcm9zIGluY29tZSA6IFBlbmRhcGF0YW4ga290b3INCg0KUmF0aW5nIDogUGVyaW5na2F0IHN0cmF0aWZpa2FzaSBwZWxhbmdnYW4gcGFkYSBrZXNlbHVydWhhbiBwZW5nYWxhbWFuIGJlcmJlbGFuamEgcGVsYW5nZ2FuIChwYWRhIHNrYWxhIDEgc2FtcGFpIDEwKQ0KDQoNCiMgUGVydGFueWFhbg0KDQoNCiFbXShQZXJ0YW55YWFuLmdpZikNCg0KDQpzYXlhIGFrYW4gbWVuZ2FuYWx5c2lzIGRhdGFzZXMgcGVuanVhbGFuIHN1cGVybWFya2V0IGRpYmFnaWFuIGJlcmlrdXQsIHNheWEgc2FuZ2F0IHRlcnRhcmlrIHBhZGEga29yZWxhc2kgYW50YXJhIGJlYmVyYXBhIHZhcmlhYmVsLCBzZXJ0YSBwZXJiZWRhYW4gYW5hdGFyYSBrdWFsaXRhcyB0ZXJ0ZW50dSBkYXJpIGJlYmVyYXBhIHZhcmlhYmVsIGRhbGFtIGhhbCBwZW5kYXB0YW4gLCBzYXlhIGluZ2luIG1lbGloYXQgbWFzYWxhaCBiZXJpa3V0IHNlY2FyYSBraHVzdXMgOiANCg0KKipQZXJ0YW55YWFuIDEqKiANCg0KQXBha2FoIGFkYSBodWJ1bmdhbiBhbnRhcmEgZ2VuZGVyIGRhbiBjYWJhbmcgPyANCkFwYWthaCBqZW5pcyBrZWxhbWluIG1lbmRpc3RyaWJ1c2lrYW4gZGlyaSBzZWNhcmEgYmVyYmVkYSBkaSBhbnRhcmEgY2FiYW5nPyANCg0KDQoqKlBlcnRhbnlhYW4gMioqDQoNCkFwYWthaCBhZGEgaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsIGdlbmRlciBkYW4gcGVtYmF5YXJhbiA/IA0KQXBha2FoIGFkYSBwZXJiZWRhYW4gZGFsYW0gcGVtaWxpaGFuIG1ldG9kZSBwZW1iYXlhcmFuIGFudGFyYSBwZWxhbmdnYW4gcHJpYSBkYW4gd2FuaXRhID8gDQoNCg0KKipQZXJ0YW55YWFuIDMqKg0KDQpBcGFrYWggYWRhIGh1YnVuZ2FuIGFudGFyYSB2YXJpYWJlbCBHZW5kZXIgZGFuIFByb2R1ayBMaW5lID8NCg0KDQoqKlBlcnRhbnlhYW4gNCoqDQoNCkFwYWthaCByYXRhLXJhdGEgcGVuanVhbGFuIHByaWEgZGFuIHdhbml0YSBiZXJiZWRhID8NCg0KDQoqKlBlcnRhbnlhYW4gNSoqDQoNCkFwYWthaCBhZGEgcGVyYmVkYWFuIFRvdGFsIHJhdGEtcmF0YSBtZW5nZW5haSB0aWdhIGNhYmFuZyBBLCBCLCBkYW4gQyBkYXJpIHJhbnRhaSBzdXBlcm1hcmtldCA/DQoNCg0KIyBJbnB1dCBEYXRhDQoNCg0KIVtdKElucHV0IERhdGEuZ2lmKQ0KDQoNCmBgYHtyfQ0KIyBwYWNrcGFnZSB5YW5nIGRpZ3VuYWthbg0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoZ2dwdWJyKQ0KDQojIGlucHV0IGRhdGENCg0KZGF0YSA8LSByZWFkLmNzdigic3VwZXJtYXJrZXRfc2FsZXMgLSBTaGVldDEuY3N2IikNCmhlYWQoZGF0YSkNCmBgYA0KDQojIERhdGFzZXQgRURBIA0KDQoNCiFbXShEYXRhIEVEQS5naWYpDQoNCg0KU2F5YSBha2FuIG1lbXBlbGFqYXJpIGt1bXB1bGFuIGRhdGEgc2V0ZWxhaCBtZW11YXQgZGF0YSBkYW4gcGFja3BhZ2UsIGRlbmdhbiBmb2t1cyBraHVzdXMgcGFkYSB2YXJpYWJlbCB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2FuYWx5c2lzIGxlYmloIGxhbmp1dC4gdW50dWsgYmViZXJhcCB2YXJhYmVsLCByZXZpc2kgZGF0YSBkYW4gcGVydWJhaGFuIGRhdGEgbXVuZ2tpbiBkaXBlcmx1a2FuLg0KDQpgYGB7cn0NCmRhdGEgPC0gYXNfdGliYmxlKGRhdGEpDQpoZWFkKGRhdGEpDQpgYGANCg0KYGBge3J9DQpnbGltcHNlKGRhdGEpDQpgYGANCg0KTWVueXVzdW4gYmViZXJhcGEgZGF0YSBkZXNrcmlwdGlmDQoNCmBgYHtyfQ0Kc3VtbWFyeShkYXRhKQ0KYGBgDQoNCg0KIyBEYXRhIFByb2Nlc3NpbmcNCg0KDQohW10oRGF0YSBQcm9jZXNzaW5nLmdpZikNCg0KDQoNCg0KUGVtcm9zZXNhbiBkYXRhIDogc2F5YSBha2FuIGRhcGF0IG1lbGloYXQgYmFod2EgYmViYXJhcGEgdmFyaWFiZWwga2F0ZWdvcmksIHNlcGVydGkgR2VuZGVyLCBDYWJhbmcsIExpbmkgUHJvZHVrLCBkYW4gc2ViYWdpbnlhLCB0YW1wYWsgZGFsYW0gZm9ybWF0IGthcmthdGVyLCBzYXlhIGluZ2luIGluZ2luIG1lcmVrYSBtZW5qYWRpIGZha3RvciB1bnR1ayB0dWp1YW4gYW5hbHlzaXMgc2F5YS4gDQoNCktvbnZlcnNpIHZhcmlhYmVsIGNoYXJhY3RlciBrZSBmYWN0b3IuDQoNCmBgYHtyfQ0KZGF0YSRCcmFuY2ggPC0gYXMuZmFjdG9yKGRhdGEkQnJhbmNoKQ0KZGF0YSRDdXN0b21lci50eXBlIDwtIGFzLmZhY3RvcihkYXRhJEN1c3RvbWVyLnR5cGUpDQpkYXRhJEdlbmRlciA8LSBhcy5mYWN0b3IoZGF0YSRHZW5kZXIpDQpkYXRhJENpdHkgPC0gYXMuZmFjdG9yKGRhdGEkQ2l0eSkNCmRhdGEkUHJvZHVjdC5saW5lIDwtIGFzLmZhY3RvcihkYXRhJFByb2R1Y3QubGluZSkNCmRhdGEkUGF5bWVudCA8LSBhcy5mYWN0b3IoZGF0YSRQYXltZW50KQ0KDQpnbGltcHNlKGRhdGEpDQpgYGANCg0KU2V0ZWxhaCBwZXJzaWFwYW4gdmFyYWliZWwgeWFuZyBpbmdpbiBzYXlhIGd1bmFrYW4sIHNheWEgYWthbiBsYW5nc3VuZyBtZW5qYXdhYiBwZXJ0YXlhYW4gYXdhbCBzYXlhIG1lbmdndW5ha2FuIHVqaSBzdGF0aXN0aWsuDQoNCg0KIyBVamkgU3RhdGlzdGlrDQoNCg0KIVtdKFVqaSBTdGF0aXN0aWsuZ2lmKQ0KDQoNCg0KIyMgUGVydGFueWFhbiAxIA0KDQpBcGFrYWggYWRhIGh1YnVuZ2FuIGFudGFyYSBnZW5kZXIgZGFuIGNhYmFuZyA/IA0KQXBha2FoIGplbmlzIGtlbGFtaW4gbWVuZGlzdHJpYnVzaWthbiBkaXJpIHNlY2FyYSBiZXJiZWRhIGRpIGFudGFyYSBjYWJhbmcgPw0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkR2VuZGVyKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRCcmFuY2gpDQpgYGANCg0KYGBge3J9DQp0YWJsZShkYXRhJEdlbmRlciwgZGF0YSRCcmFuY2gpDQpgYGANCg0Kc2FtcGVsIGJlcmlzaSBqdW1sYWggUGVsYW5nZ2FuIHByaWEgZGFuIHdhbml0YSB5YW5nIGhhbXBpciBzYW1hIHNlYmFnYWkgaGFzaWwgc2VtZW50YXJhLiBKdW1sYWggdG90YWwgdHJhbnNha3NpIGRhdGFzZXQganVnYSBzYW5nYXQgbWVyYXRhIGRpIHNlbHVydWggY2FiYW5nLiBKZW5pcyBrZWxhbWluIHRlcnNlYmFyIGFnYWsgbWVyYXRhIGRpIGF0YXMgY2FiYW5nLCBtZW51cnV0IHRhYmVsIHNpbGFuZyBkZW5nYW4gZHVhIHZhcmlhYmVsLg0KDQpKZW5pcyBrZWxhbWluIGRhbiBjYWJhbmcgbWVuZ3VqaSBodWJ1bmdhbiBkZW5nYW4gdWppIGNoaS1rdWFkYXJhdCBkYW4gdWppIGZpc2hlci4NCioqZ2IgPSBHZW5kZXJCcmFuY2gqKg0KDQpgYGB7cn0NCmdiIDwtIGFzLnRpYmJsZShyYmluZChjKDE2MSwgMTYyLCAxNzgpLA0KICAgICAgICAgICAgICAgICAgICAgIGMoMTc5LCAxNzAsIDE1MCkpKQ0KZGltbmFtZXMoZ2IpIDwtIGxpc3QoR2VuZGVyID0gYygiRmVtYWxlIiwgIk1hbGUiKSwNCiAgICAgICAgICAgICAgICAgICAgIEJyYW5jaCA9IGMoIkEiLCAiQiIsICJDIikpDQpjaGlzcS50ZXN0KGdiKQ0KYGBgDQoNCmBgYHtyfQ0KZmlzaGVyLnRlc3QoZ2IpDQpgYGANCg0KKipIYXNpbCBkYXRhIGRpYXRhcyBtZW5naGFzaWxrYW4gbm9sIGhhcnVzIGRpcGVydGFoYW5rYW4ga2FyZW5hIG5pbGFpIHAgeWFuZyB0aW5nZ2kgZGkga2VkdWEgdGVzLCBpbmkgbWVudW5qdWtrYW4gYmFod2EgcGFyYSB2YXJpYWJlbCBnZW5kZXIgZGFuIGNhYmFuZyBtZW1pbGlraSB0aWRhayBiZXJhcnRpIGh1YnVuZ2FuLioqDQoNCg0KIyMgUGVydGFueWFhbiAyDQoNCkFwYWthaCBhZGEgaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsIGdlbmRlciBkYW4gcGVtYmF5YXJhbiA/IA0KQXBha2FoIGFkYSBwZXJiZWRhYW4gZGFsYW0gcGVtaWxpaGFuIG1ldG9kZSBwZW1iYXlhcmFuIGFudGFyYSBwZWxhbmdnYW4gcHJpYSBkYW4gd2FuaXRhID8NCg0KVW50dWsgbWVuamF3YWIgcGVydGF5YWFuIGtlIC0yIDogcGVydGFtYS10YW1hIGJ1YXQgdGFiZWwgc2lsYW5nIHlhbmcgYWthbiBtZW1iZXJpa2FuIGlucHV0IHVudHVrICoqZGF0YSBmcmFtZSoqIGJhcnUgKHByb3N1ZGVyIHlhbmcgZGlwZXJzaW5na2F0KS4NCipncCogPSBnZW5kZXIgcGF5bWVudA0KDQpgYGB7cn0NCmdwIDwtIHRhYmxlKGRhdGEkR2VuZGVyLCANCiAgICAgICAgICAgIGRhdGEkUGF5bWVudCkNCg0KZ3ANCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoZ3ApDQpgYGANCg0KYGBge3J9DQpmaXNoZXIudGVzdChncCkNCmBgYA0KDQoqKmhhc2lsIGRhdGEgZGlhdGFzIG5pbGFpIHAgdW50dWsga2VkdWF0IHRlcyBsZWJpaCBiZXNhciBkYXJpIDAsMDUsIHlhbmcgbWVuZ2FyYWggcGFkYSBrZXNpbXB1bGFuIGJhaHdhIHZhcmlhYmVsIHRpZGFrIHRlcmthaXQgKGhpcG90ZXNpcyBub2wpKioNCg0KDQojIyBQZXJ0YW55YWFuIDMgDQoNCkFwYWthaCBhZGEgaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsIEdlbmRlciBkYW4gTGluZSBQcm9kdWsgPw0KDQoqKmdwbCoqID0gZ2VuZGVyIHByb2R1Y3QgbGluZQ0KDQpgYGB7cn0NCmdwbCA8LSB0YWJsZShkYXRhJEdlbmRlciwgZGF0YSRQcm9kdWN0LmxpbmUpDQpncGwNCmBgYA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QoZ3BsKQ0KYGBgDQoNCmBgYHtyfQ0KZmlzaGVyLnRlc3QoZ3BsLCBzaW11bGF0ZS5wLnZhbHVlID0gVCkNCmBgYA0KDQoqKmhhc2lsIGRhdGEgZGlhdGFzIGFraWJhdG55YSwgdGlkYWsgYWRhIHBlcmJlZGFhbiBzdWJ0YW5zaWFsIGFudGFyYSBwcmVmZW5zaSBwcm9kdWsgcHJpYSBkYW4gd2FuaXRhLiBzYXlhIGRhcGF0IG1lbnlpbXB1bGthbiBiYWh3YSBHZW5kZXIgZGFuIGxpbmUgcHJvZHVrIHRpZGFrIG1lbWlsaWtpIGh1YnVuZ2FuKiouDQoNCg0KIyMgUGVydGFueWFhbiA0IA0KDQpBcGFrYWggcmF0YS1yYXRhIHBlbmp1YWxhbiBwcmlhIGRhbiB3YW5pdGEgYmVyYmVkYSA/IA0KDQpVbnR1ayBtZW11bGFpLCBzYXlhIHN1a2EgdW50dWsgbWVsaWhhdCBkaSBkYWxhbSByYXRhLXJhdGEgdG90YWwgdW50dWsga2VkdWEgamVuaXMga2VsYW1pbi4NCg0KYGBge3J9DQpkYXRhICU+JSBzZWxlY3QoR2VuZGVyLFRvdGFsKSAlPiUgDQogIGdyb3VwX2J5KEdlbmRlcikgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gcm91bmQobWVhbihUb3RhbCksMiksDQogICAgICAgICAgICBzdW0gPSBzdW0oVG90YWwpKQ0KYGBgDQoNClBlcnRhbWEsIGhhbnlhIGFkYSBzZWRpa2l0IHBlcmJlZGFhbiBkYWxhbSB0b3RhbCBwZW5qdWFsYW4gcmF0YS1yYXRhIGFudGFyYSBwcmlhIGRhbiB3YW5pdGEsIGRlbmdhbiB3YW5pdGEgbWVuZ2hhc2lsa2FuIGxlYmloIGJhbnlhayBwZW5kYXBhdGFuIHNlY2FyYSByYXRhLXJhdGEgZGFuIHNlY2FyYSBrZXNlbHVydWhhbi4gTWVuZ2d1bmFrYW4gdWppIC0gdCBkdWEgc2FtcGVsLCBzYXlhIGluZ2luIG1lbGloYXQgYXBha2FoIGFkYSBwZXJiZWRhYW4gcG9wdWxhc2kuDQoNCioqTWVtZXJpa3NhIHBlcnN5YXJhdGFuIFVqaS10IDogdGlkYWsgYWRhIG91dGxpZXIgZGFuIG5vcm1hbCBzaWduaWZpa2FuLiAjbWVtZXJpa2FzIG91dGxpZXIgc2VjYXJhIHZpc3VhbCBkYW0gbWVsYWx1aSBmdW5nc2kqKg0KDQpgYGB7cn0NCmRhdGEgJT4lc2VsZWN0IChHZW5kZXIsVG90YWwpICU+JSANCiAgZ3JvdXBfYnkoR2VuZGVyKSAlPiUgaWRlbnRpZnlfb3V0bGllcnMoVG90YWwpDQpgYGANCg0KDQpgYGB7cn0NCnAxIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IEdlbmRlciwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSBUb3RhbCkpICsgZ2VvbV9ib3hwbG90KCkNCnAxDQpgYGANCg0KDQoqKlRlcyBzaGFwaXJvIC0gVGVzdCBkYW4gdmlzdWFsaXNhaSBkaWd1bmFrYW4gdW50dWsgbWVtZXJpa3NhIGtlbm9ybWFsYW4qKg0KDQpgYGB7cn0NCmRhdGEgJT4lIHNoYXBpcm9fdGVzdChUb3RhbCkNCmBgYA0KDQoqKm5pbGFpIHAgZGFyaSBzaGFwaXJvIC0gdGVzdCAtIGt1cmFuZyBkYXJpIDAsMDUsIHlhbmcgbWVydXBha2FuIGhhc2lsIHBhcnNpYWwuIEhhbCBpbmkgbWVudW5qdWtrYW4gYmFod2EgZGF0YSB0aWRhayB0ZXJzZWJhcmEgc2VjYXJhIG5vcm1hbC4gaGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSBwcmFzeWFyYXQgdWppLXQgYmVsdW0gdGVycGVudWhpKioNCg0Kc2F5YSBha2FuIG1lZ2d1bmFrYW4gKip1amkgd2lsY294b24qKiBzZWJhZ2FpIGFsdGVybmF0aWYgdWppLXQsIHlhbmcgZGlzYXJhbmthbiBqaWthIHBlcnN5YXJhdGFuIG5vcm1hbGl0YXMgdGlkYWsgdGVycGVudWhpLg0KDQpgYGB7cn0NCndpbGNveC50ZXN0KFRvdGFsfkdlbmRlcixkYXRhID0gZGF0YSkNCmBgYA0KDQpgYGB7cn0NCnN0cih3aWxjb3gudGVzdChUb3RhbH5HZW5kZXIsIGRhdGEgPSBkYXRhKSkNCmBgYA0KDQoqKkhhc2lsIDogbmlsYWkgUCBkYXJpIHVqaSB3aWxjb3ggamF1aCBkaSBhdGFzIDAsMDUgZGFuIGRlbmdhbiBkZW1pa2lhbiB0aWRhayBzaWduaWZpa2FuLCBzYXlhIGhhcnVzIGJlcmFzdW1zaSBiYWh3YSB0aWRhayBhZGEgcGVyYmVkYWFuIHRvdGFsIHJhdGEtcmF0YSBhbnRhcmEga2xpZW4gc3VwZXJtYXJrZXQgYW50YXJhIHByaWEgZGFuIHdhbml0YSoqDQoNCg0KIyMgUGVydGFueWFhbiA1DQoNCkFwYWthaCBhZGEgcGVyYmVkYWFuIFRvdGFsIHJhdGEtcmF0YSBtZW5nZW5haSB0aWdhIGNhYmFuZyBBLCBCLCBkYW4gQyBkYXJpIHJhbnRhaSBzdXBlcm1hcmtldCA/IA0KDQpVbnR1ayBtZW5qYXdhYiBwZXJ0YXlhYW4gaW5pLCBzYXlhIGFrYW4gbWVsYWt1a2FuIGFuYWxpc2lzIHZhcmlhbnMgKEFOT1ZBKSwgeWFuZyBtZW11bmdraW5rYW4gbWVtYmFuZGluZ2thbiByYXRhLXJhdGEgZGFyaSBiZWJlcmFwYSBrZWxvbXBvaywgU2VwZXJ0aSBwZXJ0YXlhYW4gc2ViZWx1bW55YS4gcGVydGFtYS10YW1hIHNheWEgaGFydXMgbWVtZXJpa3NhIHByYXN5YXJhdCB0ZXJ0ZW50dSBkYXJpIHRlc3QgaW5pIGFkYWxhaCB0aWRhayBhZGEgb3V0bGllciB5YW5nIHNpZ25pZmlrYW4sIG5vcm1hbGl0YXMgZGFuIGhvbW9nZW5pdGFzIHZhcmlhcy4NCg0KU2F5YSBha2FuIG1lbmdndWFuYWthbiBhbmFsaXNpcyB2YXJpYW5zIChBTk9WQSkgdW50dWsgbWVtZWNhaGthbiBwZXJ0YXlhYW4ga2UgLTUsIHlhbmcgbWVtdW5na2lua2FuIHNheWEgbWVtYmFuZGluZ2thbiByYXRhLXJhdGEgZGFyaSBiZXJiYWdhaSBrZWxvbXBvaywgc2F5YSBoYXJ1cyB0ZXJsZWJpaCBkYWh1bHUgbWVtdmVyaWZpa2FzaSBwcmFzeWFyYXQgdWppYW4gdGVydGVudHUsIHNlcGVydGkgeWFuZyBzYXlhIGxha3VrYW4gZGVuZ2FuIHBlcnRheWFhbiB0ZXJha2hpciwgdGlkYWsgYWRhIG91dGxpZXIgeWFuZyBtZW5vbmpvbCwgbm9ybWFsaXRhcywgZGFuIGhvbWdlbml0YXMgdmFyaWFucyBhZGFsYWgga2V0aWdhIGtyaXRlcmlhLg0KDQoqKlBlcnRhbWEgc2F5YSBpbmdpbiBtZW5kYXB0YWthbiBnYW1iYXJhbiBkYXJpIHRvdGFsIHJhdGEtcmF0YSBkYW4ganVtbGFoIHRvdGFsIG1lbmdlbmFuaSB0aWdhIGNhYmFuZyoqDQoNCmBgYHtyfQ0KZGF0YSAlPiUgc2VsZWN0KEJyYW5jaCxUb3RhbCkgJT4lDQogIGdyb3VwX2J5KEJyYW5jaCkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gcm91bmQobWVhbihUb3RhbCksMiksIHN1bShUb3RhbCkpDQpgYGANCg0KDQoqKlRlcmFraGlyIHNheWEgaW5naW4gbWVsYWt1a2FuIGFuYWx5c2lzIHZpc3VhbCB0ZXJoYWRhcCBwYW5kYW5nYW4gdGVyc2VidXQqKg0KDQpgYGB7cn0NCnBsMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBCcmFuY2gsIHkgPSBUb3RhbCkpKw0KICBnZW9tX2JveHBsb3QoYWVzKGNvbG9yPUJyYW5jaCkpDQpwbDENCmBgYA0KDQoNCioqc2VsYW5qdXRueWEgc2F5YSBpbmdpbiBtZW1pcmlrc2EgYXBha2FoIG91dGxpZXJueWEgc2lnbmlma2FuKioNCg0KYGBge3J9DQpkYXRhICU+JSBzZWxlY3QoQnJhbmNoLFRvdGFsKSAlPiUgDQogIGdyb3VwX2J5KEJyYW5jaCkgJT4lIA0KICBpZGVudGlmeV9vdXRsaWVycyhUb3RhbCkNCg0KYGBgDQoNCioqQ2FiYW5nIEEgZGFuIEIgbWVtaWxpa2kgb3V0bGllciwgdGV0YXBpIG1lcmVrYSB0aWRhayBzaWduaWZpa2FuLCBkZW5nYW4gZGVtaWtpYW4gcGVyc3lhcmF0YW4gdGlkYWsgZGlsZW5na2FwaSoqDQoNClVqaSBub3JtYWxpdGFzIDogaW5pIGFrYW4gZGlsYWt1a2FuIGRlbmdhbiBiYW50dWFuIFRlcyBzaGFwaXJvIGRhbiBtb2RlbCBsaW5pZXIuDQoNCioqVGVzIHNoYXBpcm8qKg0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChkYXRhJFRvdGFsKQ0KYGBgDQoNCioqTW9kZWwgTGluaWVyKioNCg0KYGBge3J9DQptb2RlbCA8LSBsbShUb3RhbH5CcmFuY2gsZGF0YSA9IGRhdGEpDQpnZ3FxcGxvdChyZXNpZHVhbHMobW9kZWwpKQ0KYGBgDQoNCioqSGFzaWwgdWppIG5vcm1hbGl0YXMgOiB1amkgc2hhcGlybyBtZW51bmp1a2thbiBiYWh3YSBkYXRhIHRpZGFrIGJlcmRpc3RyaWJ1c2kgbm9ybWFsLCBrYXJlbmEgbmlsYWkgcCBsZWJpaCBrZWNpbCBkYXJpIDAsMDUuIFBsb3QgcXEgbWVuZHVrdW5nIGhhc2lsIGluaSwga2FyZW5hIG5vcm1hbGl0YXMgZGFwYXQgZGlhc3Vtc2lrYW4gamlrYSB0aXRpay10aXRpayBkaWRpc3RyaWJ1c2lrYW4gc2VjYXJhIG1lcmF0YSBkaSBzZWtpdGFyIGdhcmlzIHJlZmVyZW5zaSwgeWFuZyBqZWxhaCB0aWRhayBkZW1pa2lhbi4gQWtpYmF0bnlhLCBzYXlhIGhhcnVzIG1lbmFoYW4gZGlyaSBkYXJpIFVqaSBBTk9WQSBkYW4gbWVuZ2d1bmFrYW4gYWx0ZXJuYXRpZiBub24tcGFyYW1ldGVrLiBBbHRlcm5hdGlmIHlhbmcgZGlyZWtvbWVuZGFzaWthbiBkYWxhbSBoYWwgaW5pIGFkYWxhaCBVamkgS3J1c2thbC1XYWxsaXMqKg0KDQpNZWxha3VrYW4gVWppIEtydXNrYWwtV2FsbGlzDQoNCmBgYHtyfQ0Ka3J1c2thbC50ZXN0KFRvdGFsfkJyYW5jaCwgZGF0YSA9IGRhdGEpDQpgYGANCg0KKipIYXNpbCA6IFAgPiAwLDA1IG9sZWgga2FyZW5hIGl0dSBzYXlhIGhhcnVzIG1lbmdhc3Vtc2lrYW4gYmFod2EgdGlkYWsgYWRhIHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4gYW50YXJhIFRvdGFsIHJhdGEtcmF0YSBwYWRhIGtldGlnYSBjYWJhbmcqKg0KDQoNCiMgS2VzaW1wdWxhbiANCg0KDQohW10oS2VzaW1wdWxhbi5naWYpDQoNCg0KUmluZ2thc2FuIGhhc2lsIGRhcmkgbGltYSBwZXJ0YW55YWFuIHBhZGEgKipEYXRhc2V0IFBlbmp1YWxhbiBzdXBlcm1hcmtlKiogeWFuZyBzdWRhaCBkaSBqYXdhYiwgaGFzaWxueWEgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dCA6IA0KDQojIyBQZXJ0YW55YWFuIDEgDQoNCioqVWppIENoaS1TcXVhcmUqKiBkaWxha3VrYW4gdW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEgdmFyaWFiZWwgKipHZW5kZXIqKiBkYW4gKipCcmFuY2gqKi4gdGlkYWsgZGl0ZW11a2FuIGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbi4NCg0KDQojIyBQZXJ0YW55YWFuIDIgDQoNCioqVWppIENoaS1TcXVhcmUqKiBkaWxha3VrYW4gdW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEgdmFyaWFiZWwgKipHZW5kZXIqKiBkYW4gKipQYXltZW50KiouIFRpZGFrIGFkYSBodWJ1bmdhbiBzaWduaWZpa2FuIHlhbmcgZGl0ZW11a2FuLiANCg0KDQojIyBQZXJ0YW55YWFuIDMgDQoNCioqVWppIENoaS1TcXVhcmUqKiBkaWxha3VrYW4gdW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEgdmFyaWFiZWwgKipHZW5kZXIqKiBkYW4gKipQcm9kdWN0IExpbmUqKi4gVGlkYWsgZGl0ZW11a2FuIGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbi4gDQoNCg0KIyMgUGVydGFueWFhbiA0DQoNCioqVWppIFdpbGNveG9uKiogZGlsYWt1a2FuIHVudHVrIG1lbmd1amkgcGVyYmVkYWFuIGFudGFyYSBuaWxhaS1uaWxhaSB2YXJpYWJlbCAqKkdlbmRlcioqIHRlcmhhZGFwICoqVG90YWwgU2FsZXMqKi4gVGlkYWsgZGl0ZW11a2FuIHlhbmcgc2lnbmlmaWthbi4gDQoNCg0KIyMgUGVydGFueWFhbiA1IA0KDQoqKlVqaSBLcnVza2FsLVdhbGxpcyoqIGRpbGFrdWthbiB1bnR1ayBtZW5ndWppIHBlcmJlZGFhbiBhbnRhcmEgbmlsYWktbmlsYWkgdmFyaWFiZWwgKipCcmFuY2gqKiB0ZXJoYWRhcCAqKlRvdGFsIFNhbGVzKiouIHRpZGFrIGRpdGVtdWthbiB5YW5nIHNpZ25pZmlrYW4u