WSTĘP

Projekt CycleInsight stanowi analizę danych klientów sklepu rowerowego przygotowaną na potrzeby przedmiotu „Analiza danych w R”. Jego celem jest zbadanie zależności między cechami klientów a ich decyzją o zakupie roweru.

Postaramy sie odpowiedzieć na następujące pytania badawcze:

  1. Jakie cechy klientów (wiek, dochód, region, liczba dzieci, wykształcenie itd.) mają największy wpływ na decyzję o zakupie roweru?
  2. W jakim stopniu stan posiadania (samochód, dom) oraz styl życia wpływają na prawdopodobieństwo zakupu roweru?
  3. Czy występują różnice w decyzji zakupu roweru między klientami z różnych regionów oraz grup wiekowych?

Nazwy kolumn w zbiorze danych:

Lista nazw kolumn w zbiorze danych
x
ID
Marital.Status
Gender
Income
Children
Education
Occupation
Home.Owner
Cars
Commute.Distance
Region
Age
Purchased.Bike

ANALIZA BRAKÓW DANYCH

Liczba brakujących wartości, proporcje i kompletność danych:

Liczba braków w danych: 31 Liczba kompletnych obserwacji: 12969 Proporcja braków: 0.24 %

Procent brakujących wartości na zmienną:

[1] 0.2384615

Podsumowanie braków na poziomie zmiennych i obserwacji:

Braki danych występowały tylko w kilku zmiennych (głównie Cars, Children, Age i Income) i nie przekraczały ok. 1% obserwacji na zmienną. Ponad 97% rekordów było kompletnych, a pojedyncze braki były równomiernie rozłożone w zbiorze, bez wyraźnego wzorca.

Wizualizacja braków danych z użyciem pakietu visdat

Badanie wzorców braków danych

Podsumowanie braków danych

Braki dotyczyły głównie dochodu i kilku zmiennych demograficznych, a ich udział w zbiorze był niewielki i bez wyraźnego wzorca. Zastosowaliśmy imputację dominantą dla zmiennych kategorycznych oraz medianą i metodą hotdeck (dla dochodu), co pozwoliło uzupełnić dane bez utraty obserwacji.

IMPUTACJA BRAKUJĄCYCH DANYCH

Przygotowanie danych do imputacji

Na tym etapie ujednoliciliśmy nazwy zmiennych, usunęliśmy zbędny identyfikator id, zamieniliśmy puste ciągi znaków na wartości brakujące oraz poprawiliśmy typy danych (np. na faktory), tak aby zestaw był gotowy do imputacji.

Imputacja danych z użyciem dominanty

Dla zmiennych kategorycznych (stan cywilny, płeć, status właściciela domu) brakujące wartości uzupełniliśmy dominantą. Dzięki temu zachowaliśmy rozkład kategorii, nie usuwając żadnych obserwacji.

Imputacja danych z użyciem mediany oraz hotdeck

W przypadku zmiennych ilościowych zastosowaliśmy imputację medianą (wiek, liczba dzieci, liczba samochodów), a dla dochodu metodę hotdeck, która podstawia wartość z podobnych obserwacji. Pozwoliło to uzupełnić dane bez silnego zniekształcania ich rozkładów.

Braki po imputacji

Zastosowana procedura imputacji pozwoliła uzupełnić wszystkie brakujące wartości w zbiorze – dane po przekształceniach są w pełni kompletne.

WALIDACJA DANYCH

W etapie walidacji sprawdziliśmy zgodność danych z założeniami merytorycznymi zbioru. Zmiennym ilościowym (cars, children, age, income, commute_distance) narzuciliśmy warunek nieujemności oraz, w przypadku cars, children i age, całkowitoliczbowości. Dla zmiennych jakościowych zweryfikowaliśmy poprawność kategorii – w szczególności wartości binarne (home_owner, purchased_bike, marital_status, gender) oraz pełny zestaw dopuszczalnych poziomów dla education, occupation i region – co potwierdziło brak błędnych lub niespójnych kodowań.

Sprawdzenie duplikatów

[1] 47

Duplikaty występują, ale traktujemy je jako powtarzające się profile klientów (np. kolejne wizyty), dlatego pozostawiamy je bez zmian.

WIZUALIZACJA DANYCH

Pytanie 1: Wpływ cech demograficznych (Wiek, Dochód, Wykształcenie)

Wykres pokazuje, że najwyższy udział kupujących rower występuje wśród osób z wykształceniem wyższym, natomiast klienci z niższym wykształceniem rzadziej decydują się na zakup.

Pytanie 2: Stan posiadania i styl życia (Samochody, Dojazdy)

Widzimy, że klienci bez samochodu lub posiadający tylko jeden częściej kupują rower, a wraz ze wzrostem liczby aut w gospodarstwie udział kupujących wyraźnie spada.

Krótszy dystans do pracy niekoniecznie wiąże się z wyższym odsetkiem kupujących rower na poziomie ogólnym, natomiast przy dużych odległościach wyraźnie rośnie udział osób, które roweru nie kupują.

Pytanie 3: Różnice regionalne i wiekowe

Między regionami widać wyraźne różnice w sprzedaży – w jednym z regionów liczba klientów kupujących rower jest zdecydowanie wyższa niż w pozostałych.

Heatmapa pokazuje, że zależność między dystansem do pracy a zakupem roweru jest silnie zróżnicowana regionalnie – w niektórych regionach krótkie dojazdy wiążą się z wysokim udziałem kupujących, podczas gdy w innych nawet przy podobnych odległościach odsetek zakupów pozostaje niski.

ANALIZA OPISOWA

Statystyki opisowe zmiennych liczbowych

Statystyki opisowe zmiennych numerycznych
Zmienna Min Q1 Mediana Średnia Q3 Max SD Wariancja IQR CV
age 25 35 43 44.17 52 89 11.32 128.07 17 25.62
income 10000 30000 60000 56260.00 70000 170000 31038.30 963375775.78 40000 55.17
cars 0 1 1 1.45 2 4 1.12 1.25 1 77.02
children 0 0 2 1.91 3 5 1.62 2.63 3 84.79

Klienci sklepu to osoby średnio 44-letnie (ale z dużym rozrzutem: 25-89 lat), o średnim dochodzie 56 tys. $ przy bardzo wysokim zróżnicowaniu zarobków (CV=55%). Typowe gospodarstwo domowe posiada 1 samochód i 2 dzieci, choć w obu tych zmiennych obserwujemy skrajną niejednorodność (CV >75%) - część klientów nie ma w ogóle aut ani dzieci, podczas gdy inni mają ich po kilka.

Statystyki opisowe zmiennych jakościowych

Statystyki opisowe dla zmiennych jakościowych (częstości)
zmienna kategoria liczba procent
marital_status Married 542 54.2
marital_status Single 458 45.8
gender Female 489 48.9
gender Male 511 51.1
education Bachelors 306 30.6
education Graduate Degree 174 17.4
education High School 179 17.9
education Partial College 265 26.5
education Partial High School 76 7.6
occupation Clerical 177 17.7
occupation Management 173 17.3
occupation Manual 119 11.9
occupation Professional 276 27.6
occupation Skilled Manual 255 25.5
home_owner No 314 31.4
home_owner Yes 686 68.6
commute_distance 0-1 Miles 366 36.6
commute_distance 1-2 Miles 169 16.9
commute_distance 10+ Miles 111 11.1
commute_distance 2-5 Miles 162 16.2
commute_distance 5-10 Miles 192 19.2
region Europe 300 30.0
region North America 508 50.8
region Pacific 192 19.2
purchased_bike No 519 51.9
purchased_bike Yes 481 48.1

Klienci sklepu są w większości żonaci/zamężni (54%), z niemal idealnym podziałem na płeć (51% mężczyzn). Ponad połowa posiada wykształcenie wyższe (licencjat lub magisterium), a większość (69%) jest właścicielami domów. Co istotne, klienci pochodzą głównie z Ameryki Północnej (51%) i decyzje zakupowe są niemal równo podzielone - 48% kupiło rower, 52% nie dokonało zakupu.

Korelacje między zmiennymi liczbowymi

Występuje słaba dodatnia korelacja między dochodem a liczbą dzieci (r=0.26) oraz między dochodem a liczbą samochodów (r=0.44), co sugeruje, że wyższe zarobki wiążą się z posiadaniem większej liczby aut i potomstwa. Zaskakująco niska korelacja wieku z dochodem (r=0.17) wskazuje, że w tej populacji starsi klienci nie są znacząco bogatsi od młodszych. Liczba samochodów nie koreluje praktycznie z niczym poza dochodem.

Dochód a zakup roweru

Zakupy rowerów są najliczniejsze w przedziale średnich dochodów 20-80 tys. $ (łącznie 340 zakupów), gdzie klienci stanowią większość bazy. W przedziałach skrajnych (<20 tys. i >100 tys.) sprzedaż jest wyraźnie niższa – najbiedniejsi prawdopodobnie nie stać na rower, a najzamożniejsi wybierają inne formy rekreacji lub luksusowe alternatywy. Warto zauważyć, że w przedziale 80-100 tys. proporcja kupujących wzrasta (40 na 75 klientów), co może wskazywać na optymalny próg dochodowy dla tej kategorii produktu.

Wiek a zakup roweru

Zakup roweru w grupach wiekowych (liczba i % w wierszu)
No Yes
<=25 2 (40%) 3 (60%)
26–35 137 (55.2%) 111 (44.8%)
36–45 142 (42.8%) 190 (57.2%)
46–55 121 (49.4%) 124 (50.6%)
56+ 117 (68.8%) 53 (31.2%)

Wiek klientów ma istotny statystycznie wpływ na decyzję zakupową (p < 0,001, V Craméra = 0,18). Najwyższy odsetek kupujących występuje w grupie 36-45 lat (57%), podczas najmłodsi klienci (≤25 lat) choć kupują najchętniej (60%), stanowią znikomą część bazy. Powyżej 55 roku życia skłonność do zakupu gwałtownie spada (tylko 31% kupujących), co sugeruje, że rower jest produktem skierowanym głównie do osób w średnim wieku.

Korelacje między zmiennymi jakościowymi

Macierz Craméra pokazuje, że najsilniej z decyzją o zakupie roweru powiązane są wykształcenie, stan cywilny i region, a słabsze związki występują dla dystansu do pracy. Płeć, status właściciela domu i typ zawodu mają niskie wartości V, co potwierdza ich ograniczoną rolę jako predyktorów zakupu.

Profil klienta kupującego rower

Profil przeciętnego klienta kupującego rower
Sredni_Wiek Mediana_Dochodow Srednia_Liczba_Aut Najczestszy_Region Najczestsze_Wyksztalcenie
43 60000 1.22 North America Bachelors

Analiza pokazuje, że decyzje o zakupie roweru zależą zarówno od cech demograficznych, jak i statusu społeczno‑ekonomicznego klientów. Najwięcej zakupów dokonują osoby w wieku 26–45 lat, a różnice między grupami wiekowymi są istotne statystycznie (test chi‑kwadrat, p < 0,001; V Craméra ≈ 0,24). Wśród zmiennych jakościowych największe znaczenie mają poziom wykształcenia, status właściciela domu oraz region zamieszkania, co dobrze widać na macierzy Craméra. Wynika z tego, że na zachowania zakupowe w sklepie rowerowym silnie wpływają zarówno cechy demograficzne, jak i szeroko rozumiany styl życia oraz pozycja społeczno‑ekonomiczna klienta.

TESTOWANIE STATYSTYCZNE

Zmienne ilościowe a zakup roweru

[1] 5.80512e-19

Shapiro-Wilk normality test

data: dane2$income W = 0.94419, p-value < 2.2e-16

Test Manna-Whitneya potwierdza istotną statystycznie różnicę wieku między kupującymi a niekupującymi (p = 0,0038). Kupujący są średnio młodsi – ich mediana wieku to 41 lat, podczas gdy niekupujących 44 lata. Efekt wielkości jest jednak niewielki (r = -0,11), co oznacza, że choć wiek ma znaczenie, nie jest głównym wyznacznikiem decyzji zakupowej. Rozkłady w obu grupach są szerokie i nakładają się, wskazując na istnienie innych ważnych czynników.

Test Manna-Whitneya nie wykazał istotnej statystycznie różnicy w dochodach między kupującymi a niekupującymi (p = 0,18). Obie grupy mają identyczną medianę dochodu (60 tys. $), co sugeruje, że sam poziom zarobków nie determinuje decyzji o zakupie roweru. Rozkłady dochodów w obu grupach są bardzo podobne – zakup zależy raczej od innych czynników (jak stan cywilny, liczba samochodów czy wykształcenie) niż od wysokości wynagrodzenia.

Analiza dla wszystkich poziomów zmiennej ‘cars’

Dla każdego poziomu zmiennej cars (0–4 auta) rozkłady wieku kupujących i niekupujących są bardzo podobne, a różnice w medianach są niewielkie. Testy nie wskazują na istotny efekt wieku w żadnej z podgrup – nawet przy większej liczbie samochodów kupujący i niekupujący mają zbliżony wiek. W praktyce oznacza to, że to liczba aut, a nie wiek w obrębie danej kategorii „cars”, jest kluczowym czynnikiem różnicującym decyzję o zakupie.

Rozkład wieku i dochodu z podziałem na zakup

Wykres pokazuje, że rozkłady wieku kupujących (“Yes”) i niekupujących (“No”) są praktycznie identyczne dla każdego roku życia od 40 do 80 lat – każda grupa wiekowa ma po 1000 obserwacji w obu kategoriach. To potwierdza wcześniejsze wnioski: wiek sam w sobie nie różnicuje silnie kupujących od niekupujących, gdyż proporcje w każdej kohorcie wiekowej są stałe. Różnica w medianach (41 vs 44 lata) wynika z nieznacznych różnic w ogólnej strukturze wiekowej, a nie z odmiennych zachowań w poszczególnych przedziałach wiekowych.

Zmienne kategoryczne a zakup roweru

Ranking czynników wpływających na zakup roweru (Test niezależności Chi-kwadrat)
Badana Cecha Chi-kwadrat Stopnie swobody (df) P-value Istotność
region 13.75 2 0.00103 **
home_owner 0.22 1 0.63646 brak
gender 0.17 1 0.67691 brak
marital_status 11.08 1 < 0.001 ***
education 25.33 4 < 0.001 ***
occupation 8.01 4 0.09137 brak
commute_distance 34.51 4 < 0.001 ***

Testy chi‑kwadrat potwierdziły istotny związek decyzji o zakupie z wykształceniem, stanem cywilnym i regionem (p < 0,001), a słabsze, lecz nadal widoczne zależności z dystansem do pracy. Z kolei płeć, status właściciela domu i typ zawodu uzyskały wysokie wartości p‑value, co oznacza brak istotnych różnic w odsetku kupujących między kategoriami tych zmiennych. Wyniki te są spójne z późniejszym modelem logitowym, w którym te same zmienne okazują się odpowiednio kluczowe lub nieistotne.

MODELOWANIE ZAKUPU ROWERU - REGRESJA LOGISTYCZNA

Istotne statystycznie determinanty zakupu roweru (Model Logitowy)
Zmienna Iloraz Szans (OR) 95% Przedział Ufności P-value
marital_statusSingle 1.73 [1.3 - 2.31] < 0.001
income 1.00 [1 - 1] < 0.001
children 0.90 [0.81 - 0.99] 0.03527
cars 0.64 [0.54 - 0.75] < 0.001
EducationPartial College 0.62 [0.42 - 0.91] 0.01422
EducationPartial High School 0.39 [0.2 - 0.75] 0.00543
Note:
OR > 1 oznacza wzrost szansy na zakup, OR < 1 oznacza spadek szansy.

Kluczowe determinanty zakupu

Model regresji logistycznej pozwolił wyodrębnić zmienne, które mają realny wpływ na decyzję zakupową, eliminując zakłócenia wynikające ze współzależności cech.

Status cywilny (Marital Status): Jest to jeden z najsilniejszych predyktorów. Osoby samotne (Single) są znacznie bardziej skłonne do zakupu roweru niż osoby w związkach małżeńskich. Iloraz szans (Odds Ratio) wynosi ok. 1.73, co oznacza, że szansa na zakup u singla jest o 73% wyższa niż u osoby zamężnej/żonatej, przy zachowaniu pozostałych cech na stałym poziomie.

Samochody (Cars): Liczba posiadanych samochodów jest silną barierą zakupową. Każdy dodatkowy samochód w gospodarstwie domowym drastycznie obniża szansę na zakup roweru (OR ≈ 0.64, p < 0.001). Potwierdza to hipotezę, że dla badanej grupy rower jest często alternatywą transportową, a nie tylko rekreacyjną.

Dzieci (Children): Zmienna ta wpływa negatywnie na decyzję zakupową (p = 0.035). Większa liczba dzieci w gospodarstwie domowym wiąże się z niższą skłonnością do zakupu roweru dla siebie przez klienta (prawdopodobnie ze względu na ograniczenia budżetowe lub czasowe).

Dochód (Income): Istnieje statystycznie istotna, dodatnia zależność między dochodem a prawdopodobieństwem zakupu (p < 0.001), co oznacza, że rower w ofercie sklepu jest dobrem normalnym (popyt rośnie wraz z dochodem).

Profil demograficzny i społeczny

Wykształcenie: Klienci z wykształceniem wyższym (Bachelors) stanowią grupę referencyjną o najwyższym potencjale zakupowym. Osoby z wykształceniem częściowym (Partial College/High School) wykazują istotnie niższą szansę na zakup (wyniki ujemne w modelu logitowym).

Region: Test Chi-kwadrat (p < 0.001) oraz analiza opisowa wskazują na silne zróżnicowanie regionalne, z dominacją sprzedaży w Ameryce Północnej.

Cechy nieistotne statystycznie

Wbrew pierwotnym przypuszczeniom, analiza wielozmiennowa wykazała brak istotnego wpływu dla:

Płci (Gender): Płeć klienta nie różnicuje szansy na zakup (p = 0.94 w modelu logitowym, p = 0.67 w teście Chi-kwadrat). Oferta sklepu jest uniwersalna.

Posiadania domu (Home Owner): Zarówno test niezależności (p = 0.63), jak i model (p = 0.46) wskazują, że status własności nieruchomości nie ma związku z zakupem roweru. Jest to ważna korekta względem wstępnych obserwacji opartych wyłącznie na liczebnościach.

Zawodu (Occupation): Poza pewnymi różnicami w dochodach, sam typ wykonywanej pracy nie jest istotnym predyktorem w modelu.

Ocena jakości modelu

Zbudowany model logitowy charakteryzuje się trafnością (Accuracy) na poziomie ok. 62.6%.

Macierz pomyłek pokazuje, że model lepiej radzi sobie z przewidywaniem braku zakupu (346 trafień) niż zakupu (280 trafień).

Sugeruje to, że w danych istnieją inne, nieuchwycone zmienne (np. zainteresowania, styl życia, odległość do ścieżek rowerowych), które mogłyby poprawić predykcję.

PODSUMOWANIE I WNIOSKI KOŃCOWE

Przebieg i cel analizy

Projekt CycleInsight dostarczył szczegółowej, opartej na danych analizy profilu klientów sklepu rowerowego i czynników wpływających na zakup. Przeprowadziliśmy pełny proces analityczny – od przygotowania danych, przez analizę eksploracyjną i testy statystyczne, po model regresji logistycznej – co pozwoliło zweryfikować postawione hipotezy i sformułować praktyczne rekomendacje biznesowe.

Najważniejsze wyniki analityczne

Główne ustalenia analityczne potwierdziły, że zakup roweru nie jest zdarzeniem losowym, lecz wynika z wyraźnego profilu socjodemograficznego i stylu życia. Regresja logistyczna wyodrębniła najsilniejsze predyktory: status cywilny (singiel: +73% szans) i liczbę samochodów (każdy dodatkowy: -36% szans), co wskazuje, że rower stanowi często alternatywę transportową dla osób niezwiązanych i o ograniczonej dostępności do samochodu. Istotny, choć mniejszy, negatywny wpływ ma liczba dzieci, co sugeruje przesunięcie priorytetów budżetowych lub czasowych w rodzinach. Dochód wykazał pozytywną, lecz nieliniową zależność, z największą konwersją w przedziale 80-100 tys. $, pozycjonując rower jako dobro dla zamożnej klasy średniej. Wykształcenie wyższe oraz region Ameryki Północnej również znacząco zwiększały prawdopodobieństwo zakupu.

Wnioski metodyczne

Kluczowym wnioskiem metodycznym jest obalenie kilku intuicyjnych założeń. Analiza wielowymiarowa jednoznacznie wykazała brak statystycznie istotnego wpływu płci i posiadania domu na decyzję zakupową, co jest istotną korektą względem wstępnych obserwacji opartych na prostych rozkładach częstości. Podobnie, wiek okazał się czynnikiem istotnym, ale o niewielkim efekcie praktycznym, a zawód nie miał znaczenia po uwzględnieniu dochodu. Pokazuje to wartość zaawansowanych modeli statystycznych w oddzielaniu prawdziwych sygnałów od pozornych korelacji.

Wnioski biznesowe i rekomendacje

Podsumowując, typowy klient kupujący rower to singiel w wieku 36–45 lat, z wyższym wykształceniem, dochodem 80–100 tys. $, posiadający co najwyżej jeden samochód i mieszkający w Ameryce Północnej. Strategia marketingowa powinna więc mniej opierać się na kryteriach płci czy statusu mieszkaniowego, a bardziej na komunikowaniu korzyści dla osób szukających alternatywnego środka transportu oraz na podkreślaniu jakości i prestiżu produktu w segmencie zamożniejszych, wykształconych klientów. Warto też różnicować ofertę między regionami, biorąc pod uwagę lokalne wzorce dojazdów do pracy, a w przyszłych analizach uwzględnić czynniki behawioralne (np. aktywność fizyczną, dostępność infrastruktury rowerowej), aby jeszcze lepiej prognozować popyt i personalizować ofertę.

LS0tDQp0aXRsZTogIkN5Y2xlSW5zaWdodCDigJMgYW5hbGl6YSBkYW55Y2giIA0KYXV0aG9yOiAiTWlrb8WCYWogR3J1YmJhLCBQaW90ciBDemFybmVja2ksIELFgmHFvGVqIEt1amF3c2tpIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZSAgICAgDQogICAgdG9jX2Zsb2F0OiB0cnVlIA0KICAgIHRvY19kZXB0aDogMw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4ICAjIFBvbHNraWUgem5ha2kNCmxhbmc6ICJwbCINCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgTGlzdGEgcGFraWV0w7N3DQpwYWNrYWdlcyA8LSBjKCJrbml0ciIsICJ2aXNkYXQiLCAibmFuaWFyIiwgImdncGxvdDIiLCAiZHBseXIiLCAidGlkeXIiLA0KICAgICAgICAgICAgICAic3RyaW5nciIsICJqYW5pdG9yIiwgIm1pY2UiLCAiZmluYWxmaXQiLCAia2FibGVFeHRyYSIsIA0KICAgICAgICAgICAgICAiaG1zIiwgInJsYW5nIiwgInJzdGF0aXgiKQ0KDQojIEluc3RhbGFjamEgYnJha3VqYWN5Y2ggcGFraWV0w7N3DQppZihhbnkoIShwYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKSkpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcyhwYWNrYWdlc1shKHBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXSwgDQogICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzID0gVFJVRSkNCn0NCg0KIyDFgWFkb3dhbmllDQpsYXBwbHkocGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCg0KIyBVU1RBV0lFTklBIC0gVFlMS08gV1lOSUtpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCiAgZXZhbCA9IFRSVUUsDQogIGluY2x1ZGUgPSBUUlVFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgcmVzdWx0cyA9ICdhc2lzJywNCiAgZmlnLndpZHRoID0gMTAsDQogIGZpZy5oZWlnaHQgPSA2LA0KICBkcGkgPSAzMDANCikNCg0KIyBEYW5lDQpkYW5lIDwtIHJlYWQuY3N2KCJza2xlcF9yb3dlcm93eS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQpgYGANCg0KIyBXU1TEmFANCg0KUHJvamVrdCAqKkN5Y2xlSW5zaWdodCoqIHN0YW5vd2kgYW5hbGl6xJkgZGFueWNoIGtsaWVudMOzdyBza2xlcHUgcm93ZXJvd2VnbyBwcnp5Z290b3dhbsSFIG5hIHBvdHJ6ZWJ5IHByemVkbWlvdHUg4oCeQW5hbGl6YSBkYW55Y2ggdyBS4oCdLiBKZWdvIGNlbGVtIGplc3QgemJhZGFuaWUgemFsZcW8bm/Fm2NpIG1pxJlkenkgY2VjaGFtaSBrbGllbnTDs3cgYSBpY2ggZGVjeXpqxIUgbyB6YWt1cGllIHJvd2VydS4NCg0KIyMgUG9zdGFyYW15IHNpZSBvZHBvd2llZHppZcSHIG5hIG5hc3TEmXB1asSFY2UgcHl0YW5pYSBiYWRhd2N6ZToNCg0KMS4gIEpha2llIGNlY2h5IGtsaWVudMOzdyAod2llaywgZG9jaMOzZCwgcmVnaW9uLCBsaWN6YmEgZHppZWNpLCB3eWtzenRhxYJjZW5pZSBpdGQuKSBtYWrEhSBuYWp3acSZa3N6eSB3cMWCeXcgbmEgZGVjeXpqxJkgbyB6YWt1cGllIHJvd2VydT8NCjIuICBXIGpha2ltIHN0b3BuaXUgc3RhbiBwb3NpYWRhbmlhIChzYW1vY2jDs2QsIGRvbSkgb3JheiBzdHlsIMW8eWNpYSB3cMWCeXdhasSFIG5hIHByYXdkb3BvZG9iaWXFhHN0d28gemFrdXB1IHJvd2VydT8NCjMuICBDenkgd3lzdMSZcHVqxIUgcsOzxbxuaWNlIHcgZGVjeXpqaSB6YWt1cHUgcm93ZXJ1IG1pxJlkenkga2xpZW50YW1pIHogcsOzxbxueWNoIHJlZ2lvbsOzdyBvcmF6IGdydXAgd2lla293eWNoPw0KDQpgYGB7ciB3Y3p5dGFuaWUgZGFueWNoLCBlY2hvPUZBTFNFfQ0KDQpkYW5lIDwtIHJlYWQuY3N2KCJza2xlcF9yb3dlcm93eS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQpoZWFkKGRhbmUpDQpgYGANCg0KIyMgTmF6d3kga29sdW1uIHcgemJpb3J6ZSBkYW55Y2g6DQoNCmBgYHtyIHN0cnVrdHVyYSBkYW55Y2gsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0Ka2FibGUoY29sbmFtZXMoZGFuZSksIGNhcHRpb24gPSAiTGlzdGEgbmF6dyBrb2x1bW4gdyB6YmlvcnplIGRhbnljaCIpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDE2LCBib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lDQogIGthYmxlRXh0cmE6OnJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBmb250X3NpemUgPSAxOCkNCg0KDQoNCmBgYA0KDQojIEFOQUxJWkEgQlJBS8OTVyBEQU5ZQ0gNCg0KIyMgTGljemJhIGJyYWt1asSFY3ljaCB3YXJ0b8WbY2ksIHByb3BvcmNqZSBpIGtvbXBsZXRub8WbxIcgZGFueWNoOg0KDQpgYGB7ciBMaWN6YmEgYnJha3VqxIVjeWNoIHdhcnRvxZtjaSwgcHJvcG9yY2plIGkga29tcGxldG5vxZvEhywgZWNobz1GQUxTRX0NCmxpYnJhcnkobmFuaWFyKQ0KDQpjYXQoIkxpY3piYSBicmFrw7N3IHcgZGFueWNoOiIsIG5fbWlzcyhkYW5lKSwgIlxuIikNCmNhdCgiTGljemJhIGtvbXBsZXRueWNoIG9ic2Vyd2Fjamk6Iiwgbl9jb21wbGV0ZShkYW5lKSwgIlxuIikNCmNhdCgiUHJvcG9yY2phIGJyYWvDs3c6Iiwgcm91bmQocHJvcF9taXNzKGRhbmUpKjEwMCwgMiksICIlXG4iKQ0KDQpgYGANCg0KIyMgUHJvY2VudCBicmFrdWrEhWN5Y2ggd2FydG/Fm2NpIG5hIHptaWVubsSFOg0KDQpgYGB7ciBQcm9jZW50IGJyYWt1asSFY3ljaCB3YXJ0b8WbY2kgbmEgem1pZW5uxIUsIGVjaG89RkFMU0V9DQpwY3QgPC0gcGN0X21pc3MoZGFuZSkNCnByaW50KHBjdCkNCg0KYGBgDQoNCiMjIFBvZHN1bW93YW5pZSBicmFrw7N3IG5hIHBvemlvbWllIHptaWVubnljaCBpIG9ic2Vyd2Fjamk6DQoNCmBgYHtyIFBvZHN1bW93YW5pZSBicmFrw7N3IG5hIHBvemlvbWllIHptaWVubnljaCBpIG9ic2Vyd2FjamksIGVjaG89RkFMU0V9DQptaXNzX3Zhcl9zdW1tYXJ5KGRhbmUpDQptaXNzX2Nhc2VfdGFibGUoZGFuZSkNCg0KYGBgDQpCcmFraSBkYW55Y2ggd3lzdMSZcG93YcWCeSB0eWxrbyB3IGtpbGt1IHptaWVubnljaCAoZ8WCw7N3bmllIENhcnMsIENoaWxkcmVuLCBBZ2UgaSBJbmNvbWUpIGkgbmllIHByemVrcmFjemHFgnkgb2suIDElIG9ic2Vyd2FjamkgbmEgem1pZW5uxIUuIFBvbmFkIDk3JSByZWtvcmTDs3cgYnnFgm8ga29tcGxldG55Y2gsIGEgcG9qZWR5bmN6ZSBicmFraSBiecWCeSByw7N3bm9taWVybmllIHJvesWCb8W8b25lIHcgemJpb3J6ZSwgYmV6IHd5cmHFum5lZ28gd3pvcmNhLg0KDQojIyBXaXp1YWxpemFjamEgYnJha8OzdyBkYW55Y2ggeiB1xbx5Y2llbSBwYWtpZXR1IHZpc2RhdA0KDQpgYGB7ciB3eWtyZXN5IE5BLCBlY2hvPUZBTFNFfQ0Kd3lrcmVzMSA8LSB2aXNfZGF0KGRhbmUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLCBtYXJnaW4gPSBtYXJnaW4odCA9IDEwKSkpICsNCiAgZ2d0aXRsZSgiV2l6dWFsaXphY2phIGRhbnljaCB6IHXFvHljaWVtIHZpc2RhdCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSkNCg0Kd3lrcmVzMiA8LSB2aXNfbWlzcyhkYW5lKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgbWFyZ2luID0gbWFyZ2luKHQgPSAxMCkpKSArDQogIGdndGl0bGUoIkxpY3piYSBicmFrdWrEhWN5Y2ggd2FydG/Fm2NpIHcgem1pZW5ueWNoIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpKQ0KcHJpbnQod3lrcmVzMSkNCnByaW50KHd5a3JlczIpDQoNCmBgYA0KDQojIyBCYWRhbmllIHd6b3Jjw7N3IGJyYWvDs3cgZGFueWNoDQoNCmBgYHtyIHd6b3JjZSBicmFrw7N3IGRhbnljaCwgcmVzdWx0cz0naGlkZScsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCm1pc3NpbmdfcGF0dGVybihkYW5lKQ0KYGBgDQoNCiMjIFBvZHN1bW93YW5pZSBicmFrw7N3IGRhbnljaA0KDQpCcmFraSBkb3R5Y3p5xYJ5IGfFgsOzd25pZSBkb2Nob2R1IGkga2lsa3Ugem1pZW5ueWNoIGRlbW9ncmFmaWN6bnljaCwgYSBpY2ggdWR6aWHFgiB3IHpiaW9yemUgYnnFgiBuaWV3aWVsa2kgaSBiZXogd3lyYcW6bmVnbyB3em9yY2EuIFphc3Rvc293YWxpxZtteSBpbXB1dGFjasSZIGRvbWluYW50xIUgZGxhIHptaWVubnljaCBrYXRlZ29yeWN6bnljaCBvcmF6IG1lZGlhbsSFIGkgbWV0b2TEhSBob3RkZWNrIChkbGEgZG9jaG9kdSksIGNvIHBvendvbGnFgm8gdXp1cGXFgm5pxIcgZGFuZSBiZXogdXRyYXR5IG9ic2Vyd2FjamkuDQoNCiMgSU1QVVRBQ0pBIEJSQUtVSsSEQ1lDSCBEQU5ZQ0gNCg0KIyMgUHJ6eWdvdG93YW5pZSBkYW55Y2ggZG8gaW1wdXRhY2ppDQoNCmBgYHtyIHByenlnb3Rvd2FuaWUgZGFueWNoIGRvIGltcHV0YWNqaSwgaW5jbHVkZT1GQUxTRX0NCmRhbmUgPC0gZGFuZSAlPiUgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKSAlPiUgc2VsZWN0KC1pZCkNCg0Kc3VtbWFyeShkYW5lKQ0KY29sU3Vtcyhpcy5uYShkYW5lKSkNCg0KZGFuZSA8LSBkYW5lICU+JSBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIH4gbmFfaWYoLiwgIiIpKSkNCg0KZGFuZSRtYXJpdGFsX3N0YXR1cyA8LSBhcy5mYWN0b3IoZGFuZSRtYXJpdGFsX3N0YXR1cykNCmRhbmUkZ2VuZGVyIDwtIGFzLmZhY3RvcihkYW5lJGdlbmRlcikNCmRhbmUkaG9tZV9vd25lciA8LSBhcy5mYWN0b3IoZGFuZSRob21lX293bmVyKQ0KY29sU3Vtcyhpcy5uYShkYW5lKSkNCmBgYA0KDQpOYSB0eW0gZXRhcGllIHVqZWRub2xpY2lsacWbbXkgbmF6d3kgem1pZW5ueWNoLCB1c3VuxJlsacWbbXkgemLEmWRueSBpZGVudHlmaWthdG9yIGlkLCB6YW1pZW5pbGnFm215IHB1c3RlIGNpxIVnaSB6bmFrw7N3IG5hIHdhcnRvxZtjaSBicmFrdWrEhWNlIG9yYXogcG9wcmF3aWxpxZtteSB0eXB5IGRhbnljaCAobnAuIG5hIGZha3RvcnkpLCB0YWsgYWJ5IHplc3RhdyBiecWCIGdvdG93eSBkbyBpbXB1dGFjamkuDQoNCiMjIEltcHV0YWNqYSBkYW55Y2ggeiB1xbx5Y2llbSBkb21pbmFudHkNCg0KYGBge3IgaW1wdXRhY2phIGRhbnljaCBpbG/Fm2Npb3d5Y2gsIGluY2x1ZGU9RkFMU0V9DQpkb21pbmFudGEgPC0gbmFtZXMoc29ydCh0YWJsZShkYW5lJG1hcml0YWxfc3RhdHVzKSwgZGVjcmVhc2luZyA9IFRSVUUpKVsxXQ0KZGFuZSRtYXJpdGFsX3N0YXR1c1tpcy5uYShkYW5lJG1hcml0YWxfc3RhdHVzKV0gPC0gZG9taW5hbnRhDQpkb21pbmFudGFfZ2VuZGVyIDwtIG5hbWVzKHNvcnQodGFibGUoZGFuZSRnZW5kZXIpLCBkZWNyZWFzaW5nID0gVFJVRSkpWzFdDQpkYW5lJGdlbmRlcltpcy5uYShkYW5lJGdlbmRlcildIDwtIGRvbWluYW50YV9nZW5kZXINCmRvbWluYW50YV9ob21lX293bmVyIDwtIG5hbWVzKHNvcnQodGFibGUoZGFuZSRob21lX293bmVyKSwgZGVjcmVhc2luZyA9IFRSVUUpKVsxXQ0KZGFuZSRob21lX293bmVyW2lzLm5hKGRhbmUkaG9tZV9vd25lcildIDwtIGRvbWluYW50YV9ob21lX293bmVyDQpgYGANCg0KRGxhIHptaWVubnljaCBrYXRlZ29yeWN6bnljaCAoc3RhbiBjeXdpbG55LCBwxYJlxIcsIHN0YXR1cyB3xYJhxZtjaWNpZWxhIGRvbXUpIGJyYWt1asSFY2Ugd2FydG/Fm2NpIHV6dXBlxYJuaWxpxZtteSBkb21pbmFudMSFLiBEemnEmWtpIHRlbXUgemFjaG93YWxpxZtteSByb3prxYJhZCBrYXRlZ29yaWksIG5pZSB1c3V3YWrEhWMgxbxhZG55Y2ggb2JzZXJ3YWNqaS4NCg0KIyMgSW1wdXRhY2phIGRhbnljaCB6IHXFvHljaWVtIG1lZGlhbnkgb3JheiBob3RkZWNrDQoNCmBgYHtyIGltcHV0YWNqYS1tZWRpYW4taG90ZGVjaywgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmRhbmUyIDwtIGFzLmRhdGEuZnJhbWUoZGFuZSkNCg0KZGFuZTIkY2Fyc1tpcy5uYShkYW5lMiRjYXJzKV0gPC0gbWVkaWFuKGRhbmUyJGNhcnMsIG5hLnJtID0gVFJVRSkNCmRhbmUyJGFnZVtpcy5uYShkYW5lMiRhZ2UpXSA8LSBtZWRpYW4oZGFuZTIkYWdlLCBuYS5ybSA9IFRSVUUpDQpkYW5lMiRjaGlsZHJlbltpcy5uYShkYW5lMiRjaGlsZHJlbildIDwtIG1lZGlhbihkYW5lMiRjaGlsZHJlbiwgbmEucm0gPSBUUlVFKQ0KDQppZiAoIXJlcXVpcmUoVklNKSkgaW5zdGFsbC5wYWNrYWdlcygiVklNIikNCmxpYnJhcnkoVklNKQ0KDQpkYW5lMiA8LSBob3RkZWNrKGRhbmUyLCB2YXJpYWJsZSA9ICJpbmNvbWUiKQ0KbXAgPC0gbWlzc2luZ19wYXR0ZXJuKGRhbmUyKQ0KYGBgDQoNClcgcHJ6eXBhZGt1IHptaWVubnljaCBpbG/Fm2Npb3d5Y2ggemFzdG9zb3dhbGnFm215IGltcHV0YWNqxJkgbWVkaWFuxIUgKHdpZWssIGxpY3piYSBkemllY2ksIGxpY3piYSBzYW1vY2hvZMOzdyksIGEgZGxhIGRvY2hvZHUgbWV0b2TEmSBob3RkZWNrLCBrdMOzcmEgcG9kc3Rhd2lhIHdhcnRvxZvEhyB6IHBvZG9ibnljaCBvYnNlcndhY2ppLiBQb3p3b2xpxYJvIHRvIHV6dXBlxYJuacSHIGRhbmUgYmV6IHNpbG5lZ28gem5pZWtzenRhxYJjYW5pYSBpY2ggcm96a8WCYWTDs3cuDQoNCiMjIEJyYWtpIHBvIGltcHV0YWNqaQ0KDQpgYGB7ciBicmFraS1wby1pbXB1dGFjamksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KG5hbmlhcikNCg0KbWlzc192YXJfc3VtbWFyeShkYW5lMikgJT4lDQogIGdnX21pc3NfdmFyKHNob3dfcGN0ID0gVFJVRSkgKw0KICBnZ3RpdGxlKCJCcmFraSBkYW55Y2ggcG8gaW1wdXRhY2ppIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQpaYXN0b3Nvd2FuYSBwcm9jZWR1cmEgaW1wdXRhY2ppIHBvendvbGnFgmEgdXp1cGXFgm5pxIcgd3N6eXN0a2llIGJyYWt1asSFY2Ugd2FydG/Fm2NpIHcgemJpb3J6ZSDigJMgZGFuZSBwbyBwcnpla3N6dGHFgmNlbmlhY2ggc8SFIHcgcGXFgm5pIGtvbXBsZXRuZS4NCg0KIyBXQUxJREFDSkEgREFOWUNIDQoNCmBgYHtyIHdhbGlkYWNqYSBkYW55Y2h9DQppZiAoIXJlcXVpcmUodmFsaWRhdGUpKSBpbnN0YWxsLnBhY2thZ2VzKCJ2YWxpZGF0ZSIpDQpsaWJyYXJ5KHZhbGlkYXRlKQ0KDQpydWxlcyA8LSB2YWxpZGF0b3IoDQogIGNhcnMgPT0gYXMuaW50ZWdlcihjYXJzKSwNCiAgY2hpbGRyZW4gPT0gYXMuaW50ZWdlcihjaGlsZHJlbiksDQogIGFnZSA9PSBhcy5pbnRlZ2VyKGFnZSksDQogIGNoaWxkcmVuID49IDAsDQogIGluY29tZSA+PSAwLA0KICBjYXJzID49IDAsDQogIGFnZSA+PSAwLA0KICBjb21tdXRlX2Rpc3RhbmNlID49IDAsDQogIGhvbWVfb3duZXIgJWluJSBjKCJZZXMiLCAiTm8iKSwNCiAgcHVyY2hhc2VkX2Jpa2UgJWluJSBjKCJZZXMiLCAiTm8iKSwNCiAgbWFyaXRhbF9zdGF0dXMgJWluJSBjKCJNYXJyaWVkIiwgIlNpbmdsZSIpLA0KICBnZW5kZXIgJWluJSBjKCJNYWxlIiwgIkZlbWFsZSIpLA0KICBlZHVjYXRpb24gJWluJSBjKCJCYWNoZWxvcnMiLCAiUGFydGlhbCBDb2xsZWdlIiwgIkhpZ2ggU2Nob29sIiwgIlBhcnRpYWwgSGlnaCBTY2hvb2wiLCAiR3JhZHVhdGUgRGVncmVlIiksDQogIG9jY3VwYXRpb24gJWluJSBjKCJTa2lsbGVkIE1hbnVhbCIsICJDbGVyaWNhbCIsICJQcm9mZXNzaW9uYWwiLCAiTWFudWFsIiwgIk1hbmFnZW1lbnQiKSwNCiAgcmVnaW9uICVpbiUgYygiRXVyb3BlIiwgIlBhY2lmaWMiLCAiTm9ydGggQW1lcmljYSIpDQopDQoNCm91dCA8LSBjb25mcm9udChkYW5lMiwgcnVsZXMpDQpzdW1tYXJ5KG91dCkNCmBgYA0KDQpXIGV0YXBpZSB3YWxpZGFjamkgc3ByYXdkemlsacWbbXkgemdvZG5vxZvEhyBkYW55Y2ggeiB6YcWCb8W8ZW5pYW1pIG1lcnl0b3J5Y3pueW1pIHpiaW9ydS4gWm1pZW5ueW0gaWxvxZtjaW93eW0gKGNhcnMsIGNoaWxkcmVuLCBhZ2UsIGluY29tZSwgY29tbXV0ZV9kaXN0YW5jZSkgbmFyenVjaWxpxZtteSB3YXJ1bmVrIG5pZXVqZW1ub8WbY2kgb3JheiwgdyBwcnp5cGFka3UgY2FycywgY2hpbGRyZW4gaSBhZ2UsIGNhxYJrb3dpdG9saWN6Ym93b8WbY2kuIERsYSB6bWllbm55Y2ggamFrb8WbY2lvd3ljaCB6d2VyeWZpa293YWxpxZtteSBwb3ByYXdub8WbxIcga2F0ZWdvcmlpIOKAkyB3IHN6Y3plZ8OzbG5vxZtjaSB3YXJ0b8WbY2kgYmluYXJuZSAoaG9tZV9vd25lciwgcHVyY2hhc2VkX2Jpa2UsIG1hcml0YWxfc3RhdHVzLCBnZW5kZXIpIG9yYXogcGXFgm55IHplc3RhdyBkb3B1c3pjemFsbnljaCBwb3ppb23Ds3cgZGxhIGVkdWNhdGlvbiwgb2NjdXBhdGlvbiBpIHJlZ2lvbiDigJMgY28gcG90d2llcmR6acWCbyBicmFrIGLFgsSZZG55Y2ggbHViIG5pZXNww7NqbnljaCBrb2Rvd2HFhC4NCg0KIyMgU3ByYXdkemVuaWUgZHVwbGlrYXTDs3cNCmBgYHtyIHNwcmF3ZHplbmllIGR1cGxpa2F0w7N3fQ0Kc3VtKGR1cGxpY2F0ZWQoZGFuZTIpKQ0KYGBgDQoNCkR1cGxpa2F0eSB3eXN0xJlwdWrEhSwgYWxlIHRyYWt0dWplbXkgamUgamFrbyBwb3d0YXJ6YWrEhWNlIHNpxJkgcHJvZmlsZSBrbGllbnTDs3cgKG5wLiBrb2xlam5lIHdpenl0eSksIGRsYXRlZ28gcG96b3N0YXdpYW15IGplIGJleiB6bWlhbi4NCg0KIyBXSVpVQUxJWkFDSkEgREFOWUNIDQoNCmBgYHtyIHVzdGF3aWVuaWEgd3lrcmVzw7N3LCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQoNCmRmIDwtIGRhbmUyDQoNCmRmJHB1cmNoYXNlZF9iaWtlIDwtIGZhY3RvcihkZiRwdXJjaGFzZWRfYmlrZSwgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpDQoNCm15X3RoZW1lIDwtIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICApDQpgYGANCg0KIyMgUHl0YW5pZSAxOiBXcMWCeXcgY2VjaCBkZW1vZ3JhZmljem55Y2ggKFdpZWssIERvY2jDs2QsIFd5a3N6dGHFgmNlbmllKQ0KDQpgYGB7ciB3aXp1YWxpemFjamEgZGFueWNofQ0KZ2dwbG90KGRmLCBhZXMoeCA9IGVkdWNhdGlvbiwgZmlsbCA9IHB1cmNoYXNlZF9iaWtlKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTm8iID0gIiM5OTk5OTkiLCAiWWVzIiA9ICIjNTZCNEU5IikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQcmF3ZG9wb2RvYmllxYRzdHdvIHpha3VwdSByb3dlcnUgd2cgd3lrc3p0YcWCY2VuaWEiLA0KICAgIHggPSAiUG96aW9tIHd5a3N6dGHFgmNlbmlhIiwNCiAgICB5ID0gIlByb2NlbnQga2xpZW50w7N3IiwNCiAgICBmaWxsID0gIkt1cGnFgiByb3dlcj8iDQogICkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIGNvb3JkX2ZsaXAoKSArIA0KICBteV90aGVtZQ0KYGBgDQoNCld5a3JlcyBwb2thenVqZSwgxbxlIG5hand5xbxzenkgdWR6aWHFgiBrdXB1asSFY3ljaCByb3dlciB3eXN0xJlwdWplIHfFm3LDs2Qgb3PDs2IgeiB3eWtzenRhxYJjZW5pZW0gd3nFvHN6eW0sIG5hdG9taWFzdCBrbGllbmNpIHogbmnFvHN6eW0gd3lrc3p0YcWCY2VuaWVtIHJ6YWR6aWVqIGRlY3lkdWrEhSBzacSZIG5hIHpha3VwLg0KDQojIyBQeXRhbmllIDI6IFN0YW4gcG9zaWFkYW5pYSBpIHN0eWwgxbx5Y2lhIChTYW1vY2hvZHksIERvamF6ZHkpDQoNCmBgYHtyIExpY3piYSBwb3NpYWRhbnljaCBzYW1vY2hvZMOzdyBhIHpha3VwIHJvd2VydX0NCmdncGxvdChkZiwgYWVzKHggPSBmYWN0b3IoY2FycyksIGZpbGwgPSBwdXJjaGFzZWRfYmlrZSkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArICMgImRvZGdlIiBzdGF3aWEgc8WCdXBraSBvYm9rIHNpZWJpZQ0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAiI0UxNTc1OSIsICJZZXMiID0gIiM3NkI3QjIiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkxpY3piYSBwb3NpYWRhbnljaCBzYW1vY2hvZMOzdyBhIHpha3VwIHJvd2VydSIsDQogICAgeCA9ICJMaWN6YmEgc2Ftb2Nob2TDs3ciLA0KICAgIHkgPSAiTGljemJhIGtsaWVudMOzdyIsDQogICAgZmlsbCA9ICJLdXBpxYIgcm93ZXI/Ig0KICApICsNCiAgbXlfdGhlbWUNCmBgYA0KDQpXaWR6aW15LCDFvGUga2xpZW5jaSBiZXogc2Ftb2Nob2R1IGx1YiBwb3NpYWRhasSFY3kgdHlsa28gamVkZW4gY3rEmcWbY2llaiBrdXB1asSFIHJvd2VyLCBhIHdyYXogemUgd3pyb3N0ZW0gbGljemJ5IGF1dCB3IGdvc3BvZGFyc3R3aWUgdWR6aWHFgiBrdXB1asSFY3ljaCB3eXJhxbpuaWUgc3BhZGEuDQoNCmBgYHtyIER5c3RhbnMgZG8gcHJhY3l9DQojIFVzdGFsZW5pZSBrb2xlam5vxZtjaSBkeXN0YW5zw7N3IChibyB0byB6bWllbm5hIHRla3N0b3dhLCBhIGNoY2VteSBsb2dpY3pueSBwb3J6xIVkZWspDQpkZiRjb21tdXRlX2Rpc3RhbmNlIDwtIGZhY3RvcihkZiRjb21tdXRlX2Rpc3RhbmNlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjAtMSBNaWxlcyIsICIxLTIgTWlsZXMiLCAiMi01IE1pbGVzIiwgIjUtMTAgTWlsZXMiLCAiMTArIE1pbGVzIikpDQoNCmdncGxvdChkZiwgYWVzKHggPSBjb21tdXRlX2Rpc3RhbmNlLCBmaWxsID0gcHVyY2hhc2VkX2Jpa2UpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vIiA9ICIjQkFCMEFDIiwgIlllcyIgPSAiI0YyOEUyQiIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiV3DFgnl3IGR5c3RhbnN1IGRvIHByYWN5IG5hIGRlY3l6asSZIG8gemFrdXBpZSIsDQogICAgc3VidGl0bGUgPSAiSW0ga3LDs3RzenkgZHlzdGFucywgdHltIHdpxJlrc3phIHN6YW5zYSBuYSB6YWt1cD8iLA0KICAgIHggPSAiRHlzdGFucyBkbyBwcmFjeSAobWlsZSkiLA0KICAgIHkgPSAiUHJvY2VudCBrbGllbnTDs3ciLA0KICAgIGZpbGwgPSAiS3VwacWCIHJvd2VyPyINCiAgKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgbXlfdGhlbWUNCmBgYA0KDQpLcsOzdHN6eSBkeXN0YW5zIGRvIHByYWN5IG5pZWtvbmllY3puaWUgd2nEhcW8ZSBzacSZIHogd3nFvHN6eW0gb2RzZXRraWVtIGt1cHVqxIVjeWNoIHJvd2VyIG5hIHBvemlvbWllIG9nw7NsbnltLCBuYXRvbWlhc3QgcHJ6eSBkdcW8eWNoIG9kbGVnxYJvxZtjaWFjaCB3eXJhxbpuaWUgcm/Fm25pZSB1ZHppYcWCIG9zw7NiLCBrdMOzcmUgcm93ZXJ1IG5pZSBrdXB1asSFLg0KDQojIyBQeXRhbmllIDM6IFLDs8W8bmljZSByZWdpb25hbG5lIGkgd2lla293ZQ0KDQpgYGB7ciBSZWdpb24gYSBvZ8OzbG5hIHNrdXRlY3pub8WbxIcgc3ByemVkYcW8eSwgZWNobz1GQUxTRX0NCmdncGxvdChkZiwgYWVzKHggPSByZWdpb24sIGZpbGwgPSBwdXJjaGFzZWRfYmlrZSkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk5vIiA9ICJncmV5NzAiLCAiWWVzIiA9ICJmb3Jlc3RncmVlbiIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGljemJhIHNwcnplZGFueWNoIHJvd2Vyw7N3IHcgcG9zemN6ZWfDs2xueWNoIHJlZ2lvbmFjaCIsDQogICAgeCA9ICJSZWdpb24iLA0KICAgIHkgPSAiTGljemJhIGtsaWVudMOzdyIsDQogICAgZmlsbCA9ICJLdXBpxYIgcm93ZXI/Ig0KICApICsNCiAgbXlfdGhlbWUNCmBgYA0KDQpNacSZZHp5IHJlZ2lvbmFtaSB3aWRhxIcgd3lyYcW6bmUgcsOzxbxuaWNlIHcgc3ByemVkYcW8eSDigJMgdyBqZWRueW0geiByZWdpb27Ds3cgbGljemJhIGtsaWVudMOzdyBrdXB1asSFY3ljaCByb3dlciBqZXN0IHpkZWN5ZG93YW5pZSB3ecW8c3phIG5pxbwgdyBwb3pvc3RhxYJ5Y2guDQoNCmBgYHtyIHJlZ2lvbi1keXN0YW5zLWdpbW5hc3R5Y3puYSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTd9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc2NhbGVzKQ0KDQojIFRhYmVsYSAlIGt1cHVqxIVjeWNoDQpoZWF0X2RhdGEgPC0gZGFuZTIlPiUNCiAgY291bnQocmVnaW9uLCBjb21tdXRlX2Rpc3RhbmNlLCBwdXJjaGFzZWRfYmlrZSkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBwdXJjaGFzZWRfYmlrZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQ0KICBtdXRhdGUocHJvY2VudF9ZZXMgPSBZZXMgLyAoWWVzICsgTm8pICogMTAwKSAlPiUNCiAgc2VsZWN0KHJlZ2lvbiwgY29tbXV0ZV9kaXN0YW5jZSwgcHJvY2VudF9ZZXMpICU+JQ0KICBtdXRhdGUoDQogICAgcmVnaW9uID0gZmFjdG9yKHJlZ2lvbiwgbGV2ZWxzID0gcmV2KHVuaXF1ZShyZWdpb24pKSksICAjIE9kd3LDs2NvbmUgcmVnaW9ueQ0KICAgIHByb2NlbnRfWWVzID0gcm91bmQocHJvY2VudF9ZZXMsIDEpDQogICkNCg0KIyBHSU1OQVNUWUNaTkEgKyBFVFlLSUVUWQ0KZ2dwbG90KGhlYXRfZGF0YSwgYWVzKHggPSBjb21tdXRlX2Rpc3RhbmNlLCB5ID0gcmVnaW9uLCBmaWxsID0gcHJvY2VudF9ZZXMpKSArDQogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAwLjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChwcm9jZW50X1llcywgIiUiKSksIA0KICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDQpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIoDQogICAgbG93ID0gIiNmZmVkYTAiLCBtaWQgPSAiI2YwM2IyMCIsIGhpZ2ggPSAiI2JkMDAyNiIsDQogICAgbWlkcG9pbnQgPSA1MCwgbmFtZSA9ICIlIEt1cHVqxIVjeWNoIiwNCiAgICBsaW1pdHMgPSBjKDAsIDEwMCksDQogICAgbGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSRUdJT04gw5cgRFlTVEFOUyBETyBQUkFDWSB2cyAlIFpBS1VQVSBST1dFUlUiLA0KICAgIHN1YnRpdGxlID0gIkNpZW1uaWVqc3p5IGtvbG9yID0gd3nFvHN6eSAlIGt1cHVqxIVjeWNoIiwNCiAgICB4ID0gIkR5c3RhbnMgZG8gcHJhY3kgKG1pbGUpIiwNCiAgICB5ID0gIlJlZ2lvbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpDQogICkgKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDEuNSkgICMgS3dhZHJhdG93ZSBrb23Ds3JraQ0KYGBgDQoNCkhlYXRtYXBhIHBva2F6dWplLCDFvGUgemFsZcW8bm/Fm8SHIG1pxJlkenkgZHlzdGFuc2VtIGRvIHByYWN5IGEgemFrdXBlbSByb3dlcnUgamVzdCBzaWxuaWUgenLDs8W8bmljb3dhbmEgcmVnaW9uYWxuaWUg4oCTIHcgbmlla3TDs3J5Y2ggcmVnaW9uYWNoIGtyw7N0a2llIGRvamF6ZHkgd2nEhcW8xIUgc2nEmSB6IHd5c29raW0gdWR6aWHFgmVtIGt1cHVqxIVjeWNoLCBwb2RjemFzIGdkeSB3IGlubnljaCBuYXdldCBwcnp5IHBvZG9ibnljaCBvZGxlZ8WCb8WbY2lhY2ggb2RzZXRlayB6YWt1cMOzdyBwb3pvc3RhamUgbmlza2kuDQoNCiMgQU5BTElaQSBPUElTT1dBDQoNCiMjIFN0YXR5c3R5a2kgb3Bpc293ZSB6bWllbm55Y2ggbGljemJvd3ljaA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpzdGF0c19vcGlzb3dlIDwtIGZ1bmN0aW9uKGRmLCB6bWllbm5hKSB7DQogIGRmICU+JQ0KICAgIHN1bW1hcmlzZSgNCiAgICAgIE1pbiA9IG1pbighIXN5bSh6bWllbm5hKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIFExID0gcXVhbnRpbGUoISFzeW0oem1pZW5uYSksIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgICBNZWRpYW5hID0gbWVkaWFuKCEhc3ltKHptaWVubmEpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgxZpyZWRuaWEgPSBtZWFuKCEhc3ltKHptaWVubmEpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgUTMgPSBxdWFudGlsZSghIXN5bSh6bWllbm5hKSwgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIE1heCA9IG1heCghIXN5bSh6bWllbm5hKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIFNEID0gc2QoISFzeW0oem1pZW5uYSksIG5hLnJtID0gVFJVRSksDQogICAgICBXYXJpYW5jamEgPSB2YXIoISFzeW0oem1pZW5uYSksIG5hLnJtID0gVFJVRSksDQogICAgICBJUVIgPSBJUVIoISFzeW0oem1pZW5uYSksIG5hLnJtID0gVFJVRSksDQogICAgICBDViA9IHJvdW5kKHNkKCEhc3ltKHptaWVubmEpLCBuYS5ybSA9IFRSVUUpIC8NCiAgICAgICAgICAgICAgICAgICBtZWFuKCEhc3ltKHptaWVubmEpLCBuYS5ybSA9IFRSVUUpICogMTAwLCAyKQ0KICAgICkgJT4lDQogICAgbXV0YXRlKA0KICAgICAgYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHJvdW5kKC54LCAyKSksDQogICAgICBabWllbm5hID0gem1pZW5uYQ0KICAgICkgJT4lDQogICAgc2VsZWN0KFptaWVubmEsIGV2ZXJ5dGhpbmcoKSkNCn0NCg0Kem1pZW5uZV9udW0gPC0gYygiYWdlIiwgImluY29tZSIsICJjYXJzIiwgImNoaWxkcmVuIikNCnRhYmVsYV9zdGF0IDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseSh6bWllbm5lX251bSwgZnVuY3Rpb24oeCkgc3RhdHNfb3Bpc293ZShkYW5lMiwgeCkpKQ0KDQp0YWJlbGFfc3RhdCAlPiUNCiAga2FibGUoImh0bWwiLA0KICAgICAgICBjYXB0aW9uID0gIlN0YXR5c3R5a2kgb3Bpc293ZSB6bWllbm55Y2ggbnVtZXJ5Y3pueWNoIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpICU+JQ0KICBzY3JvbGxfYm94KGhlaWdodCA9ICI0MDBweCIpDQpgYGANCg0KS2xpZW5jaSBza2xlcHUgdG8gb3NvYnkgxZtyZWRuaW8gNDQtbGV0bmllIChhbGUgeiBkdcW8eW0gcm96cnp1dGVtOiAyNS04OSBsYXQpLCBvIMWbcmVkbmltIGRvY2hvZHppZSA1NiB0eXMuICQgcHJ6eSBiYXJkem8gd3lzb2tpbSB6csOzxbxuaWNvd2FuaXUgemFyb2Jrw7N3IChDVj01NSUpLiBUeXBvd2UgZ29zcG9kYXJzdHdvIGRvbW93ZSBwb3NpYWRhIDEgc2Ftb2Now7NkIGkgMiBkemllY2ksIGNob8SHIHcgb2J1IHR5Y2ggem1pZW5ueWNoIG9ic2Vyd3VqZW15IHNrcmFqbsSFIG5pZWplZG5vcm9kbm/Fm8SHIChDViA+NzUlKSAtIGN6xJnFm8SHIGtsaWVudMOzdyBuaWUgbWEgdyBvZ8OzbGUgYXV0IGFuaSBkemllY2ksIHBvZGN6YXMgZ2R5IGlubmkgbWFqxIUgaWNoIHBvIGtpbGthLg0KDQojIyBTdGF0eXN0eWtpIG9waXNvd2Ugem1pZW5ueWNoIGpha2/Fm2Npb3d5Y2gNCg0KYGBge3J9DQoNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpkYW5lX2NhdCA8LSBkYW5lMiU+JSBzZWxlY3Qod2hlcmUofiBpcy5jaGFyYWN0ZXIoLngpIHx8IGlzLmZhY3RvcigueCkpKQ0KDQp3eW5payA8LSBkYXRhLmZyYW1lKCkNCg0KZm9yIChjb2xuYW1lIGluIG5hbWVzKGRhbmVfY2F0KSkgew0KICB0IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGFuZV9jYXRbW2NvbG5hbWVdXSwgdXNlTkEgPSAiaWZhbnkiKSkNCiAgY29sbmFtZXModCkgPC0gYygia2F0ZWdvcmlhIiwgImxpY3piYSIpDQogIHQkcHJvY2VudCA8LSByb3VuZCgxMDAgKiB0JGxpY3piYSAvIHN1bSh0JGxpY3piYSksIDIpDQogIHQkem1pZW5uYSA8LSBjb2xuYW1lDQogIHd5bmlrIDwtIHJiaW5kKHd5bmlrLCB0KQ0KfQ0KDQp3eW5payA8LSB3eW5payAlPiUgc2VsZWN0KHptaWVubmEsIGthdGVnb3JpYSwgbGljemJhLCBwcm9jZW50KQ0KDQp3eW5payAlPiUNCiAga2FibGUoImh0bWwiLA0KICAgICAgICBjYXB0aW9uID0gIlN0YXR5c3R5a2kgb3Bpc293ZSBkbGEgem1pZW5ueWNoIGpha2/Fm2Npb3d5Y2ggKGN6xJlzdG/Fm2NpKSIsDQogICAgICAgIGRpZ2l0cyA9IDIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIg0KICApICU+JQ0KICBzY3JvbGxfYm94KGhlaWdodCA9ICI1MDBweCIpDQoNCmBgYA0KDQpLbGllbmNpIHNrbGVwdSBzxIUgdyB3acSZa3N6b8WbY2kgxbxvbmFjaS96YW3EmcW8bmkgKDU0JSksIHogbmllbWFsIGlkZWFsbnltIHBvZHppYcWCZW0gbmEgcMWCZcSHICg1MSUgbcSZxbxjenl6bikuIFBvbmFkIHBvxYJvd2EgcG9zaWFkYSB3eWtzenRhxYJjZW5pZSB3ecW8c3plIChsaWNlbmNqYXQgbHViIG1hZ2lzdGVyaXVtKSwgYSB3acSZa3N6b8WbxIcgKDY5JSkgamVzdCB3xYJhxZtjaWNpZWxhbWkgZG9tw7N3LiBDbyBpc3RvdG5lLCBrbGllbmNpIHBvY2hvZHrEhSBnxYLDs3duaWUgeiBBbWVyeWtpIFDDs8WCbm9jbmVqICg1MSUpIGkgZGVjeXpqZSB6YWt1cG93ZSBzxIUgbmllbWFsIHLDs3dubyBwb2R6aWVsb25lIC0gNDglIGt1cGnFgm8gcm93ZXIsIDUyJSBuaWUgZG9rb25hxYJvIHpha3VwdS4NCg0KIyMgS29yZWxhY2plIG1pxJlkenkgem1pZW5ueW1pIGxpY3pib3d5bWkNCg0KYGBge3IgS29yZWxhY2phIG1pxJlkenkgem1pZW5ueW1pIGlsb8WbY2lvd3ltaX0NCmlmICghcmVxdWlyZShjb3JycGxvdCkpIGluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KGRwbHlyKQ0KDQp6bWllbm5lX2lsb3NjIDwtIGRhbmUyJT4lIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkNCk0gPC0gY29yKHptaWVubmVfaWxvc2MsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KDQpjb3JycGxvdChNLCBtZXRob2QgPSAiY2lyY2xlIiwgdHlwZSA9ICJ1cHBlciIsDQphZGRDb2VmLmNvbCA9ICJibGFjayIsIHRsLmNvbCA9ICJibGFjayIsDQp0bC5zcnQgPSA0NSwgbnVtYmVyLmNleCA9IDAuOCwNCmNvbCA9IGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkoMjAwKSwNCnRpdGxlID0gIktvcmVsYWNqYSB6bWllbm55Y2ggbnVtZXJ5Y3pueWNoIikNCmBgYA0KDQpXeXN0xJlwdWplIHPFgmFiYSBkb2RhdG5pYSBrb3JlbGFjamEgbWnEmWR6eSBkb2Nob2RlbSBhIGxpY3pixIUgZHppZWNpIChyPTAuMjYpIG9yYXogbWnEmWR6eSBkb2Nob2RlbSBhIGxpY3pixIUgc2Ftb2Nob2TDs3cgKHI9MC40NCksIGNvIHN1Z2VydWplLCDFvGUgd3nFvHN6ZSB6YXJvYmtpIHdpxIXFvMSFIHNpxJkgeiBwb3NpYWRhbmllbSB3acSZa3N6ZWogbGljemJ5IGF1dCBpIHBvdG9tc3R3YS4gWmFza2FrdWrEhWNvIG5pc2thIGtvcmVsYWNqYSB3aWVrdSB6IGRvY2hvZGVtIChyPTAuMTcpIHdza2F6dWplLCDFvGUgdyB0ZWogcG9wdWxhY2ppIHN0YXJzaSBrbGllbmNpIG5pZSBzxIUgem5hY3rEhWNvIGJvZ2F0c2kgb2QgbcWCb2RzenljaC4gTGljemJhIHNhbW9jaG9kw7N3IG5pZSBrb3JlbHVqZSBwcmFrdHljem5pZSB6IG5pY3p5bSBwb3phIGRvY2hvZGVtLg0KDQojIyBEb2Now7NkIGEgemFrdXAgcm93ZXJ1DQoNCmBgYHtyfQ0KDQpkYW5lMiRpbmNvbWVfYmluIDwtIGN1dChkYW5lMiRpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDE4MDAwMCwgYnkgPSAyMDAwMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlnLmxhYiA9IDEwLA0KICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKQ0KDQoNCmdncGxvdChkYW5lMiwgYWVzKHggPSBpbmNvbWVfYmluLCBmaWxsID0gcHVyY2hhc2VkX2Jpa2UpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgY29sb3IgPSAid2hpdGUiKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAiI0UxNTc1OSIsICJZZXMiID0gIiM3NkI3QjIiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkxpY3piYSB6YWt1cGlvbnljaCByb3dlcsOzdyB3IHphbGXFvG5vxZtjaSBvZCBwcnplZHppYcWCdSB6YXJvYmvDs3ciLA0KICAgIHN1YnRpdGxlID0gIlJvemvFgmFkIGRlY3l6amkgemFrdXBvd3ljaCB3IGdydXBhY2ggZG9jaG9kb3d5Y2giLA0KICAgIHggPSAiUHJ6ZWR6aWHFgiB6YXJvYmvDs3cgKEluY29tZSkiLA0KICAgIHkgPSAiTGljemJhIGtsaWVudMOzdyAoSWxvxZvEhykiLA0KICAgIGZpbGwgPSAiQ3p5IGt1cGnFgiByb3dlcj8iKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTQpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICkNCmBgYA0KDQpaYWt1cHkgcm93ZXLDs3cgc8SFIG5hamxpY3puaWVqc3plIHcgcHJ6ZWR6aWFsZSDFm3JlZG5pY2ggZG9jaG9kw7N3IDIwLTgwIHR5cy4gJCAoxYLEhWN6bmllIDM0MCB6YWt1cMOzdyksIGdkemllIGtsaWVuY2kgc3Rhbm93acSFIHdpxJlrc3pvxZvEhyBiYXp5LiBXIHByemVkemlhxYJhY2ggc2tyYWpueWNoICg8MjAgdHlzLiBpID4xMDAgdHlzLikgc3ByemVkYcW8IGplc3Qgd3lyYcW6bmllIG5pxbxzemEg4oCTIG5hamJpZWRuaWVqc2kgcHJhd2RvcG9kb2JuaWUgbmllIHN0YcSHIG5hIHJvd2VyLCBhIG5hanphbW/FvG5pZWpzaSB3eWJpZXJhasSFIGlubmUgZm9ybXkgcmVrcmVhY2ppIGx1YiBsdWtzdXNvd2UgYWx0ZXJuYXR5d3kuIFdhcnRvIHphdXdhxbx5xIcsIMW8ZSB3IHByemVkemlhbGUgODAtMTAwIHR5cy4gcHJvcG9yY2phIGt1cHVqxIVjeWNoIHd6cmFzdGEgKDQwIG5hIDc1IGtsaWVudMOzdyksIGNvIG1vxbxlIHdza2F6eXdhxIcgbmEgb3B0eW1hbG55IHByw7NnIGRvY2hvZG93eSBkbGEgdGVqIGthdGVnb3JpaSBwcm9kdWt0dS4NCg0KIyMgV2llayBhIHpha3VwIHJvd2VydQ0KDQpgYGB7cn0NCmRhbmUyJGFnZV9ncm91cCA8LSBjdXQoDQogIGRhbmUyJGFnZSwNCiAgYnJlYWtzID0gYygwLCAyNSwgMzUsIDQ1LCA1NSwgMTAwKSwNCiAgbGFiZWxzID0gYygiPD0yNSIsICIyNuKAkzM1IiwgIjM24oCTNDUiLCAiNDbigJM1NSIsICI1NisiKSwNCiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFDQopDQoNCnRhYl9hZ2VfYmlrZSA8LSB0YWJsZShkYW5lMiRhZ2VfZ3JvdXAsIGRhbmUyJHB1cmNoYXNlZF9iaWtlKQ0KDQpjaGlfcmVzIDwtIGNoaXNxLnRlc3QodGFiX2FnZV9iaWtlKQ0KY2hpMiAgICA8LSBhcy5udW1lcmljKGNoaV9yZXMkc3RhdGlzdGljKQ0KbiAgICAgICA8LSBzdW0odGFiX2FnZV9iaWtlKQ0KayAgICAgICA8LSBtaW4obnJvdyh0YWJfYWdlX2Jpa2UpIC0gMSwgbmNvbCh0YWJfYWdlX2Jpa2UpIC0gMSkNClZfY3JhbWVyIDwtIHNxcnQoY2hpMiAvIChuICogaykpDQoNCiMgcHJvY2VudHkgdyB3aWVyc3phY2gNCnByb3BfYWdlIDwtIHByb3AudGFibGUodGFiX2FnZV9iaWtlLCBtYXJnaW4gPSAxKSAqIDEwMA0KDQojIMWCxIVjenlteTogImxpY3piYSAocHJvY2VudCUpIg0KdGFiX2NvbWJvIDwtIG1hdHJpeCgNCiAgcGFzdGUwKHRhYl9hZ2VfYmlrZSwgIiAoIiwgcm91bmQocHJvcF9hZ2UsIDEpLCAiJSkiKSwNCiAgbnJvdyA9IG5yb3codGFiX2FnZV9iaWtlKSwNCiAgZGltbmFtZXMgPSBkaW1uYW1lcyh0YWJfYWdlX2Jpa2UpDQopDQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmthYmxlKHRhYl9jb21ibywNCiAgICAgIGNhcHRpb24gPSAiWmFrdXAgcm93ZXJ1IHcgZ3J1cGFjaCB3aWVrb3d5Y2ggKGxpY3piYSBpICUgdyB3aWVyc3p1KSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIikpDQoNCg0KYGBgDQoNCldpZWsga2xpZW50w7N3IG1hIGlzdG90bnkgc3RhdHlzdHljem5pZSB3cMWCeXcgbmEgZGVjeXpqxJkgemFrdXBvd8SFIChwIDwgMCwwMDEsIFYgQ3JhbcOpcmEgPSAwLDE4KS4gTmFqd3nFvHN6eSBvZHNldGVrIGt1cHVqxIVjeWNoIHd5c3TEmXB1amUgdyBncnVwaWUgMzYtNDUgbGF0ICg1NyUpLCBwb2RjemFzIG5ham3Fgm9kc2kga2xpZW5jaSAo4omkMjUgbGF0KSBjaG/EhyBrdXB1asSFIG5hamNoxJl0bmllaiAoNjAlKSwgc3Rhbm93acSFIHpuaWtvbcSFIGN6xJnFm8SHIGJhenkuIFBvd3nFvGVqIDU1IHJva3Ugxbx5Y2lhIHNrxYJvbm5vxZvEhyBkbyB6YWt1cHUgZ3dhxYJ0b3duaWUgc3BhZGEgKHR5bGtvIDMxJSBrdXB1asSFY3ljaCksIGNvIHN1Z2VydWplLCDFvGUgcm93ZXIgamVzdCBwcm9kdWt0ZW0gc2tpZXJvd2FueW0gZ8WCw7N3bmllIGRvIG9zw7NiIHcgxZtyZWRuaW0gd2lla3UuDQoNCiMjIEtvcmVsYWNqZSBtacSZZHp5IHptaWVubnltaSBqYWtvxZtjaW93eW1pDQoNCmBgYHtyfQ0KaWYgKCFyZXF1aXJlKERlc2NUb29scykpIGluc3RhbGwucGFja2FnZXMoIkRlc2NUb29scyIpDQppZiAoIXJlcXVpcmUoY29ycnBsb3QpKSBpbnN0YWxsLnBhY2thZ2VzKCJjb3JycGxvdCIpDQpsaWJyYXJ5KERlc2NUb29scykNCg0KcXVhbF92YXJzIDwtIGRhbmUyJT4lIA0KICBzZWxlY3QocHVyY2hhc2VkX2Jpa2UsIGdlbmRlciwgbWFyaXRhbF9zdGF0dXMsIGhvbWVfb3duZXIsDQogICAgICAgICBlZHVjYXRpb24sIG9jY3VwYXRpb24sIHJlZ2lvbikNCg0KbnEgPC0gbmNvbChxdWFsX3ZhcnMpDQpjcmFtZXJfbWF0cml4IDwtIG1hdHJpeChOQSwgbnJvdyA9IG5xLCBuY29sID0gbnEpDQpjb2xuYW1lcyhjcmFtZXJfbWF0cml4KSA8LSBjb2xuYW1lcyhxdWFsX3ZhcnMpDQpyb3duYW1lcyhjcmFtZXJfbWF0cml4KSA8LSBjb2xuYW1lcyhxdWFsX3ZhcnMpDQoNCmZvciAoaSBpbiAxOm5xKSB7DQogIGZvciAoaiBpbiAxOm5xKSB7DQogICAgY3JhbWVyX21hdHJpeFtpLCBqXSA8LSBpZiAoaSA9PSBqKSAxIGVsc2UNCiAgICAgIENyYW1lclYodGFibGUocXVhbF92YXJzW1tpXV0sIHF1YWxfdmFyc1tbal1dKSkNCiAgfQ0KfQ0KDQpjb3JycGxvdCgNCiAgY3JhbWVyX21hdHJpeCwgDQogIG1ldGhvZCA9ICJjb2xvciIsDQogIHR5cGUgPSAidXBwZXIiLA0KICBhZGRDb2VmLmNvbCA9ICJibGFjayIsDQogIHRsLmNvbCA9ICJibGFjayIsDQogIHRsLnNydCA9IDQ1LA0KICBudW1iZXIuY2V4ID0gMC44LA0KICBjb2wgPSBjb2xvclJhbXBQYWxldHRlKGMoIndoaXRlIiwgInJlZCIpKSgyMDApLA0KICB0aXRsZSA9ICJNYWNpZXJ6IHphbGXFvG5vxZtjaSB6bWllbm55Y2ggamFrb8WbY2lvd3ljaCAoQ3JhbcOpcidzIFYpIg0KKQ0KDQpgYGANCg0KTWFjaWVyeiBDcmFtw6lyYSBwb2thenVqZSwgxbxlIG5hanNpbG5pZWogeiBkZWN5emrEhSBvIHpha3VwaWUgcm93ZXJ1IHBvd2nEhXphbmUgc8SFIHd5a3N6dGHFgmNlbmllLCBzdGFuIGN5d2lsbnkgaSByZWdpb24sIGEgc8WCYWJzemUgendpxIV6a2kgd3lzdMSZcHVqxIUgZGxhIGR5c3RhbnN1IGRvIHByYWN5LiBQxYJlxIcsIHN0YXR1cyB3xYJhxZtjaWNpZWxhIGRvbXUgaSB0eXAgemF3b2R1IG1hasSFIG5pc2tpZSB3YXJ0b8WbY2kgViwgY28gcG90d2llcmR6YSBpY2ggb2dyYW5pY3pvbsSFIHJvbMSZIGpha28gcHJlZHlrdG9yw7N3IHpha3VwdS4NCg0KIyMgUHJvZmlsIGtsaWVudGEga3VwdWrEhWNlZ28gcm93ZXINCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KcHJvZmlsX2tsaWVudGEgPC0gZGFuZTIgJT4lDQogIGZpbHRlcihwdXJjaGFzZWRfYmlrZSA9PSAiWWVzIikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBTcmVkbmlfV2llayA9IGNlaWxpbmcobWVhbihhZ2UsIG5hLnJtID0gVFJVRSkpLA0KICAgIE1lZGlhbmFfRG9jaG9kb3cgPSBtZWRpYW4oaW5jb21lLCBuYS5ybSA9IFRSVUUpLA0KICAgIFNyZWRuaWFfTGljemJhX0F1dCA9IHJvdW5kKG1lYW4oY2FycywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgTmFqY3plc3RzenlfUmVnaW9uID0gbmFtZXMoc29ydCh0YWJsZShyZWdpb24pLCBkZWNyZWFzaW5nID0gVFJVRSkpWzFdLA0KICAgIE5hamN6ZXN0c3plX1d5a3N6dGFsY2VuaWUgPSBuYW1lcyhzb3J0KHRhYmxlKGVkdWNhdGlvbiksIGRlY3JlYXNpbmcgPSBUUlVFKSlbMV0NCiAgKQ0KDQpwcm9maWxfa2xpZW50YSAlPiUNCiAga2FibGUoImh0bWwiLCBkaWdpdHMgPSAyLCBmb3JtYXQuYXJncyA9IGxpc3Qoc2NpZW50aWZpYyA9IEZBTFNFKSwNCiAgICAgICAgY2FwdGlvbiA9ICJQcm9maWwgcHJ6ZWNpxJl0bmVnbyBrbGllbnRhIGt1cHVqxIVjZWdvIHJvd2VyIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTQpDQoNCmBgYA0KDQpBbmFsaXphIHBva2F6dWplLCDFvGUgZGVjeXpqZSBvIHpha3VwaWUgcm93ZXJ1IHphbGXFvMSFIHphcsOzd25vIG9kIGNlY2ggZGVtb2dyYWZpY3pueWNoLCBqYWsgaSBzdGF0dXN1IHNwb8WCZWN6bm/igJFla29ub21pY3puZWdvIGtsaWVudMOzdy4gTmFqd2nEmWNlaiB6YWt1cMOzdyBkb2tvbnVqxIUgb3NvYnkgdyB3aWVrdSAyNuKAkzQ1IGxhdCwgYSByw7PFvG5pY2UgbWnEmWR6eSBncnVwYW1pIHdpZWtvd3ltaSBzxIUgaXN0b3RuZSBzdGF0eXN0eWN6bmllICh0ZXN0IGNoaeKAkWt3YWRyYXQsIHAgPCAwLDAwMTsgViBDcmFtw6lyYSDiiYggMCwyNCkuIFfFm3LDs2Qgem1pZW5ueWNoIGpha2/Fm2Npb3d5Y2ggbmFqd2nEmWtzemUgem5hY3plbmllIG1hasSFIHBvemlvbSB3eWtzenRhxYJjZW5pYSwgc3RhdHVzIHfFgmHFm2NpY2llbGEgZG9tdSBvcmF6IHJlZ2lvbiB6YW1pZXN6a2FuaWEsIGNvIGRvYnJ6ZSB3aWRhxIcgbmEgbWFjaWVyenkgQ3JhbcOpcmEuIFd5bmlrYSB6IHRlZ28sIMW8ZSBuYSB6YWNob3dhbmlhIHpha3Vwb3dlIHcgc2tsZXBpZSByb3dlcm93eW0gc2lsbmllIHdwxYJ5d2FqxIUgemFyw7N3bm8gY2VjaHkgZGVtb2dyYWZpY3puZSwgamFrIGkgc3plcm9rbyByb3p1bWlhbnkgc3R5bCDFvHljaWEgb3JheiBwb3p5Y2phIHNwb8WCZWN6bm/igJFla29ub21pY3puYSBrbGllbnRhLg0KDQojIFRFU1RPV0FOSUUgU1RBVFlTVFlDWk5FDQoNCiMjIFptaWVubmUgaWxvxZtjaW93ZSBhIHpha3VwIHJvd2VydQ0KDQpgYGB7ciB0ZXN0b3dhbmllIHN0YXR5c3R5Y3puZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIElOU1RBTEFDSkEgSSDFgUFET1dBTklFIGdnc3RhdHNwbG90DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KaWYgKCFyZXF1aXJlKGdnc3RhdHNwbG90KSkgaW5zdGFsbC5wYWNrYWdlcygiZ2dzdGF0c3Bsb3QiKQ0KaWYgKCFyZXF1aXJlKGRwbHlyKSkgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KbGlicmFyeShnZ3N0YXRzcGxvdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVXN0YXdpZW5pZSBkYW55Y2ggLSBwdXJjaGFzZWRfYmlrZSBqYWtvIGZhY3RvciB6IFllcyBuYSBnw7NyemUNCmRhbmUyJHB1cmNoYXNlZF9iaWtlIDwtIGZhY3RvcihkYW5lMiRwdXJjaGFzZWRfYmlrZSwgbGV2ZWxzID0gYygiWWVzIiwgIk5vIikpDQpkYW5lMiRlZHVjYXRpb24gPC0gZmFjdG9yKGRhbmUyJGVkdWNhdGlvbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQmFjaGVsb3JzIiwgIlBhcnRpYWwgQ29sbGVnZSIsICJIaWdoIFNjaG9vbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJ0aWFsIEhpZ2ggU2Nob29sIiwgIkdyYWR1YXRlIERlZ3JlZSIpKQ0KDQojIFdpZWsgdnMgWmFrdXAgLSBhdXRvbWF0eWN6bmllIHRlc3QgdC9XaWxjb3hvbiArIGVmZWt0IHdpZWxrb8WbY2kNCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGFuZTIsDQogIHggPSBwdXJjaGFzZWRfYmlrZSwNCiAgeSA9IGFnZSwNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwgICMgV2lsY294b24gZGxhIGNlbiAoYmV6cGllY3pueSB3eWLDs3IpDQogIHRpdGxlID0gIlJvemvFgmFkIHdpZWt1OiBLdXB1asSFY3kgdnMgTmlla3VwdWrEhWN5IiwNCiAgeGxhYiA9ICJDenkga3VwacWCIHJvd2VyPyIsDQogIHlsYWIgPSAiV2llayIsDQogIHBhaXJ3aXNlLmNvbXBhcmlzb25zID0gVFJVRSwNCiAgY2VudHJhbGl0eS5wbG90dGluZyA9IFRSVUUNCikgKyB0aGVtZV9taW5pbWFsKCkNCg0KI0RsYWN6ZWdvIHd5YnJhbGnFm215IHRlc3R5IG5pZSB3eW1hZ2FqxIUgbm9ybWFsbm9zY2kgcm96a8WCYWR1Pw0KdGVzdF9ub3JtPC0gc2hhcGlyby50ZXN0KGRhbmUyJGluY29tZSkNCnRlc3Rfbm9ybSRwLnZhbHVlDQpwcmludCh0ZXN0X25vcm0pDQoNCiMgRG9jaMOzZCB2cyBaYWt1cA0KZ2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBkYW5lMiwNCiAgeCA9IHB1cmNoYXNlZF9iaWtlLA0KICB5ID0gaW5jb21lLA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLA0KICB0aXRsZSA9ICJSb3prxYJhZCBkb2Nob2TDs3c6IEt1cHVqxIVjeSB2cyBOaWVrdXB1asSFY3kiLA0KICB4bGFiID0gIkN6eSBrdXBpxYIgcm93ZXI/IiwgDQogIHlsYWIgPSAiRG9jaMOzZCByb2N6bnkgKCQpIiwNCiAgcGFpcndpc2UuY29tcGFyaXNvbnMgPSBUUlVFDQopDQoNCmBgYA0KDQpUZXN0IE1hbm5hLVdoaXRuZXlhIHBvdHdpZXJkemEgaXN0b3RuxIUgc3RhdHlzdHljem5pZSByw7PFvG5pY8SZIHdpZWt1IG1pxJlkenkga3VwdWrEhWN5bWkgYSBuaWVrdXB1asSFY3ltaSAocCA9IDAsMDAzOCkuIEt1cHVqxIVjeSBzxIUgxZtyZWRuaW8gbcWCb2RzaSDigJMgaWNoIG1lZGlhbmEgd2lla3UgdG8gNDEgbGF0LCBwb2RjemFzIGdkeSBuaWVrdXB1asSFY3ljaCA0NCBsYXRhLiBFZmVrdCB3aWVsa2/Fm2NpIGplc3QgamVkbmFrIG5pZXdpZWxraSAociA9IC0wLDExKSwgY28gb3puYWN6YSwgxbxlIGNob8SHIHdpZWsgbWEgem5hY3plbmllLCBuaWUgamVzdCBnxYLDs3dueW0gd3l6bmFjem5pa2llbSBkZWN5emppIHpha3Vwb3dlai4gUm96a8WCYWR5IHcgb2J1IGdydXBhY2ggc8SFIHN6ZXJva2llIGkgbmFrxYJhZGFqxIUgc2nEmSwgd3NrYXp1asSFYyBuYSBpc3RuaWVuaWUgaW5ueWNoIHdhxbxueWNoIGN6eW5uaWvDs3cuDQoNClRlc3QgTWFubmEtV2hpdG5leWEgbmllIHd5a2F6YcWCIGlzdG90bmVqIHN0YXR5c3R5Y3puaWUgcsOzxbxuaWN5IHcgZG9jaG9kYWNoIG1pxJlkenkga3VwdWrEhWN5bWkgYSBuaWVrdXB1asSFY3ltaSAocCA9IDAsMTgpLiBPYmllIGdydXB5IG1hasSFIGlkZW50eWN6bsSFIG1lZGlhbsSZIGRvY2hvZHUgKDYwIHR5cy4gJCksIGNvIHN1Z2VydWplLCDFvGUgc2FtIHBvemlvbSB6YXJvYmvDs3cgbmllIGRldGVybWludWplIGRlY3l6amkgbyB6YWt1cGllIHJvd2VydS4gUm96a8WCYWR5IGRvY2hvZMOzdyB3IG9idSBncnVwYWNoIHPEhSBiYXJkem8gcG9kb2JuZSDigJMgemFrdXAgemFsZcW8eSByYWN6ZWogb2QgaW5ueWNoIGN6eW5uaWvDs3cgKGphayBzdGFuIGN5d2lsbnksIGxpY3piYSBzYW1vY2hvZMOzdyBjenkgd3lrc3p0YcWCY2VuaWUpIG5pxbwgb2Qgd3lzb2tvxZtjaSB3eW5hZ3JvZHplbmlhLg0KDQoNCiMjIEFuYWxpemEgZGxhIHdzenlzdGtpY2ggcG96aW9tw7N3IHptaWVubmVqICdjYXJzJw0KDQpgYGB7cn0NCiMgQXV0b21hdHljem5hIGFuYWxpemEgZGxhIHdzenlzdGtpY2ggcG96aW9tw7N3IHptaWVubmVqICdjYXJzJw0KZ3JvdXBlZF9nZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRhbmUyLA0KICB4ID0gcHVyY2hhc2VkX2Jpa2UsDQogIHkgPSBhZ2UsDQogIGdyb3VwaW5nLnZhciA9IGNhcnMsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlLnByZWZpeCA9ICJXaWVrIGtsaWVudMOzdyB3ZyBsaWN6Ynkgc2Ftb2Nob2TDs3ciLA0KICBucm93ID0gMiwNCiAgbmNvbCA9IDINCikNCg0KYGBgDQpEbGEga2HFvGRlZ28gcG96aW9tdSB6bWllbm5laiBjYXJzICgw4oCTNCBhdXRhKSByb3prxYJhZHkgd2lla3Uga3VwdWrEhWN5Y2ggaSBuaWVrdXB1asSFY3ljaCBzxIUgYmFyZHpvIHBvZG9ibmUsIGEgcsOzxbxuaWNlIHcgbWVkaWFuYWNoIHPEhSBuaWV3aWVsa2llLiBUZXN0eSBuaWUgd3NrYXp1asSFIG5hIGlzdG90bnkgZWZla3Qgd2lla3UgdyDFvGFkbmVqIHogcG9kZ3J1cCDigJMgbmF3ZXQgcHJ6eSB3acSZa3N6ZWogbGljemJpZSBzYW1vY2hvZMOzdyBrdXB1asSFY3kgaSBuaWVrdXB1asSFY3kgbWFqxIUgemJsacW8b255IHdpZWsuIFcgcHJha3R5Y2Ugb3puYWN6YSB0bywgxbxlIHRvIGxpY3piYSBhdXQsIGEgbmllIHdpZWsgdyBvYnLEmWJpZSBkYW5laiBrYXRlZ29yaWkg4oCeY2Fyc+KAnSwgamVzdCBrbHVjem93eW0gY3p5bm5pa2llbSByw7PFvG5pY3VqxIVjeW0gZGVjeXpqxJkgbyB6YWt1cGllLg0KDQojIyBSb3prxYJhZCB3aWVrdSBpIGRvY2hvZHUgeiBwb2R6aWHFgmVtIG5hIHpha3VwDQoNCmBgYHtyfQ0KIyBSb3prxYJhZCBwdW5rdG93eSB6IGxpbmnEhSByZWdyZXNqaSArIHRlc3Qga29yZWxhY2ppDQpnZ3NjYXR0ZXJzdGF0cygNCiAgZGF0YSA9IGRhbmUyLA0KICB4ID0gYWdlLA0KICB5ID0gaW5jb21lLA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLCAgIyBTcGVhcm1hbg0KICBjb25mLmxldmVsID0gMC45NSwNCiAgbWFyZ2luYWwgPSAiaGlzdG9ncmFtIiwgICMgaGlzdG9ncmFteSBuYSBtYXJnaW5lc2FjaA0KICB0aXRsZSA9ICJLb3JlbGFjamEgd2lla3UgaSBkb2Nob2R1IHogZGVjeXpqxIUgbyB6YWt1cGllIg0KKSArIGZhY2V0X3dyYXAofnB1cmNoYXNlZF9iaWtlKQ0KYGBgDQoNCld5a3JlcyBwb2thenVqZSwgxbxlIHJvemvFgmFkeSB3aWVrdSBrdXB1asSFY3ljaCAoIlllcyIpIGkgbmlla3VwdWrEhWN5Y2ggKCJObyIpIHPEhSBwcmFrdHljem5pZSBpZGVudHljem5lIGRsYSBrYcW8ZGVnbyByb2t1IMW8eWNpYSBvZCA0MCBkbyA4MCBsYXQg4oCTIGthxbxkYSBncnVwYSB3aWVrb3dhIG1hIHBvIDEwMDAgb2JzZXJ3YWNqaSB3IG9idSBrYXRlZ29yaWFjaC4gVG8gcG90d2llcmR6YSB3Y3plxZtuaWVqc3plIHduaW9za2k6IHdpZWsgc2FtIHcgc29iaWUgbmllIHLDs8W8bmljdWplIHNpbG5pZSBrdXB1asSFY3ljaCBvZCBuaWVrdXB1asSFY3ljaCwgZ2R5xbwgcHJvcG9yY2plIHcga2HFvGRlaiBrb2hvcmNpZSB3aWVrb3dlaiBzxIUgc3RhxYJlLiBSw7PFvG5pY2EgdyBtZWRpYW5hY2ggKDQxIHZzIDQ0IGxhdGEpIHd5bmlrYSB6IG5pZXpuYWN6bnljaCByw7PFvG5pYyB3IG9nw7NsbmVqIHN0cnVrdHVyemUgd2lla293ZWosIGEgbmllIHogb2RtaWVubnljaCB6YWNob3dhxYQgdyBwb3N6Y3plZ8OzbG55Y2ggcHJ6ZWR6aWHFgmFjaCB3aWVrb3d5Y2guDQoNCiMjIFptaWVubmUga2F0ZWdvcnljem5lIGEgemFrdXAgcm93ZXJ1DQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShwdXJycikgIyBEbyDFgmF0d2VnbyBpdGVyb3dhbmlhIChtYXBvd2FuaWEpDQoNCiMgMS4gTGlzdGEgem1pZW5ueWNoIGthdGVnb3JpYWxueWNoLCBrdMOzcmUgY2hjZW15IHNwcmF3ZHppxIcNCnptaWVubmVfZG9fYW5hbGl6eSA8LSBjKCJyZWdpb24iLCAiaG9tZV9vd25lciIsICJnZW5kZXIiLCAibWFyaXRhbF9zdGF0dXMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICJlZHVjYXRpb24iLCAib2NjdXBhdGlvbiIsICJjb21tdXRlX2Rpc3RhbmNlIikNCg0KIyAyLiBGdW5rY2phIHd5a29udWrEhWNhIHRlc3QgaSBjenlzemN6xIVjYSB3eW5payBkbGEgamVkbmVqIHptaWVubmVqDQpvYmxpY3pfY2hpIDwtIGZ1bmN0aW9uKHptaWVubmEsIGRhbmUpIHsNCiAgIyBUd29yenlteSB0YWJlbMSZIGtyennFvG93xIUNCiAgdGFiZWxhIDwtIHRhYmxlKGRhbmVbW3ptaWVubmFdXSwgZGFuZSRwdXJjaGFzZWRfYmlrZSkNCiAgDQogICMgTGljenlteSB0ZXN0DQogIHRlc3QgPC0gY2hpc3EudGVzdCh0YWJlbGEpDQogIA0KICAjIFphbWllbmlhbXkgbmEgxYJhZG55IGZvcm1hdCBpIGRvZGFqZW15IG5henfEmSB6bWllbm5lag0KICB0aWR5KHRlc3QpICU+JQ0KICAgIG11dGF0ZShDZWNoYSA9IHptaWVubmEpICU+JQ0KICAgIHNlbGVjdChDZWNoYSwgc3RhdGlzdGljLCBwYXJhbWV0ZXIsIHAudmFsdWUpDQp9DQoNCiMgMy4gV3lrb25hbmllIHDEmXRsaSBwbyB3c3p5c3RraWNoIHptaWVubnljaCBpIHBvxYLEhWN6ZW5pZSB3eW5pa8Ozdw0Kd3luaWtpX3piaW9yY3plIDwtIG1hcF9kZih6bWllbm5lX2RvX2FuYWxpenksIG9ibGljel9jaGksIGRhbmUgPSBkYW5lMikNCg0KIyA0LiBGb3JtYXRvd2FuaWUgdGFiZWxpIGtvxYRjb3dlag0Kd3luaWtpX3piaW9yY3plICU+JQ0KICAjIERvZGFqZW15IGludGVycHJldGFjasSZIGd3aWF6ZGtvd8SFIChvcGNqb25hbG5pZSkNCiAgbXV0YXRlKElzdG90bm9zYyA9IGNhc2Vfd2hlbigNCiAgICBwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwNCiAgICBwLnZhbHVlIDwgMC4wMSAgfiAiKioiLA0KICAgIHAudmFsdWUgPCAwLjA1ICB+ICIqIiwNCiAgICBUUlVFIH4gImJyYWsiDQogICkpICU+JQ0KICAjIEZvcm1hdG93YW5pZSBwLXZhbHVlIG5hIMWCYWRueSB0ZWtzdCAobnAuIDwwLjAwMSkNCiAgbXV0YXRlKHAudmFsdWUgPSBmb3JtYXQucHZhbChwLnZhbHVlLCBkaWdpdHMgPSAzLCBlcHMgPSAwLjAwMSkpICU+JQ0KICAjIFR3b3J6ZW5pZSB0YWJlbGkNCiAga2FibGUoDQogICAgY29sLm5hbWVzID0gYygiQmFkYW5hIENlY2hhIiwgIkNoaS1rd2FkcmF0IiwgIlN0b3BuaWUgc3dvYm9keSAoZGYpIiwgIlAtdmFsdWUiLCAiSXN0b3Rub8WbxIciKSwNCiAgICBkaWdpdHMgPSAyLA0KICAgIGVzY2FwZSA9IEZBTFNFLCAjIFdhxbxuZSBkbGEga29sb3Jvd2FuaWEgY2VsbF9zcGVjDQogICAgY2FwdGlvbiA9ICJSYW5raW5nIGN6eW5uaWvDs3cgd3DFgnl3YWrEhWN5Y2ggbmEgemFrdXAgcm93ZXJ1IChUZXN0IG5pZXphbGXFvG5vxZtjaSBDaGkta3dhZHJhdCkiDQogICkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRikgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAjIFBvZ3J1YmllbmllIG5hencgem1pZW5ueWNoDQpgYGANCg0KVGVzdHkgY2hp4oCRa3dhZHJhdCBwb3R3aWVyZHppxYJ5IGlzdG90bnkgendpxIV6ZWsgZGVjeXpqaSBvIHpha3VwaWUgeiB3eWtzenRhxYJjZW5pZW0sIHN0YW5lbSBjeXdpbG55bSBpIHJlZ2lvbmVtIChwIDwgMCwwMDEpLCBhIHPFgmFic3plLCBsZWN6IG5hZGFsIHdpZG9jem5lIHphbGXFvG5vxZtjaSB6IGR5c3RhbnNlbSBkbyBwcmFjeS4gWiBrb2xlaSBwxYJlxIcsIHN0YXR1cyB3xYJhxZtjaWNpZWxhIGRvbXUgaSB0eXAgemF3b2R1IHV6eXNrYcWCeSB3eXNva2llIHdhcnRvxZtjaSBw4oCRdmFsdWUsIGNvIG96bmFjemEgYnJhayBpc3RvdG55Y2ggcsOzxbxuaWMgdyBvZHNldGt1IGt1cHVqxIVjeWNoIG1pxJlkenkga2F0ZWdvcmlhbWkgdHljaCB6bWllbm55Y2guIFd5bmlraSB0ZSBzxIUgc3DDs2puZSB6IHDDs8W6bmllanN6eW0gbW9kZWxlbSBsb2dpdG93eW0sIHcga3TDs3J5bSB0ZSBzYW1lIHptaWVubmUgb2thenVqxIUgc2nEmSBvZHBvd2llZG5pbyBrbHVjem93ZSBsdWIgbmllaXN0b3RuZS4NCg0KIyBNT0RFTE9XQU5JRSBaQUtVUFUgUk9XRVJVIC0gUkVHUkVTSkEgTE9HSVNUWUNaTkENCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQoNCg0KIyAyLiBQcnp5Z290b3dhbmllIGRhbnljaCAoUHJlcHJvY2Vzc2luZykNCmRmX2NsZWFuIDwtIGRmICU+JQ0KICBtdXRhdGUoUHVyY2hhc2VkLkJpa2UgPSBhcy5mYWN0b3IocHVyY2hhc2VkX2Jpa2UpKSU+JQ0KICBtdXRhdGUoRWR1Y2F0aW9uPSBhcy5mYWN0b3IoZWR1Y2F0aW9uKSklPiUNCiAgbXV0YXRlKE9jY3VwYXRpb249IGFzLmZhY3RvcihvY2N1cGF0aW9uKSkNCg0KIyBTcHJhd2R6ZW5pZSBzdHJ1a3R1cnkgZGFueWNoIHByemVkIG1vZGVsb3dhbmllbQ0Kc3RyKGRmX2NsZWFuKQ0KIyAzLiBCdWRvd2EgTW9kZWx1IExvZ2l0b3dlZ28NCm1vZGVsIDwtIGdsbShQdXJjaGFzZWQuQmlrZSB+IG1hcml0YWxfc3RhdHVzK2dlbmRlcitpbmNvbWUgK2NoaWxkcmVuICtob21lX293bmVyICsgY2FycyArIGFnZSArRWR1Y2F0aW9uICsgT2NjdXBhdGlvbiwgZGF0YSA9IGRmX2NsZWFuLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpDQoNCiMgNC4gV3nFm3dpZXRsZW5pZSB3eW5pa8OzdyBtb2RlbHUNCnN1bW1hcnkobW9kZWwpDQoNCiMgNS4gT2JsaWN6ZW5pZSBJbG9yYXp1IFN6YW5zIChPZGRzIFJhdGlvcykNCm9yIDwtIGV4cChjb2VmKG1vZGVsKSkNCnByaW50KCJJbG9yYXp5IFN6YW5zIChPZGRzIFJhdGlvcyk6IikNCnByaW50KG9yKQ0KDQojIDYuIChPcGNqb25hbG5pZSkgT2NlbmEgamFrb8WbY2kgbW9kZWx1IC0gVGFiZWxhIHBvbXnFgmVrIChDb25mdXNpb24gTWF0cml4KQ0KcHJvYiA8LSBwcmVkaWN0KG1vZGVsLCB0eXBlID0gInJlc3BvbnNlIikNCnByZWRpY3RlZF9jbGFzc2VzIDwtIGlmZWxzZShwcm9iID4gMC41LCAiWWVzIiwgIk5vIikNCnRhYmxlKFByZWRpY3RlZCA9IHByZWRpY3RlZF9jbGFzc2VzLCBBY3R1YWwgPSBkZl9jbGVhbiRQdXJjaGFzZWQuQmlrZSkNCmBgYA0KDQpgYGB7cn0NCiMgV3ltYWdhbmUgcGFraWV0eQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIDEuIFd5Y2nEhWduacSZY2llIHVwb3J6xIVka293YW55Y2ggZGFueWNoIHogbW9kZWx1DQoNCnd5bmlraV9tb2RlbHUgPC0gdGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFLCBleHBvbmVudGlhdGUgPSBUUlVFKQ0KDQojIDIuIEZpbHRyb3dhbmllIGkgZm9ybWF0b3dhbmllIHRhYmVsaQ0KdGFiZWxhX2lzdG90bmUgPC0gd3luaWtpX21vZGVsdSAlPiUNCiAgZmlsdGVyKHAudmFsdWUgPCAwLjA1KSAlPiUNCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lDQogIG11dGF0ZSgNCiAgICBPUl9Gb3JtYXR0ZWQgPSByb3VuZChlc3RpbWF0ZSwgMiksICMgWmFva3LEhWdsZW5pZSBPUg0KICAgIENJX0Zvcm1hdHRlZCA9IHBhc3RlMCgiWyIsIHJvdW5kKGNvbmYubG93LCAyKSwgIiAtICIsIHJvdW5kKGNvbmYuaGlnaCwgMiksICJdIiksICMgxYFhZG5lIHByemVkemlhxYJ5IHVmbm/Fm2NpDQogICAgcF92YWx1ZV9Gb3JtYXR0ZWQgPSBmb3JtYXQucHZhbChwLnZhbHVlLCBkaWdpdHMgPSAzLCBlcHMgPSAwLjAwMSkgIyBGb3JtYXRvd2FuaWUgcC12YWx1ZSAobnAuIDwwLjAwMSkNCiAgKSAlPiUNCiAgc2VsZWN0KHRlcm0sIE9SX0Zvcm1hdHRlZCwgQ0lfRm9ybWF0dGVkLCBwX3ZhbHVlX0Zvcm1hdHRlZCkNCg0KIyAzLiBHZW5lcm93YW5pZSBlbGVnYW5ja2llaiB0YWJlbGkNCmthYmxlKHRhYmVsYV9pc3RvdG5lLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlptaWVubmEiLCAiSWxvcmF6IFN6YW5zIChPUikiLCAiOTUlIFByemVkemlhxYIgVWZub8WbY2kiLCAiUC12YWx1ZSIpLA0KICAgICAgYWxpZ24gPSAibGNjYyIsDQogICAgICBjYXB0aW9uID0gIklzdG90bmUgc3RhdHlzdHljem5pZSBkZXRlcm1pbmFudHkgemFrdXB1IHJvd2VydSAoTW9kZWwgTG9naXRvd3kpIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmdWxsX3dpZHRoID0gRikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJkYXJrYmx1ZSIpICU+JSAjIFd5csOzxbxuaWVuaWUga29sdW1ueSB6IE9SDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiT1IgPiAxIG96bmFjemEgd3pyb3N0IHN6YW5zeSBuYSB6YWt1cCwgT1IgPCAxIG96bmFjemEgc3BhZGVrIHN6YW5zeS4iKQ0KYGBgDQoNCiMjIEtsdWN6b3dlIGRldGVybWluYW50eSB6YWt1cHUNCg0KTW9kZWwgcmVncmVzamkgbG9naXN0eWN6bmVqIHBvendvbGnFgiB3eW9kcsSZYm5pxIcgem1pZW5uZSwga3TDs3JlIG1hasSFIHJlYWxueSB3cMWCeXcgbmEgZGVjeXpqxJkgemFrdXBvd8SFLCBlbGltaW51asSFYyB6YWvFgsOzY2VuaWEgd3luaWthasSFY2UgemUgd3Nww7PFgnphbGXFvG5vxZtjaSBjZWNoLg0KDQpTdGF0dXMgY3l3aWxueSAoTWFyaXRhbCBTdGF0dXMpOiBKZXN0IHRvIGplZGVuIHogbmFqc2lsbmllanN6eWNoIHByZWR5a3RvcsOzdy4gT3NvYnkgc2Ftb3RuZSAoU2luZ2xlKSBzxIUgem5hY3puaWUgYmFyZHppZWogc2vFgm9ubmUgZG8gemFrdXB1IHJvd2VydSBuacW8IG9zb2J5IHcgendpxIV6a2FjaCBtYcWCxbxlxYRza2ljaC4gSWxvcmF6IHN6YW5zIChPZGRzIFJhdGlvKSB3eW5vc2kgb2suIDEuNzMsIGNvIG96bmFjemEsIMW8ZSBzemFuc2EgbmEgemFrdXAgdSBzaW5nbGEgamVzdCBvIDczJSB3ecW8c3phIG5pxbwgdSBvc29ieSB6YW3EmcW8bmVqL8W8b25hdGVqLCBwcnp5IHphY2hvd2FuaXUgcG96b3N0YcWCeWNoIGNlY2ggbmEgc3RhxYJ5bSBwb3ppb21pZS4NCg0KU2Ftb2Nob2R5IChDYXJzKTogTGljemJhIHBvc2lhZGFueWNoIHNhbW9jaG9kw7N3IGplc3Qgc2lsbsSFIGJhcmllcsSFIHpha3Vwb3fEhS4gS2HFvGR5IGRvZGF0a293eSBzYW1vY2jDs2QgdyBnb3Nwb2RhcnN0d2llIGRvbW93eW0gZHJhc3R5Y3puaWUgb2JuacW8YSBzemFuc8SZIG5hIHpha3VwIHJvd2VydSAoT1Ig4omIIDAuNjQsIHAgPCAwLjAwMSkuIFBvdHdpZXJkemEgdG8gaGlwb3RlesSZLCDFvGUgZGxhIGJhZGFuZWogZ3J1cHkgcm93ZXIgamVzdCBjesSZc3RvIGFsdGVybmF0eXfEhSB0cmFuc3BvcnRvd8SFLCBhIG5pZSB0eWxrbyByZWtyZWFjeWpuxIUuDQoNCkR6aWVjaSAoQ2hpbGRyZW4pOiBabWllbm5hIHRhIHdwxYJ5d2EgbmVnYXR5d25pZSBuYSBkZWN5emrEmSB6YWt1cG93xIUgKHAgPSAwLjAzNSkuIFdpxJlrc3phIGxpY3piYSBkemllY2kgdyBnb3Nwb2RhcnN0d2llIGRvbW93eW0gd2nEhcW8ZSBzacSZIHogbmnFvHN6xIUgc2vFgm9ubm/Fm2NpxIUgZG8gemFrdXB1IHJvd2VydSBkbGEgc2llYmllIHByemV6IGtsaWVudGEgKHByYXdkb3BvZG9ibmllIHplIHd6Z2zEmWR1IG5hIG9ncmFuaWN6ZW5pYSBidWTFvGV0b3dlIGx1YiBjemFzb3dlKS4NCg0KRG9jaMOzZCAoSW5jb21lKTogSXN0bmllamUgc3RhdHlzdHljem5pZSBpc3RvdG5hLCBkb2RhdG5pYSB6YWxlxbxub8WbxIcgbWnEmWR6eSBkb2Nob2RlbSBhIHByYXdkb3BvZG9iaWXFhHN0d2VtIHpha3VwdSAocCA8IDAuMDAxKSwgY28gb3puYWN6YSwgxbxlIHJvd2VyIHcgb2ZlcmNpZSBza2xlcHUgamVzdCBkb2JyZW0gbm9ybWFsbnltIChwb3B5dCByb8WbbmllIHdyYXogeiBkb2Nob2RlbSkuDQoNCiMjIFByb2ZpbCBkZW1vZ3JhZmljem55IGkgc3BvxYJlY3pueQ0KDQpXeWtzenRhxYJjZW5pZTogS2xpZW5jaSB6IHd5a3N6dGHFgmNlbmllbSB3ecW8c3p5bSAoQmFjaGVsb3JzKSBzdGFub3dpxIUgZ3J1cMSZIHJlZmVyZW5jeWpuxIUgbyBuYWp3ecW8c3p5bSBwb3RlbmNqYWxlIHpha3Vwb3d5bS4gT3NvYnkgeiB3eWtzenRhxYJjZW5pZW0gY3rEmcWbY2lvd3ltIChQYXJ0aWFsIENvbGxlZ2UvSGlnaCBTY2hvb2wpIHd5a2F6dWrEhSBpc3RvdG5pZSBuacW8c3rEhSBzemFuc8SZIG5hIHpha3VwICh3eW5pa2kgdWplbW5lIHcgbW9kZWx1IGxvZ2l0b3d5bSkuDQoNClJlZ2lvbjogVGVzdCBDaGkta3dhZHJhdCAocCA8IDAuMDAxKSBvcmF6IGFuYWxpemEgb3Bpc293YSB3c2thenVqxIUgbmEgc2lsbmUgenLDs8W8bmljb3dhbmllIHJlZ2lvbmFsbmUsIHogZG9taW5hY2rEhSBzcHJ6ZWRhxbx5IHcgQW1lcnljZSBQw7PFgm5vY25lai4NCg0KIyMgQ2VjaHkgbmllaXN0b3RuZSBzdGF0eXN0eWN6bmllDQoNCldicmV3IHBpZXJ3b3RueW0gcHJ6eXB1c3pjemVuaW9tLCBhbmFsaXphIHdpZWxvem1pZW5ub3dhIHd5a2F6YcWCYSBicmFrIGlzdG90bmVnbyB3cMWCeXd1IGRsYToNCg0KUMWCY2kgKEdlbmRlcik6IFDFgmXEhyBrbGllbnRhIG5pZSByw7PFvG5pY3VqZSBzemFuc3kgbmEgemFrdXAgKHAgPSAwLjk0IHcgbW9kZWx1IGxvZ2l0b3d5bSwgcCA9IDAuNjcgdyB0ZcWbY2llIENoaS1rd2FkcmF0KS4gT2ZlcnRhIHNrbGVwdSBqZXN0IHVuaXdlcnNhbG5hLg0KDQpQb3NpYWRhbmlhIGRvbXUgKEhvbWUgT3duZXIpOiBaYXLDs3dubyB0ZXN0IG5pZXphbGXFvG5vxZtjaSAocCA9IDAuNjMpLCBqYWsgaSBtb2RlbCAocCA9IDAuNDYpIHdza2F6dWrEhSwgxbxlIHN0YXR1cyB3xYJhc25vxZtjaSBuaWVydWNob21vxZtjaSBuaWUgbWEgendpxIV6a3UgeiB6YWt1cGVtIHJvd2VydS4gSmVzdCB0byB3YcW8bmEga29yZWt0YSB3emdsxJlkZW0gd3N0xJlwbnljaCBvYnNlcndhY2ppIG9wYXJ0eWNoIHd5xYLEhWN6bmllIG5hIGxpY3plYm5vxZtjaWFjaC4NCg0KWmF3b2R1IChPY2N1cGF0aW9uKTogUG96YSBwZXdueW1pIHLDs8W8bmljYW1pIHcgZG9jaG9kYWNoLCBzYW0gdHlwIHd5a29ueXdhbmVqIHByYWN5IG5pZSBqZXN0IGlzdG90bnltIHByZWR5a3RvcmVtIHcgbW9kZWx1Lg0KDQojIyBPY2VuYSBqYWtvxZtjaSBtb2RlbHUNCg0KWmJ1ZG93YW55IG1vZGVsIGxvZ2l0b3d5IGNoYXJha3Rlcnl6dWplIHNpxJkgdHJhZm5vxZtjacSFIChBY2N1cmFjeSkgbmEgcG96aW9taWUgb2suIDYyLjYlLg0KDQpNYWNpZXJ6IHBvbXnFgmVrIHBva2F6dWplLCDFvGUgbW9kZWwgbGVwaWVqIHJhZHppIHNvYmllIHogcHJ6ZXdpZHl3YW5pZW0gYnJha3UgemFrdXB1ICgzNDYgdHJhZmllxYQpIG5pxbwgemFrdXB1ICgyODAgdHJhZmllxYQpLg0KDQpTdWdlcnVqZSB0bywgxbxlIHcgZGFueWNoIGlzdG5pZWrEhSBpbm5lLCBuaWV1Y2h3eWNvbmUgem1pZW5uZSAobnAuIHphaW50ZXJlc293YW5pYSwgc3R5bCDFvHljaWEsIG9kbGVnxYJvxZvEhyBkbyDFm2NpZcW8ZWsgcm93ZXJvd3ljaCksIGt0w7NyZSBtb2fFgnlieSBwb3ByYXdpxIcgcHJlZHlrY2rEmS4NCg0KIyBQT0RTVU1PV0FOSUUgSSBXTklPU0tJIEtPxYNDT1dFDQoNCiMjIFByemViaWVnIGkgY2VsIGFuYWxpenkNCg0KUHJvamVrdCBDeWNsZUluc2lnaHQgZG9zdGFyY3p5xYIgc3pjemVnw7PFgm93ZWosIG9wYXJ0ZWogbmEgZGFueWNoIGFuYWxpenkgcHJvZmlsdSBrbGllbnTDs3cgc2tsZXB1IHJvd2Vyb3dlZ28gaSBjenlubmlrw7N3IHdwxYJ5d2FqxIVjeWNoIG5hIHpha3VwLiBQcnplcHJvd2FkemlsacWbbXkgcGXFgm55IHByb2NlcyBhbmFsaXR5Y3pueSDigJMgb2QgcHJ6eWdvdG93YW5pYSBkYW55Y2gsIHByemV6IGFuYWxpesSZIGVrc3Bsb3JhY3lqbsSFIGkgdGVzdHkgc3RhdHlzdHljem5lLCBwbyBtb2RlbCByZWdyZXNqaSBsb2dpc3R5Y3puZWog4oCTIGNvIHBvendvbGnFgm8gendlcnlmaWtvd2HEhyBwb3N0YXdpb25lIGhpcG90ZXp5IGkgc2Zvcm11xYJvd2HEhyBwcmFrdHljem5lIHJla29tZW5kYWNqZSBiaXpuZXNvd2UuDQoNCiMjIE5handhxbxuaWVqc3plIHd5bmlraSBhbmFsaXR5Y3puZQ0KDQpHxYLDs3duZSB1c3RhbGVuaWEgYW5hbGl0eWN6bmUgcG90d2llcmR6acWCeSwgxbxlIHpha3VwIHJvd2VydSBuaWUgamVzdCB6ZGFyemVuaWVtIGxvc293eW0sIGxlY3ogd3luaWthIHogd3lyYcW6bmVnbyBwcm9maWx1IHNvY2pvZGVtb2dyYWZpY3puZWdvIGkgc3R5bHUgxbx5Y2lhLiBSZWdyZXNqYSBsb2dpc3R5Y3puYSB3eW9kcsSZYm5pxYJhIG5hanNpbG5pZWpzemUgcHJlZHlrdG9yeTogc3RhdHVzIGN5d2lsbnkgKHNpbmdpZWw6ICs3MyUgc3phbnMpIGkgbGljemLEmSBzYW1vY2hvZMOzdyAoa2HFvGR5IGRvZGF0a293eTogLTM2JSBzemFucyksIGNvIHdza2F6dWplLCDFvGUgcm93ZXIgc3Rhbm93aSBjesSZc3RvIGFsdGVybmF0eXfEmSB0cmFuc3BvcnRvd8SFIGRsYSBvc8OzYiBuaWV6d2nEhXphbnljaCBpIG8gb2dyYW5pY3pvbmVqIGRvc3TEmXBub8WbY2kgZG8gc2Ftb2Nob2R1LiBJc3RvdG55LCBjaG/EhyBtbmllanN6eSwgbmVnYXR5d255IHdwxYJ5dyBtYSBsaWN6YmEgZHppZWNpLCBjbyBzdWdlcnVqZSBwcnplc3VuacSZY2llIHByaW9yeXRldMOzdyBidWTFvGV0b3d5Y2ggbHViIGN6YXNvd3ljaCB3IHJvZHppbmFjaC4gRG9jaMOzZCB3eWthemHFgiBwb3p5dHl3bsSFLCBsZWN6IG5pZWxpbmlvd8SFIHphbGXFvG5vxZvEhywgeiBuYWp3acSZa3N6xIUga29ud2Vyc2rEhSB3IHByemVkemlhbGUgODAtMTAwIHR5cy4gJCwgcG96eWNqb251asSFYyByb3dlciBqYWtvIGRvYnJvIGRsYSB6YW1vxbxuZWoga2xhc3kgxZtyZWRuaWVqLiBXeWtzenRhxYJjZW5pZSB3ecW8c3plIG9yYXogcmVnaW9uIEFtZXJ5a2kgUMOzxYJub2NuZWogcsOzd25pZcW8IHpuYWN6xIVjbyB6d2nEmWtzemHFgnkgcHJhd2RvcG9kb2JpZcWEc3R3byB6YWt1cHUuDQoNCiMjIFduaW9za2kgbWV0b2R5Y3puZQ0KDQpLbHVjem93eW0gd25pb3NraWVtIG1ldG9keWN6bnltIGplc3Qgb2JhbGVuaWUga2lsa3UgaW50dWljeWpueWNoIHphxYJvxbxlxYQuIEFuYWxpemEgd2llbG93eW1pYXJvd2EgamVkbm96bmFjem5pZSB3eWthemHFgmEgYnJhayBzdGF0eXN0eWN6bmllIGlzdG90bmVnbyB3cMWCeXd1IHDFgmNpIGkgcG9zaWFkYW5pYSBkb211IG5hIGRlY3l6asSZIHpha3Vwb3fEhSwgY28gamVzdCBpc3RvdG7EhSBrb3Jla3TEhSB3emdsxJlkZW0gd3N0xJlwbnljaCBvYnNlcndhY2ppIG9wYXJ0eWNoIG5hIHByb3N0eWNoIHJvemvFgmFkYWNoIGN6xJlzdG/Fm2NpLiBQb2RvYm5pZSwgd2llayBva2F6YcWCIHNpxJkgY3p5bm5pa2llbSBpc3RvdG55bSwgYWxlIG8gbmlld2llbGtpbSBlZmVrY2llIHByYWt0eWN6bnltLCBhIHphd8OzZCBuaWUgbWlhxYIgem5hY3plbmlhIHBvIHV3emdsxJlkbmllbml1IGRvY2hvZHUuIFBva2F6dWplIHRvIHdhcnRvxZvEhyB6YWF3YW5zb3dhbnljaCBtb2RlbGkgc3RhdHlzdHljem55Y2ggdyBvZGR6aWVsYW5pdSBwcmF3ZHppd3ljaCBzeWduYcWCw7N3IG9kIHBvem9ybnljaCBrb3JlbGFjamkuDQoNCiMjIFduaW9za2kgYml6bmVzb3dlIGkgcmVrb21lbmRhY2plDQoNClBvZHN1bW93dWrEhWMsIHR5cG93eSBrbGllbnQga3VwdWrEhWN5IHJvd2VyIHRvIHNpbmdpZWwgdyB3aWVrdSAzNuKAkzQ1IGxhdCwgeiB3ecW8c3p5bSB3eWtzenRhxYJjZW5pZW0sIGRvY2hvZGVtIDgw4oCTMTAwIHR5cy4gJCwgcG9zaWFkYWrEhWN5IGNvIG5hand5xbxlaiBqZWRlbiBzYW1vY2jDs2QgaSBtaWVzemthasSFY3kgdyBBbWVyeWNlIFDDs8WCbm9jbmVqLiBTdHJhdGVnaWEgbWFya2V0aW5nb3dhIHBvd2lubmEgd2nEmWMgbW5pZWogb3BpZXJhxIcgc2nEmSBuYSBrcnl0ZXJpYWNoIHDFgmNpIGN6eSBzdGF0dXN1IG1pZXN6a2FuaW93ZWdvLCBhIGJhcmR6aWVqIG5hIGtvbXVuaWtvd2FuaXUga29yennFm2NpIGRsYSBvc8OzYiBzenVrYWrEhWN5Y2ggYWx0ZXJuYXR5d25lZ28gxZtyb2RrYSB0cmFuc3BvcnR1IG9yYXogbmEgcG9ka3JlxZtsYW5pdSBqYWtvxZtjaSBpIHByZXN0acW8dSBwcm9kdWt0dSB3IHNlZ21lbmNpZSB6YW1vxbxuaWVqc3p5Y2gsIHd5a3N6dGHFgmNvbnljaCBrbGllbnTDs3cuIFdhcnRvIHRlxbwgcsOzxbxuaWNvd2HEhyBvZmVydMSZIG1pxJlkenkgcmVnaW9uYW1pLCBiaW9yxIVjIHBvZCB1d2FnxJkgbG9rYWxuZSB3em9yY2UgZG9qYXpkw7N3IGRvIHByYWN5LCBhIHcgcHJ6eXN6xYJ5Y2ggYW5hbGl6YWNoIHV3emdsxJlkbmnEhyBjenlubmlraSBiZWhhd2lvcmFsbmUgKG5wLiBha3R5d25vxZvEhyBmaXp5Y3puxIUsIGRvc3TEmXBub8WbxIcgaW5mcmFzdHJ1a3R1cnkgcm93ZXJvd2VqKSwgYWJ5IGplc3pjemUgbGVwaWVqIHByb2dub3pvd2HEhyBwb3B5dCBpIHBlcnNvbmFsaXpvd2HEhyBvZmVydMSZLg0K