Introduction and data import

This R file generates the daily and weekly speech databases.

setwd("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025")

# Packages
require(gt)
require(gtsummary)
library(dplyr)
library(tidyr)
library(stringr)
library(lubridate)
library(readr)
library(purrr)
library(httr)
library(jsonlite)
library(data.table)   # pratique pour expansions rapides
library(fixest)
library(ggplot2)
require(scales)

options(dplyr.summarise.inform = FALSE)
theme_set(theme_minimal(base_size = 12))

sent_pred <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/2b_cbdc_sentence_preds_with_author_desc.csv") 
countries <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/countries2.csv", sep=";")
titles <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/cbdc_title_flags_from_matches.csv")

Speech database

Sentence-level database

Data import

We use the database 2b_cbdc_sentence_preds_with_author_desc.csv downloaded from the Kaggle notebook. We also use the countries2.csv file that merge the authors of speeches with their Central Bank and Countries. For some cases, there are multiple authors for a specific speech. Fortunately, these case are rare and they group authors from the same Central Banks and the same Countries. We manually retrieve their informations and add them directly.

sent_pred2 <- sent_pred %>%
  select(-c(country,description) )%>%
  distinct()%>%
  left_join(countries%>%unique(), by=c("author"))%>%
  mutate(Country =case_when(
    author=="Jacqueline Loh; Benoît Cœuré" ~ "ECB Board", 
    author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Switzerland", 
    author=="Petra Tschudin; Thomas Moser"~"Switzerland",
    author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "Netherlands",
    TRUE ~ Country))%>% 
  mutate(Central_Bank =case_when(
    author=="Jacqueline Loh; Benoît Cœuré" ~ "European Central Bank", 
    author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Swiss National Bank", 
    author=="Petra Tschudin; Thomas Moser"~"Swiss National Bank",
    author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "European Central Bank",
    TRUE ~ Central_Bank))%>%
  mutate(
    datetime = parse_date_time(
      date,
      orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
      tz = "UTC"  
    ),
    date = as_date(datetime)  # keep a pure Date too (optional)
  )%>%select(-datetime)%>%
  filter(date >= as.Date("2015-01-01"))%>% select(-X)

We save the complete list of speeches in a .csv file (completelist.csv). Note that the database has loose keywords conditions, in order to capture all speeches related to CBDC. However, some sentences are linked to titles and/or references, or to crypto-assets exclusively (see for example the first observations above).

write.table(sent_pred2,
            file = "C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/completelist.csv",
            sep = ";", dec = ".",
            row.names = FALSE, col.names = TRUE,
            fileEncoding = "UTF-8")

We manually note each title. The dataset list.csv is the same as completelist.csv, with an additional column cbdc_sentence that is equal to FALSE when sentences are related to keywords in title or in references. We then remove these “wrong” sentences, and add the corresponding currency to each Central Bank manually.

auer_data <- readxl::read_excel("C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/speechesstances.xlsx")%>%filter(source=="auer")

sentence_base <- read.csv2("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/list.csv",
                        fileEncoding = "UTF-8",
                        stringsAsFactors = FALSE)%>%
  left_join(titles %>% select(url, cbdc_in_title), by='url')%>%
  unique()%>%
  mutate(cbdc_sentence = ifelse(is.na(cbdc_sentence), "TRUE",cbdc_sentence))%>%
  filter(!cbdc_sentence=="FALSE")%>% # we only keep the true CBDC-related sentences
  mutate(
    datetime = parse_date_time(
      date,
      orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
      tz = "UTC"   
    ),
    date = as_date(datetime)  
  )%>%select(-datetime) %>%
select(-c(match_type,  keyword,source,  cbdc_sentence))%>%
  mutate(date = as.Date(date)) %>%
  distinct()%>%
  mutate(Currency = case_when(
    Central_Bank == "Bank of England" ~ "GBP", 
    Central_Bank == "European Central Bank" ~ "EUR", 
    Central_Bank == "Bank of Japan" ~ "JPY", 
    Central_Bank == "Bank of Canada" ~ "CAD", 
    Central_Bank == "Reserve Bank of Australia" ~ "AUD", 
    Central_Bank == "Monetary Authority of Singapore" ~ "SGD", 
    Central_Bank == "Sveriges Riksbank" ~ "SEK", 
    Central_Bank == "Bank of Korea" ~ "KRW", 
    Central_Bank == "Fed" ~ "USD", 
    Central_Bank == "Central Bank of Malaysia" ~ "MYR", 
    Central_Bank == "Central Bank of Chile" ~ "CLP", 
    Central_Bank == "National Bank of the Republic of (North) Macedonia" ~ "MKD", 
    Central_Bank == "Czech National Bank" ~ "CZK", 
    Central_Bank == "South African Reserve Bank" ~ "ZAR", 
    Central_Bank == "Bank of Botswana" ~ "BWP", 
    Central_Bank == "Central Bank of Barbados" ~ "BBD", 
    Central_Bank == "National Bank of Denmark" ~ "DKK", 
    Central_Bank == "Bank of Mauritius" ~ "MUR", 
    Central_Bank == "State Bank of Pakistan" ~ "PKR", 
    Central_Bank == "Central Bank of Sri Lanka"    ~ "LKR", 
    Central_Bank ==  "Swiss National Bank"  ~ "CHF", 
    Central_Bank ==  "Central Bank of the Philippines"  ~ "PHP", 
    Central_Bank == "Central Bank of Iceland"  ~ "ISK", 
    Central_Bank ==  "Bank of Thailand"  ~ "THB", 
    Central_Bank ==  "Reserve Bank of New Zealand" ~ "NZD", 
    Central_Bank == "Eastern Caribbean Central Bank" ~ "XCD", 
    Central_Bank == "Central Bank of The Bahamas"  ~ "BSD", 
    Central_Bank == "Hong Kong Monetary Authority" ~ "HKD", 
    Central_Bank ==  "Norges Bank"   ~ "NOK", 
    Central_Bank ==   "Central Bank of Bosnia and Herzegovina"     ~ "BAM", 
    Central_Bank ==  "Central Bank of Kuwait"  ~ "KWD", 
    Central_Bank == "Central Bank of Morocco"  ~ "MAD", 
    Central_Bank ==   "Bank of Mexico"  ~ "MXN", 
    Central_Bank == "Bank of Albania"   ~ "ALL", 
    Central_Bank ==   "Bank of Russia"  ~ "RUB", 
    Central_Bank == "Reserve Bank of India"  ~ "INR", 
    Central_Bank == "People's Bank of China" ~ "CNY", 
    Central_Bank == "Bank Indonesia"     ~ "IDR", 
    Central_Bank ==   "Central Bank of Kenya"~ "KES", 
    Central_Bank ==  "Central Bank of Nigeria"     ~ "NGN", 
    Central_Bank ==  "National Bank of Serbia"    ~ "RSD", 
    Central_Bank == "Bank of Israel"   ~ "ILS", 
    Central_Bank == "Central Bank of the Republic of Kosovo"  ~ "EUR", 
    Central_Bank == "Bank of Finland"  ~ "EUR", 
    Central_Bank ==  "Central Bank of Nepal"  ~ "NPR", 
    Central_Bank ==  "Central Bank of Cyprus"  ~ "EUR", 
    Central_Bank == "Central Bank of Eswatini"  ~ "SZL", 
    Central_Bank == "Bank of Slovenia" ~ "EUR", 
    TRUE~"Other"
    ))%>%
  select(-c(X, X.1))
sentence_base%>%filter(Central_Bank=="Bank of Finland")

Statistics on sentence-level data

We now have a sentence-level clean database that contains the type_label (retail, wholesale, general/unspecified), the sentiment_label (positive, negative, neutral), stance_label (Pro-CBDC, Anti-CBDC, Wait-and-See) and discourse_label (Risk-Benefit, Feature, Process) associated with each sentence measured by BERT.

Summary statistics of sentence-level database (N = 5397 sentences)
Number of sentences Share within dimension
Discourse
Process 2,381 44.1%
Feature 1,543 28.6%
Risk-Benefit 1,473 27.3%
Sentiment
neutral 3,029 56.1%
positive 1,937 35.9%
negative 431 8.0%
Stance
Pro-CBDC 2,813 52.1%
Wait-and-See 2,051 38.0%
Anti-CBDC 533 9.9%
Type de CBDC
Retail CBDC 2,854 52.9%
General/Unspecified 2,114 39.2%
Wholesale CBDC 429 7.9%

In total, there are 5397 uniques sentences, mostly about Retail CBDC (53% of speeches), while unspecified (39%) and wholesale (8%) are relatively marginally mentioned. Overall, the sentiment is essentially neutral yet pro-CBDC. In addition, we can see that there are less speeches about wholesale CBDC, but they tend to be more positive/Pro-CBDC :

In addition, we can observe that some Central Banks - and notably ECB - tend to communicate more than others :

Day/Week-level database

We have sentiment, stance, discourse and type of CBDC discussed at sentence-level. We transform the sentiments (positive, neutral et negative) and stances (Pro-CBDC, Wait-and-See et Anti-CBDC) in numeric values (1, 0, -1) to obtain similar data as in Auer & al (2021) and Dionysopoulos & Makridis (2025).

Then, for a given speech, we measure the average sentiment and stance. We then aggregate the sentiment and stance daily-level as their average across all speeches that day.

We also decompose by type of CBDC discussed within each day, as well as for ECB, Fed and other central banks, and for developed versus emerging markets central banks.


bankday_type <- speech_level %>%
  group_by(date, Central_Bank, type_label) %>%
  summarise(
    sent_btk   = mean(sent_speech,   na.rm = TRUE),
    stance_btk = mean(stance_speech, na.rm = TRUE),
    .groups = "drop"
  )



type_daily <- bankday_type %>%
  group_by(date, type_label) %>%
  summarise(
    index_sent_type   = mean(sent_btk,   na.rm = TRUE),
    index_stance_type = mean(stance_btk, na.rm = TRUE),
    .groups = "drop"
  )


bankday_all <- bankday_type %>%
  group_by(date, Central_Bank) %>%
  summarise(
    sent_bt_all   = mean(sent_btk,   na.rm = TRUE),
    stance_bt_all = mean(stance_btk, na.rm = TRUE),
    .groups = "drop"
  )


sentence_base2 <- sentence_base%>%
  select(url, date)%>%
  distinct(url, date)%>%
  inner_join(auer_data%>%select(URL_text, speech_stance), by=c("url"="URL_text"))%>%
  group_by(date)%>%
  summarize(stance_auer = mean(speech_stance))

global_daily <- bankday_all %>%
  group_by(date) %>%
  summarise(
    index_sent_global   = mean(sent_bt_all,   na.rm = TRUE),
    index_stance_global = mean(stance_bt_all, na.rm = TRUE),
    .groups = "drop"
  )%>%
  left_join(sentence_base2, by="date")%>%
  mutate(speechday = 1)


global_daily_deveme <- bankday_all %>%
  mutate(deveme = case_when(Central_Bank %in% c("Bank of England", 
                                            "European Central Bank", 
                                            "Fed", 
                                            "Bank of Japan", 
                                            "Bank of Canada", 
                                            "Reserve Bank of Australia", 
                                            "Sveriges Riksbank", 
                                            "Swiss National Bank", 
                                            "Central Bank of Iceland", "Norges Bank", 
                                            "National Bank of Denmark",
                                            "Reserve Bank of New Zealand", "Bank of Finland")  ~"Developed", 
                       TRUE ~"Emerging"))%>%
  group_by(deveme, date)%>%
  summarise(index_sent_deveme = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_deveme=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_deveme,
    stance = index_stance_deveme
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = deveme,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{deveme}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )


global_daily_decomposed <- bankday_all %>%
  mutate(CB = case_when(Central_Bank %in% c(
    "European Central Bank") ~ "ECB", 
    Central_Bank =="Fed" ~ "Fed",
    TRUE ~ "Other"))%>%
  group_by(CB, date)%>%
  summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_cb,
    stance = index_stance_cb
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = CB,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{CB}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )


global_daily_fedecb <- bankday_all %>%
  mutate(CB = case_when(Central_Bank %in% c(
    "European Central Bank", "Fed") ~ "ECBFED", 
    TRUE ~ "nonECBFED"))%>%
  group_by(CB, date)%>%
  summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_cb,
    stance = index_stance_cb
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = CB,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{CB}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )

deveme_cb <- global_daily_deveme %>%
  left_join(global_daily_decomposed, by="date")%>%
  left_join(global_daily_fedecb, by="date")

Dynamics of speeches sentiments

weekly_sentiment_plot <- cbdc_idx_weekly_labels%>%ggplot(aes(x=date_week, y=index_sent_global))+
  geom_point()+geom_line(lwd=.5, lty=2)+labs(x="", y="Weekly Sentiment")

daily_sentiment_plot <- cbdc_idx_daily_labels%>%ggplot(aes(x=date, y=index_sent_global))+
  geom_point(size=1)+geom_line(lwd=.5, lty=2)+labs(x="", y="Daily Sentiment")

daily_sentiment_plot/weekly_sentiment_plot 

Statistics of weekly speeches

global_daily %>%
  left_join(type_daily_sent_wide,   by = "date") %>%
  left_join(type_daily_stance_wide, by = "date") %>%
  left_join(deveme_cb,              by = "date") %>%
  arrange(date) %>%
  mutate(week = floor_date(date, unit = "week")) %>%
  group_by(week) %>%
  summarise(across(where(is.numeric), ~ mean(.x, na.rm = TRUE)), .groups = "drop") %>%
  select(-speechday)%>%
  tbl_summary(
    type = list(
      all_continuous() ~ "continuous2",  # tous les continus
      week ~ "continuous"               # sauf week
    ),
    statistic = list(
      all_continuous() ~ c("{mean} ({sd})"),
      week ~ "{min}, {max}"             # seulement min/max pour week
    ),
    label = week ~ "Week (min, max)"
  )%>%
  modify_footnote(everything() ~ NA_character_)
Characteristic N = 295
Week (min, max) 2016-02-28, 2025-06-15
index_sent_global
    Mean (SD) 0.33 (0.37)
index_stance_global
    Mean (SD) 0.50 (0.38)
stance_auer
    Mean (SD) 0.45 (0.63)
    Unknown 99
sent_General.Unspecified
    Mean (SD) 0.23 (0.38)
    Unknown 26
sent_Retail.CBDC
    Mean (SD) 0.30 (0.40)
    Unknown 73
sent_Wholesale.CBDC
    Mean (SD) 0.69 (0.40)
    Unknown 153
stance_General.Unspecified
    Mean (SD) 0.44 (0.40)
    Unknown 26
stance_Retail.CBDC
    Mean (SD) 0.44 (0.45)
    Unknown 73
stance_Wholesale.CBDC
    Mean (SD) 0.78 (0.36)
    Unknown 153
sent_Developed
    Mean (SD) 0.20 (0.30)
sent_Emerging
    Mean (SD) 0.16 (0.30)
stance_Developed
    Mean (SD) 0.33 (0.34)
stance_Emerging
    Mean (SD) 0.21 (0.34)
sent_Other
    Mean (SD) 0.19 (0.31)
sent_ECB
    Mean (SD) 0.18 (0.29)
sent_Fed
    Mean (SD) -0.0032 (0.0580)
stance_Other
    Mean (SD) 0.28 (0.35)
stance_ECB
    Mean (SD) 0.27 (0.33)
stance_Fed
    Mean (SD) 0.011 (0.083)
sent_nonECBFED
    Mean (SD) 0.19 (0.31)
sent_ECBFED
    Mean (SD) 0.17 (0.30)
stance_nonECBFED
    Mean (SD) 0.28 (0.35)
stance_ECBFED
    Mean (SD) 0.27 (0.33)

Stablecoins supply data

Data import

Statistics

panel_artemis_trimmed %>%
  select(Date, supply, stablecoin)%>%
  tbl_summary(by=stablecoin,
    type = list(
      all_continuous() ~ "continuous2",  # tous les continus
      Date ~ "continuous"               # sauf week
    ),
    statistic = list(
      all_continuous() ~ c("{mean} ({sd})"),
      Date ~ "{min}, {max}"             # seulement min/max pour week
    ),
    label = Date ~ "Date (min, max)"
  )%>%
  modify_footnote(everything() ~ NA_character_)
Characteristic AYSD
N = 391
BUSD
N = 340
cEUR
N = 1,401
cUSD
N = 47
DAI
N = 1,944
EURC
N = 1,069
FDUSD
N = 727
PYUSD
N = 694
USD0
N = 372
USDC
N = 2,296
USDe
N = 588
USDGLO
N = 546
USDP
N = 2,310
USDS
N = 321
USDT
N = 2,825
USDY
N = 584
Date (min, max) 2024-08-05, 2025-10-21 2024-08-31, 2025-10-21 2021-07-11, 2025-10-21 2025-08-29, 2025-10-21 2019-11-23, 2025-10-21 2022-07-09, 2025-10-21 2023-08-05, 2025-10-21 2023-09-09, 2025-10-21 2024-08-28, 2025-10-21 2018-10-17, 2025-10-21 2024-01-05, 2025-10-19 2024-02-01, 2025-10-21 2018-10-10, 2025-10-21 2024-10-26, 2025-10-21 2015-12-08, 2025-10-21 2024-01-05, 2025-10-21
supply















    Mean (SD) 70,719,608 (68,990,092) 337,130,067 (25,003,950) 18,296,966 (13,327,185) 146,370,152 (69,792,967) 4,448,341,212 (2,356,732,077) 84,686,832 (66,646,634) 1,868,248,233 (913,223,249) 626,776,286 (484,825,385) 671,778,959 (341,271,342) 28,755,546,082 (21,595,129,898) 4,822,102,281 (3,431,221,409) 3,093,883 (644,218) 463,487,550 (374,289,377) 7,149,699,496 (1,069,000,697) 57,454,318,058 (52,167,651,561) 374,343,880 (210,577,377)

Final Database

Daily

data_artemis <-panel_artemis_trimmed%>%
  left_join(cbdc_idx_daily_labels, by=c("Date"="date"))%>%
  mutate(quarteryear = paste0(quarter(Date), year(Date) ))%>%
  left_join(GPR, by=c("Date"="date"))%>%
  left_join(vix_data, by=c("Date"="date"))%>%
  arrange(stablecoin, Date)%>%
  mutate(FTX = ifelse(Date > as.Date("2022-11-01"),1,0 ))%>%
  mutate(Luna = ifelse(Date > as.Date("2022-05-01"),1,0 ))%>%
  mutate(pegType = case_when(
    stablecoin == "USDT"~ "USD",
    stablecoin == "USDP"~ "USD",
    stablecoin == "USDC"~ "USD",
    stablecoin == "DAI"~ "USD",
    stablecoin == "cEUR"~ "EUR",
    stablecoin == "EURC"~ "EUR",
    stablecoin == "FDUSD"~ "USD",
    stablecoin == "PYUSD"~ "USD",
    stablecoin == "USDY"~ "USD",
    stablecoin == "USDe"~ "USD",
    stablecoin == "USDGLO"~ "USD",
    stablecoin == "AYSD"~ "USD",
    stablecoin == "BUSD"~ "USD",
    stablecoin == "USD0"~ "USD",
    stablecoin == "USDS"~ "USD",
    stablecoin == "cUSD"~ "USD"
    ))%>%
  mutate(pegMechanism = case_when(
    stablecoin == "USDT"~ "fiat",
    stablecoin == "USDP"~ "fiat",
    stablecoin == "USDC"~ "fiat",
    stablecoin == "DAI"~ "crypto",
    stablecoin == "cEUR"~ "algo",
    stablecoin == "EURC"~ "fiat",
    stablecoin == "FDUSD"~ "fiat",
    stablecoin == "PYUSD"~ "fiat",
    stablecoin == "USDY"~ "fiat",
    stablecoin == "USDe"~ "fiat",
    stablecoin == "USDGLO"~ "fiat",
    stablecoin == "AYSD"~ "fiat",
    stablecoin == "BUSD"~ "fiat",
    stablecoin == "USD0"~ "fiat",
    stablecoin == "USDS"~ "fiat",
    stablecoin == "cUSD"~ "fiat"
    
  ))%>%
  #mutate(across(-Date, ~ tidyr::replace_na(.x, 0)))%>% # remove this to replace 0 with NA when there's no speech
  rename_with(~ gsub("\\.", "_", .x))

Weekly

data_artemis_weekly <-panel_artemis_trimmed_weekly%>%
  left_join(cbdc_idx_weekly_labels, by=c("week"="date_week"))%>%
  mutate(quarteryear = paste0(quarter(week), year(week) ))%>%
  left_join(vix_data_weekly, by="week")%>%
  left_join(GPR_data_weekly, by="week")%>%
  arrange(stablecoin, week)%>%
  dplyr::select(stablecoin, week,everything())%>%
  #na.omit()%>%
  mutate(FTX = ifelse(week > as.Date("2022-11-01"),1,0 ))%>%
  mutate(Luna = ifelse(week > as.Date("2022-05-01"),1,0 ))%>%
  arrange(stablecoin, week)%>%
  mutate(across(-stablecoin, ~ tidyr::replace_na(.x, 0)))%>%# remove this to replace 0 with NA when there's no speech
  rename_with(~ gsub("\\.", "_", .x))
full_weeks <- seq(
  from = min(data_artemis_weekly$week, na.rm = TRUE),
  to   = max(data_artemis_weekly$week, na.rm = TRUE),
  by   = "week"
)

# Panel équilibré stablecoin × week
panel_balanced <- expand_grid(
  stablecoin = unique(data_artemis_weekly$stablecoin),
  week       = full_weeks
)

# On rattache toutes les variables existantes
data_artemis_balanced <- panel_balanced %>%
  left_join(data_artemis_weekly, by = c("stablecoin", "week"))%>%
  mutate(index_sent_global = ifelse(index_sent_global == "NaN", NA, index_sent_global))%>%
  mutate(week1 = floor_date(week, "week", week_start = 1))%>%
  mutate(
    iso_year = isoyear(week1),
    iso_week = isoweek(week1),
    year_week = sprintf("%dw%02d", iso_year, iso_week)  # ex : "2023w01"
  )%>%
  select(stablecoin, year_week, everything())%>% select(-c(week1, iso_year, iso_week))%>%
  mutate(pegType = case_when(
    stablecoin == "USDT"~ "USD",
    stablecoin == "USDP"~ "USD",
    stablecoin == "USDC"~ "USD",
    stablecoin == "DAI"~ "USD",
    stablecoin == "cEUR"~ "EUR",
    stablecoin == "EURC"~ "EUR",
    stablecoin == "FDUSD"~ "USD",
    stablecoin == "PYUSD"~ "USD",
    stablecoin == "USDY"~ "USD",
    stablecoin == "USDe"~ "USD",
    stablecoin == "USDGLO"~ "USD",
    stablecoin == "AYSD"~ "USD",
    stablecoin == "BUSD"~ "USD",
    stablecoin == "USD0"~ "USD",
    stablecoin == "USDS"~ "USD",
    stablecoin == "cUSD"~ "USD"
    ))%>%
  mutate(pegMechanism = case_when(
    stablecoin == "USDT"~ "fiat",
    stablecoin == "USDP"~ "fiat",
    stablecoin == "USDC"~ "fiat",
    stablecoin == "DAI"~ "crypto",
    stablecoin == "cEUR"~ "algo",
    stablecoin == "EURC"~ "fiat",
    stablecoin == "FDUSD"~ "fiat",
    stablecoin == "PYUSD"~ "fiat",
    stablecoin == "USDY"~ "fiat",
    stablecoin == "USDe"~ "fiat",
    stablecoin == "USDGLO"~ "fiat",
    stablecoin == "AYSD"~ "fiat",
    stablecoin == "BUSD"~ "fiat",
    stablecoin == "USD0"~ "fiat",
    stablecoin == "USDS"~ "fiat",
    stablecoin == "cUSD"~ "fiat"
    
  ))
library(haven)
#haven::write_dta(data_artemis, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis.dta")
haven::write_dta(data_artemis_balanced, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis_weekly.dta")
data_artemis_balanced %>%
  count(stablecoin, year_week) %>%
  filter(n > 1)

Local Projections

\[ Y_{i,t+h}-Y_{i,t-1}= \alpha_i+ \alpha_q + \beta^h \Delta X_t + \gamma Z_t + \mu_{i,t} \] Where \(Y\) is the log-difference of stablecoin supply, \(\alpha_i\) is an individual FE, and \(X_t\) is our index of speech CBDC-related sentiment/stance. \(Z_t\) are control variables representing the VIX and the GPRD and their lags, and dummies representing Terra-Luna and FTX crashes. We include individual (\(\alpha_i\)) and quarter-year (\(\alpha_q\)) fixed-effects.
Note : we take the 90% interval confidences for all estimations. Standard errors are heteroskedasticity robusts (clusterized by stablecoin). Data are in weekly frequencies.

Baseline results

IRFs Effect of sentiment/stance shocks on the log-difference supply (from Artemis.xyz).

Developed Versus Emerging Central Banks

ECB, Fed and Other

Effect on fiat currency

manual local proj with fixest

To verify the robustness of our results obtained with lpirfs R package, we run the local-projections by hand with fixest with the exact same model. This way, we can clusterize our results by stablecoin and week :

h <- 15

lp_man_auer <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(stance_auer,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_globsent <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(index_sent_global,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_globstance <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(index_stance_global,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_gensent <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(sent_General_Unspecified,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_genstance <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(stance_General_Unspecified,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_retsent <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(sent_Retail_CBDC,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_retstance <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(stance_Retail_CBDC,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)


lp_man_who_sent <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(sent_Wholesale_CBDC,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

lp_man_who_stance <- feols(
  f(dlog_supply, 0:h)- l(dlog_supply,1) ~ d(stance_Wholesale_CBDC,1) +  l(GPRD,0:1)+l(VIX_close, 0:1)+Luna+FTX | stablecoin,
  data = data_artemis_weekly, panel.id=c("stablecoin", "week")
)

#etable(lp_man_who_sent, vcov = ~stablecoin+week)
#etable(lp_man_who_stance, vcov = ~stablecoin+week)
require(broom)
shock_var <- c("d(stance_auer, 1)", "d(index_stance_global, 1)", "d(index_sent_global, 1)", "d(sent_Retail_CBDC, 1)", "d(sent_General_Unspecified, 1)" , "d(sent_Wholesale_CBDC, 1)", "d(stance_Wholesale_CBDC, 1)", "d(stance_Retail_CBDC, 1)" , "d(stance_General_Unspecified, 1)"               )

irf_df_auer <- map2_dfr(
  lp_man_auer,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)

irf_df_glob_sent<- map2_dfr(
  lp_man_globsent,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)
irf_df_glob_stance<- map2_dfr(
  lp_man_globstance,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)

irf_df_gen_sent<- map2_dfr(
  lp_man_gensent,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)
irf_df_gen_stance<- map2_dfr(
  lp_man_genstance,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)

irf_df_ret_sent<- map2_dfr(
  lp_man_retsent,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)
irf_df_ret_stance<- map2_dfr(
  lp_man_retstance,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)



irf_df_who_sent <- map2_dfr(
  lp_man_who_sent,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)

irf_df_who_stance <- map2_dfr(
  lp_man_who_stance,                  # chaque sous-modèle
  0:h,                      # horizons correspondants
  ~ {
    # tidy avec IC robustes HC1
    tt <- tidy(.x, conf.int = TRUE, vcov = ~stablecoin+week)
    
    tt %>%
      filter(term %in% shock_var) %>%
      transmute(
        h   = .y,
        irf = estimate,
        low = conf.low,
        up  = conf.high, 
        term=term
      )
  }
)

auer_2 <- irf_df_auer %>%
  mutate(type="Auer")

global_2<- irf_df_glob_sent %>% rbind(irf_df_glob_stance)%>%
  mutate(type=case_when(
    term == "d(index_sent_global, 1)" ~ "Sentiment", 
    
    term=="d(index_stance_global, 1)" ~"Stance"
  ))

general_2<- irf_df_gen_sent %>% rbind(irf_df_gen_stance)%>%
  mutate(type=case_when(
    term == "d(sent_General_Unspecified, 1)" ~ "Sentiment", 
    
    term=="d(stance_General_Unspecified, 1)" ~"Stance"
  ))

retail_2<- irf_df_ret_sent %>% rbind(irf_df_ret_stance)%>%
  mutate(type=case_when(
    term == "d(sent_Retail_CBDC, 1)" ~ "Sentiment", 
    
    term=="d(stance_Retail_CBDC, 1)" ~"Stance"
  ))

wholesale_2<- irf_df_who_sent %>% rbind(irf_df_who_stance)%>%
  mutate(type=case_when(
    term == "d(sent_Wholesale_CBDC, 1)" ~ "Sentiment", 
    
    term=="d(stance_Wholesale_CBDC, 1)" ~"Stance"
  ))

We then plot the IRFs of the models :

And those IRFs are perfectly consistent with baseline estimations.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2s6IENCREMgU3BlZWNoZXMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCg0KIyBJbnRyb2R1Y3Rpb24gYW5kIGRhdGEgaW1wb3J0DQoNClRoaXMgUiBmaWxlIGdlbmVyYXRlcyB0aGUgZGFpbHkgYW5kIHdlZWtseSBzcGVlY2ggZGF0YWJhc2VzLg0KDQoNCg0KYGBge3Igc2V0dXAsIGNvbGxhcHNlPVRSVUV9DQpzZXR3ZCgiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1IikNCg0KIyBQYWNrYWdlcw0KcmVxdWlyZShndCkNCnJlcXVpcmUoZ3RzdW1tYXJ5KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoZGF0YS50YWJsZSkgICAjIHByYXRpcXVlIHBvdXIgZXhwYW5zaW9ucyByYXBpZGVzDQpsaWJyYXJ5KGZpeGVzdCkNCmxpYnJhcnkoZ2dwbG90MikNCnJlcXVpcmUoc2NhbGVzKQ0KDQpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkNCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSkNCg0Kc2VudF9wcmVkIDwtICAgcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1LzJiX2NiZGNfc2VudGVuY2VfcHJlZHNfd2l0aF9hdXRob3JfZGVzYy5jc3YiKSANCmNvdW50cmllcyA8LSAgIHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9jb3VudHJpZXMyLmNzdiIsIHNlcD0iOyIpDQp0aXRsZXMgPC0gICByZWFkLmNzdihmaWxlPSJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvY2JkY190aXRsZV9mbGFnc19mcm9tX21hdGNoZXMuY3N2IikNCmBgYA0KDQojIFNwZWVjaCBkYXRhYmFzZQ0KDQojIyBTZW50ZW5jZS1sZXZlbCBkYXRhYmFzZQ0KDQojIyMgRGF0YSBpbXBvcnQNCg0KV2UgdXNlIHRoZSBkYXRhYmFzZSBgMmJfY2JkY19zZW50ZW5jZV9wcmVkc193aXRoX2F1dGhvcl9kZXNjLmNzdmAgZG93bmxvYWRlZCBmcm9tIHRoZSBLYWdnbGUgbm90ZWJvb2suIFdlIGFsc28gdXNlIHRoZSBgY291bnRyaWVzMi5jc3ZgIGZpbGUgdGhhdCBtZXJnZSB0aGUgYXV0aG9ycyBvZiBzcGVlY2hlcyB3aXRoIHRoZWlyIENlbnRyYWwgQmFuayBhbmQgQ291bnRyaWVzLiBGb3Igc29tZSBjYXNlcywgdGhlcmUgYXJlIG11bHRpcGxlIGF1dGhvcnMgZm9yIGEgc3BlY2lmaWMgc3BlZWNoLiBGb3J0dW5hdGVseSwgdGhlc2UgY2FzZSBhcmUgcmFyZSBhbmQgdGhleSBncm91cCBhdXRob3JzIGZyb20gdGhlIHNhbWUgQ2VudHJhbCBCYW5rcyBhbmQgdGhlIHNhbWUgQ291bnRyaWVzLiBXZSBtYW51YWxseSByZXRyaWV2ZSB0aGVpciBpbmZvcm1hdGlvbnMgYW5kIGFkZCB0aGVtIGRpcmVjdGx5Lg0KDQoNCmBgYHtyLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGNvbGxhcHNlPVRSVUV9DQpzZW50X3ByZWQyIDwtIHNlbnRfcHJlZCAlPiUNCiAgc2VsZWN0KC1jKGNvdW50cnksZGVzY3JpcHRpb24pICklPiUNCiAgZGlzdGluY3QoKSU+JQ0KICBsZWZ0X2pvaW4oY291bnRyaWVzJT4ldW5pcXVlKCksIGJ5PWMoImF1dGhvciIpKSU+JQ0KICBtdXRhdGUoQ291bnRyeSA9Y2FzZV93aGVuKA0KICAgIGF1dGhvcj09IkphY3F1ZWxpbmUgTG9oOyBCZW5vw650IEPFk3Vyw6kiIH4gIkVDQiBCb2FyZCIsIA0KICAgIGF1dGhvcj09IlRob21hcyBKb3JkYW47IE1hcnRpbiBTY2hsZWdlbDsgQW50b2luZSBNYXJ0aW4ifiJTd2l0emVybGFuZCIsIA0KICAgIGF1dGhvcj09IlBldHJhIFRzY2h1ZGluOyBUaG9tYXMgTW9zZXIifiJTd2l0emVybGFuZCIsDQogICAgYXV0aG9yPT0iT2xhZiBTbGVpanBlbjsgS2xhYXMgS25vdDsgU3RldmVuIE1haWpvb3IiIH4gIk5ldGhlcmxhbmRzIiwNCiAgICBUUlVFIH4gQ291bnRyeSkpJT4lIA0KICBtdXRhdGUoQ2VudHJhbF9CYW5rID1jYXNlX3doZW4oDQogICAgYXV0aG9yPT0iSmFjcXVlbGluZSBMb2g7IEJlbm/DrnQgQ8WTdXLDqSIgfiAiRXVyb3BlYW4gQ2VudHJhbCBCYW5rIiwgDQogICAgYXV0aG9yPT0iVGhvbWFzIEpvcmRhbjsgTWFydGluIFNjaGxlZ2VsOyBBbnRvaW5lIE1hcnRpbiJ+IlN3aXNzIE5hdGlvbmFsIEJhbmsiLCANCiAgICBhdXRob3I9PSJQZXRyYSBUc2NodWRpbjsgVGhvbWFzIE1vc2VyIn4iU3dpc3MgTmF0aW9uYWwgQmFuayIsDQogICAgYXV0aG9yPT0iT2xhZiBTbGVpanBlbjsgS2xhYXMgS25vdDsgU3RldmVuIE1haWpvb3IiIH4gIkV1cm9wZWFuIENlbnRyYWwgQmFuayIsDQogICAgVFJVRSB+IENlbnRyYWxfQmFuaykpJT4lDQogIG11dGF0ZSgNCiAgICBkYXRldGltZSA9IHBhcnNlX2RhdGVfdGltZSgNCiAgICAgIGRhdGUsDQogICAgICBvcmRlcnMgPSBjKCJkL20vWSBIOk06UyIsICJkL20vWSBIOk0iLCAiWS1tLWQgSDpNOlMiLCAiWS1tLWQgSDpNIiksDQogICAgICB0eiA9ICJVVEMiICANCiAgICApLA0KICAgIGRhdGUgPSBhc19kYXRlKGRhdGV0aW1lKSAgIyBrZWVwIGEgcHVyZSBEYXRlIHRvbyAob3B0aW9uYWwpDQogICklPiVzZWxlY3QoLWRhdGV0aW1lKSU+JQ0KICBmaWx0ZXIoZGF0ZSA+PSBhcy5EYXRlKCIyMDE1LTAxLTAxIikpJT4lIHNlbGVjdCgtWCkNCg0KYGBgDQoNCldlIHNhdmUgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3BlZWNoZXMgaW4gYSBgLmNzdmAgZmlsZSAoYGNvbXBsZXRlbGlzdC5jc3ZgKS4gTm90ZSB0aGF0IHRoZSBkYXRhYmFzZSBoYXMgbG9vc2Uga2V5d29yZHMgY29uZGl0aW9ucywgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbGwgc3BlZWNoZXMgcmVsYXRlZCB0byBDQkRDLiBIb3dldmVyLCBzb21lIHNlbnRlbmNlcyBhcmUgbGlua2VkIHRvIHRpdGxlcyBhbmQvb3IgcmVmZXJlbmNlcywgb3IgdG8gY3J5cHRvLWFzc2V0cyBleGNsdXNpdmVseSAoc2VlIGZvciBleGFtcGxlIHRoZSBmaXJzdCBvYnNlcnZhdGlvbnMgYWJvdmUpLg0KDQoNCmBgYHtyLCBlY2hvPVRSVUUsIGNvbGxhcHNlPVRSVUV9DQp3cml0ZS50YWJsZShzZW50X3ByZWQyLA0KICAgICAgICAgICAgZmlsZSA9ICJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvY29tcGxldGVsaXN0LmNzdiIsDQogICAgICAgICAgICBzZXAgPSAiOyIsIGRlYyA9ICIuIiwNCiAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIlVURi04IikNCmBgYA0KDQpXZSBtYW51YWxseSBub3RlIGVhY2ggdGl0bGUuIFRoZSBkYXRhc2V0IGBsaXN0LmNzdmAgaXMgdGhlIHNhbWUgYXMgYGNvbXBsZXRlbGlzdC5jc3ZgLCB3aXRoIGFuIGFkZGl0aW9uYWwgY29sdW1uIGBjYmRjX3NlbnRlbmNlYCB0aGF0IGlzIGVxdWFsIHRvIGBGQUxTRWAgd2hlbiBzZW50ZW5jZXMgYXJlIHJlbGF0ZWQgdG8ga2V5d29yZHMgaW4gdGl0bGUgb3IgaW4gcmVmZXJlbmNlcy4gV2UgdGhlbiByZW1vdmUgdGhlc2UgIndyb25nIiBzZW50ZW5jZXMsIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgY3VycmVuY3kgdG8gZWFjaCBDZW50cmFsIEJhbmsgbWFudWFsbHkuDQoNCg0KYGBge3IsIGVjaG89VFJVRSwgY29sbGFwc2U9VFJVRX0NCmF1ZXJfZGF0YSA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkM6L3VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvc3BlZWNoZXNzdGFuY2VzLnhsc3giKSU+JWZpbHRlcihzb3VyY2U9PSJhdWVyIikNCg0Kc2VudGVuY2VfYmFzZSA8LSByZWFkLmNzdjIoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9saXN0LmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSU+JQ0KICBsZWZ0X2pvaW4odGl0bGVzICU+JSBzZWxlY3QodXJsLCBjYmRjX2luX3RpdGxlKSwgYnk9J3VybCcpJT4lDQogIHVuaXF1ZSgpJT4lDQogIG11dGF0ZShjYmRjX3NlbnRlbmNlID0gaWZlbHNlKGlzLm5hKGNiZGNfc2VudGVuY2UpLCAiVFJVRSIsY2JkY19zZW50ZW5jZSkpJT4lDQogIGZpbHRlcighY2JkY19zZW50ZW5jZT09IkZBTFNFIiklPiUgIyB3ZSBvbmx5IGtlZXAgdGhlIHRydWUgQ0JEQy1yZWxhdGVkIHNlbnRlbmNlcw0KICBtdXRhdGUoDQogICAgZGF0ZXRpbWUgPSBwYXJzZV9kYXRlX3RpbWUoDQogICAgICBkYXRlLA0KICAgICAgb3JkZXJzID0gYygiZC9tL1kgSDpNOlMiLCAiZC9tL1kgSDpNIiwgIlktbS1kIEg6TTpTIiwgIlktbS1kIEg6TSIpLA0KICAgICAgdHogPSAiVVRDIiAgIA0KICAgICksDQogICAgZGF0ZSA9IGFzX2RhdGUoZGF0ZXRpbWUpICANCiAgKSU+JXNlbGVjdCgtZGF0ZXRpbWUpICU+JQ0Kc2VsZWN0KC1jKG1hdGNoX3R5cGUsICBrZXl3b3JkLHNvdXJjZSwgIGNiZGNfc2VudGVuY2UpKSU+JQ0KICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpICU+JQ0KICBkaXN0aW5jdCgpJT4lDQogIG11dGF0ZShDdXJyZW5jeSA9IGNhc2Vfd2hlbigNCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgRW5nbGFuZCIgfiAiR0JQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJFdXJvcGVhbiBDZW50cmFsIEJhbmsiIH4gIkVVUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQmFuayBvZiBKYXBhbiIgfiAiSlBZIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIENhbmFkYSIgfiAiQ0FEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJSZXNlcnZlIEJhbmsgb2YgQXVzdHJhbGlhIiB+ICJBVUQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIk1vbmV0YXJ5IEF1dGhvcml0eSBvZiBTaW5nYXBvcmUiIH4gIlNHRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiU3ZlcmlnZXMgUmlrc2JhbmsiIH4gIlNFSyIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQmFuayBvZiBLb3JlYSIgfiAiS1JXIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJGZWQiIH4gIlVTRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIE1hbGF5c2lhIiB+ICJNWVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBDaGlsZSIgfiAiQ0xQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJOYXRpb25hbCBCYW5rIG9mIHRoZSBSZXB1YmxpYyBvZiAoTm9ydGgpIE1hY2Vkb25pYSIgfiAiTUtEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDemVjaCBOYXRpb25hbCBCYW5rIiB+ICJDWksiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIlNvdXRoIEFmcmljYW4gUmVzZXJ2ZSBCYW5rIiB+ICJaQVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgQm90c3dhbmEiIH4gIkJXUCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIEJhcmJhZG9zIiB+ICJCQkQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIk5hdGlvbmFsIEJhbmsgb2YgRGVubWFyayIgfiAiREtLIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIE1hdXJpdGl1cyIgfiAiTVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJTdGF0ZSBCYW5rIG9mIFBha2lzdGFuIiB+ICJQS1IiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBTcmkgTGFua2EiICAgIH4gIkxLUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgIlN3aXNzIE5hdGlvbmFsIEJhbmsiICB+ICJDSEYiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgdGhlIFBoaWxpcHBpbmVzIiAgfiAiUEhQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDZW50cmFsIEJhbmsgb2YgSWNlbGFuZCIgIH4gIklTSyIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgIkJhbmsgb2YgVGhhaWxhbmQiICB+ICJUSEIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJSZXNlcnZlIEJhbmsgb2YgTmV3IFplYWxhbmQiIH4gIk5aRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiRWFzdGVybiBDYXJpYmJlYW4gQ2VudHJhbCBCYW5rIiB+ICJYQ0QiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBUaGUgQmFoYW1hcyIgIH4gIkJTRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiSG9uZyBLb25nIE1vbmV0YXJ5IEF1dGhvcml0eSIgfiAiSEtEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiTm9yZ2VzIEJhbmsiICAgfiAiTk9LIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAgIkNlbnRyYWwgQmFuayBvZiBCb3NuaWEgYW5kIEhlcnplZ292aW5hIiAgICAgfiAiQkFNIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiQ2VudHJhbCBCYW5rIG9mIEt1d2FpdCIgIH4gIktXRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIE1vcm9jY28iICB+ICJNQUQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICAiQmFuayBvZiBNZXhpY28iICB+ICJNWE4iLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgQWxiYW5pYSIgICB+ICJBTEwiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICAiQmFuayBvZiBSdXNzaWEiICB+ICJSVUIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIlJlc2VydmUgQmFuayBvZiBJbmRpYSIgIH4gIklOUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiUGVvcGxlJ3MgQmFuayBvZiBDaGluYSIgfiAiQ05ZIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIEluZG9uZXNpYSIgICAgIH4gIklEUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgICJDZW50cmFsIEJhbmsgb2YgS2VueWEifiAiS0VTIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiQ2VudHJhbCBCYW5rIG9mIE5pZ2VyaWEiICAgICB+ICJOR04iLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJOYXRpb25hbCBCYW5rIG9mIFNlcmJpYSIgICAgfiAiUlNEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIElzcmFlbCIgICB+ICJJTFMiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiB0aGUgUmVwdWJsaWMgb2YgS29zb3ZvIiAgfiAiRVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIEZpbmxhbmQiICB+ICJFVVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgTmVwYWwiICB+ICJOUFIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgQ3lwcnVzIiAgfiAiRVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDZW50cmFsIEJhbmsgb2YgRXN3YXRpbmkiICB+ICJTWkwiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgU2xvdmVuaWEiIH4gIkVVUiIsIA0KICAgIFRSVUV+Ik90aGVyIg0KICAgICkpJT4lDQogIHNlbGVjdCgtYyhYLCBYLjEpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnNlbnRlbmNlX2Jhc2UlPiVmaWx0ZXIoQ2VudHJhbF9CYW5rPT0iQmFuayBvZiBGaW5sYW5kIikNCmBgYA0KDQojIyMgU3RhdGlzdGljcyBvbiBzZW50ZW5jZS1sZXZlbCBkYXRhIA0KDQpXZSBub3cgaGF2ZSBhIHNlbnRlbmNlLWxldmVsIGNsZWFuIGRhdGFiYXNlIHRoYXQgY29udGFpbnMgdGhlIGB0eXBlX2xhYmVsYCAocmV0YWlsLCB3aG9sZXNhbGUsIGdlbmVyYWwvdW5zcGVjaWZpZWQpLCB0aGUgYHNlbnRpbWVudF9sYWJlbGAgKHBvc2l0aXZlLCBuZWdhdGl2ZSwgbmV1dHJhbCksIGBzdGFuY2VfbGFiZWxgIChQcm8tQ0JEQywgQW50aS1DQkRDLCBXYWl0LWFuZC1TZWUpIGFuZCBgZGlzY291cnNlX2xhYmVsYCAoUmlzay1CZW5lZml0LCBGZWF0dXJlLCBQcm9jZXNzKSBhc3NvY2lhdGVkIHdpdGggZWFjaCBzZW50ZW5jZSBtZWFzdXJlZCBieSBCRVJULg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRvdGFsX3NlbnRlbmNlcyA8LSBucm93KHNlbnRlbmNlX2Jhc2UpDQoNCiMgVGFibGUgcsOpY2FwIGVuIGZvcm1hdCBsb25nDQpzdW1tYXJ5X3N0YXRzX3NlbnRlbmNlIDwtIGJpbmRfcm93cygNCiAgc2VudGVuY2VfYmFzZSAlPiUNCiAgICBjb3VudChsZXZlbCA9IHR5cGVfbGFiZWwsIG5hbWUgPSAibiIpICU+JQ0KICAgIG11dGF0ZShkaW1lbnNpb24gPSAiVHlwZSBkZSBDQkRDIiksDQogIA0KICBzZW50ZW5jZV9iYXNlICU+JQ0KICAgIGNvdW50KGxldmVsID0gc2VudGltZW50X2xhYmVsLCBuYW1lID0gIm4iKSAlPiUNCiAgICBtdXRhdGUoZGltZW5zaW9uID0gIlNlbnRpbWVudCIpLA0KICANCiAgc2VudGVuY2VfYmFzZSAlPiUNCiAgICBjb3VudChsZXZlbCA9IHN0YW5jZV9sYWJlbCwgbmFtZSA9ICJuIikgJT4lDQogICAgbXV0YXRlKGRpbWVuc2lvbiA9ICJTdGFuY2UiKSwNCiAgDQogIHNlbnRlbmNlX2Jhc2UgJT4lDQogICAgY291bnQobGV2ZWwgPSBkaXNjb3Vyc2VfbGFiZWwsIG5hbWUgPSAibiIpICU+JQ0KICAgIG11dGF0ZShkaW1lbnNpb24gPSAiRGlzY291cnNlIikNCikgJT4lDQogIGdyb3VwX2J5KGRpbWVuc2lvbikgJT4lDQogIG11dGF0ZShzaGFyZSA9IG4gLyBzdW0obikpICU+JQ0KICB1bmdyb3VwKCkNCnJlcXVpcmUoc2NhbGVzKQ0KDQojIFRhYmxlYXUgZ3QgcGx1cyBjbGFpcg0Kc3VtbWFyeV9zdGF0c19zZW50ZW5jZSAlPiUNCiAgYXJyYW5nZShkaW1lbnNpb24sIGRlc2MobikpICU+JQ0KICBtdXRhdGUoc2hhcmUgPSBzY2FsZXM6OnBlcmNlbnQoc2hhcmUsIGFjY3VyYWN5ID0gMC4xKSkgJT4lDQogIGd0KHJvd25hbWVfY29sID0gImxldmVsIiwgZ3JvdXBuYW1lX2NvbCA9ICJkaW1lbnNpb24iKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IHBhc3RlMCgNCiAgICAgICJTdW1tYXJ5IHN0YXRpc3RpY3Mgb2Ygc2VudGVuY2UtbGV2ZWwgZGF0YWJhc2UgKE4gPSAiLA0KICAgICAgdG90YWxfc2VudGVuY2VzLCAiIHNlbnRlbmNlcykiDQogICAgKQ0KICApICU+JQ0KICBjb2xzX2xhYmVsKA0KICAgIGxldmVsID0gIkNhdGVnb3J5IiwNCiAgICBuICAgICA9ICJOdW1iZXIgb2Ygc2VudGVuY2VzIiwNCiAgICBzaGFyZSA9ICJTaGFyZSB3aXRoaW4gZGltZW5zaW9uIg0KICApICU+JQ0KICBmbXRfbnVtYmVyKGNvbHVtbnMgPSBuLCBkZWNpbWFscyA9IDApICU+JQ0KICBjb2xzX2FsaWduKA0KICAgIGFsaWduICAgPSAiY2VudGVyIiwNCiAgICBjb2x1bW5zID0gYyhuLCBzaGFyZSkNCiAgKQ0KYGBgDQpJbiB0b3RhbCwgdGhlcmUgYXJlICoqNTM5NyB1bmlxdWVzIHNlbnRlbmNlcyoqLCAqKm1vc3RseSBhYm91dCBSZXRhaWwgQ0JEQyoqICg1MyUgb2Ygc3BlZWNoZXMpLCB3aGlsZSB1bnNwZWNpZmllZCAoMzklKSBhbmQgd2hvbGVzYWxlICg4JSkgYXJlIHJlbGF0aXZlbHkgbWFyZ2luYWxseSBtZW50aW9uZWQuIE92ZXJhbGwsIHRoZSBzZW50aW1lbnQgaXMgZXNzZW50aWFsbHkgKipuZXV0cmFsKiogeWV0ICoqcHJvLUNCREMqKi4gSW4gYWRkaXRpb24sIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgKipsZXNzIHNwZWVjaGVzIGFib3V0IHdob2xlc2FsZSBDQkRDKiosIGJ1dCB0aGV5IHRlbmQgdG8gYmUgbW9yZSBwb3NpdGl2ZS9Qcm8tQ0JEQyA6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcmVxdWlyZShwYXRjaHdvcmspDQpzZW50aW1lbnRfYnlfdHlwZSA8LSBzZW50ZW5jZV9iYXNlICU+JQ0KICBncm91cF9ieSh0eXBlX2xhYmVsLCBzZW50aW1lbnRfbGFiZWwpJT4lDQogIHN1bW1hcml6ZShjb3VudD1uKCkpJT4lDQogIG11dGF0ZSgNCiAgICB0eXBlX2xhYmVsICAgICAgPSBmYWN0b3IodHlwZV9sYWJlbCwgbGV2ZWxzID0gYygiR2VuZXJhbC9VbnNwZWNpZmllZCIsIlJldGFpbCBDQkRDIiwiV2hvbGVzYWxlIENCREMiKSksDQogICAgc2VudGltZW50X2xhYmVsID0gZmFjdG9yKHNlbnRpbWVudF9sYWJlbCwgbGV2ZWxzID0gYygibmVnYXRpdmUiLCJuZXV0cmFsIiwicG9zaXRpdmUiKSkNCiAgKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdHlwZV9sYWJlbCwgeSA9IGNvdW50LCBmaWxsID0gc2VudGltZW50X2xhYmVsKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhuZWdhdGl2ZSA9ICIjZDczMDI3IiwgbmV1dHJhbCA9ICIjYmRiZGJkIiwgcG9zaXRpdmUgPSAiIzFhOTg1MCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNlbnRpbWVudCIpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJDb3VudCIsIHRpdGxlPSJTZW50ZW5jZS1sZXZlbCBzZW50aW1lbnQgYnkgdHlwZSIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCnN0YW5jZV9ieV90eXBlIDwtIHNlbnRlbmNlX2Jhc2UgJT4lDQogIGdyb3VwX2J5KHR5cGVfbGFiZWwsIHN0YW5jZV9sYWJlbCklPiUNCiAgc3VtbWFyaXplKGNvdW50PW4oKSklPiUNCiAgbXV0YXRlKA0KICAgIHR5cGVfbGFiZWwgICAgICA9IGZhY3Rvcih0eXBlX2xhYmVsLCBsZXZlbHMgPSBjKCJHZW5lcmFsL1Vuc3BlY2lmaWVkIiwiUmV0YWlsIENCREMiLCJXaG9sZXNhbGUgQ0JEQyIpKSwNCiAgICBzdGFuY2VfbGFiZWwgPSBmYWN0b3Ioc3RhbmNlX2xhYmVsLCBsZXZlbHMgPSBjKCJBbnRpLUNCREMiLCJXYWl0LWFuZC1TZWUiLCJQcm8tQ0JEQyIpKQ0KICApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0eXBlX2xhYmVsLCB5ID0gY291bnQsIGZpbGwgPSBzdGFuY2VfbGFiZWwpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBbnRpLUNCREMiID0gIiNkNzMwMjciLCAiV2FpdC1hbmQtU2VlIiA9ICIjYmRiZGJkIiwgIlByby1DQkRDIiA9ICIjMWE5ODUwIiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3RhbmNlIikgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gIiIsIHRpdGxlPSJTZW50ZW5jZS1sZXZlbCBzdGFuY2UgYnkgdHlwZSIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQpzZW50aW1lbnRfYnlfdHlwZSArIHN0YW5jZV9ieV90eXBlDQpgYGANCg0KSW4gYWRkaXRpb24sIHdlIGNhbiBvYnNlcnZlIHRoYXQgc29tZSBDZW50cmFsIEJhbmtzIC0gYW5kIG5vdGFibHkgRUNCIC0gdGVuZCB0byBjb21tdW5pY2F0ZSBtb3JlIHRoYW4gb3RoZXJzIDoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZXF1aXJlKGZvcmNhdHMpDQoNCnNlbnRlbmNlX2Jhc2UgJT4lDQogIGNvdW50KENlbnRyYWxfQmFuaywgbmFtZSA9ICJjb3VudCIpICU+JQ0KICBtdXRhdGUoQ2VudHJhbF9CYW5rID0gZmN0X3Jlb3JkZXIoQ2VudHJhbF9CYW5rLCBjb3VudCwgLmRlc2MgPSBUUlVFKSkgJT4lDQogIGZpbHRlcighY291bnQ8MjApJT4lDQogIGdncGxvdChhZXMoQ2VudHJhbF9CYW5rLCBjb3VudCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArICAjIGVhc2llciB0byByZWFkIGxvbmcgbGFiZWxzOyByZW1vdmUgaWYgeW91IHByZWZlciB2ZXJ0aWNhbA0KICBsYWJzKHggPSBOVUxMLCB5ID0gIkNvdW50IiwgdGl0bGU9Ik51bWJlciBvZiBzZW50ZW5jZXMgcmVsYXRlZCB0byBDQkRDIGJ5IENlbnRyYWwgQmFuayoiLA0KICAgICAgIGNhcHRpb249IipSZW1vdmVkIGNlbnRyYWwgYmFua3Mgd2l0aCBsZXNzIHRoYW4gMjAgc2VudGVuY2VzIGFib3V0IENCREMiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KIyMgRGF5L1dlZWstbGV2ZWwgZGF0YWJhc2UNCg0KV2UgaGF2ZSBzZW50aW1lbnQsIHN0YW5jZSwgZGlzY291cnNlIGFuZCB0eXBlIG9mIENCREMgZGlzY3Vzc2VkIGF0IHNlbnRlbmNlLWxldmVsLiBXZSB0cmFuc2Zvcm0gdGhlIHNlbnRpbWVudHMgKGBwb3NpdGl2ZWAsIGBuZXV0cmFsYCBldCBgbmVnYXRpdmVgKSBhbmQgc3RhbmNlcyAoYFByby1DQkRDYCwgYFdhaXQtYW5kLVNlZWAgZXQgYEFudGktQ0JEQ2ApIGluIG51bWVyaWMgdmFsdWVzICgxLCAwLCAtMSkgdG8gb2J0YWluIHNpbWlsYXIgZGF0YSBhcyBpbiBBdWVyICYgYWwgKDIwMjEpIGFuZCBEaW9ueXNvcG91bG9zICYgTWFrcmlkaXMgKDIwMjUpLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNpZ25fZnJvbV9zZW50aW1lbnQgPC0gZnVuY3Rpb24obGJsKSB7DQogIHggPC0gc3RyX3RvX2xvd2VyKGxibCkNCiAgY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoeCwgInBvc2l0aXZlIikgfiAgMUwsDQogICAgc3RyX2RldGVjdCh4LCAibmVnYXRpdmUiKSB+IC0xTCwNCiAgICBUUlVFIH4gMEwgICMgbmV1dHJhbCwgb3RoZXINCiAgKQ0KfQ0Kc2lnbl9mcm9tX3N0YW5jZSA8LSBmdW5jdGlvbihsYmwpIHsNCiAgeCA8LSBzdHJfdG9fbG93ZXIobGJsKQ0KICBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdCh4LCAicHJvIikgICAgICAgICAgICB+ICAxTCwgICMgcHJvLWNiZGMNCiAgICBzdHJfZGV0ZWN0KHgsICJhbnRpIikgICAgICAgICAgIH4gLTFMLCAgIyBhbnRpLWNiZGMNCiAgICBzdHJfZGV0ZWN0KHgsICJ3YWl0IikgICAgICAgICAgIH4gIDBMLCAgIyB3YWl0LWFuZC1zZWUNCiAgICBUUlVFIH4gMEwNCiAgKQ0KfQ0KDQpzcGVlY2hlc19zaWducyA8LSBzZW50ZW5jZV9iYXNlICU+JQ0KICBtdXRhdGUoDQogICAgc2VudF9zaWduICAgPSBzaWduX2Zyb21fc2VudGltZW50KHNlbnRpbWVudF9sYWJlbCksDQogICAgc3RhbmNlX3NpZ24gPSBzaWduX2Zyb21fc3RhbmNlKHN0YW5jZV9sYWJlbCkNCiAgKQ0KDQpgYGANCg0KVGhlbiwgZm9yIGEgZ2l2ZW4gc3BlZWNoLCB3ZSBtZWFzdXJlIHRoZSBhdmVyYWdlIHNlbnRpbWVudCBhbmQgc3RhbmNlLiBXZSB0aGVuIGFnZ3JlZ2F0ZSB0aGUgc2VudGltZW50IGFuZCBzdGFuY2UgZGFpbHktbGV2ZWwgYXMgdGhlaXIgYXZlcmFnZSBhY3Jvc3MgYWxsIHNwZWVjaGVzIHRoYXQgZGF5LiANCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc3BlZWNoX2xldmVsIDwtIHNwZWVjaGVzX3NpZ25zICU+JQ0KICAjbGVmdF9qb2luKHNlbnRlbmNlX2Jhc2UyLCBieT1jKCJ1cmwiLCAiZGF0ZSIpKSU+JQ0KICBncm91cF9ieSh1cmwsIGRhdGUsIENlbnRyYWxfQmFuaywgdHlwZV9sYWJlbCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBzZW50X3NwZWVjaCAgID0gbWVhbihzZW50X3NpZ24sICAgbmEucm0gPSBUUlVFKSwNCiAgICBzdGFuY2Vfc3BlZWNoID0gbWVhbihzdGFuY2Vfc2lnbiwgbmEucm0gPSBUUlVFKSwNCiAgICAjc3RhbmNlX2F1ZXIgPSBtZWFuKHNwZWVjaF9zdGFuY2UpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQpgYGANCldlIGFsc28gZGVjb21wb3NlIGJ5IHR5cGUgb2YgQ0JEQyBkaXNjdXNzZWQgd2l0aGluIGVhY2ggZGF5LCBhcyB3ZWxsIGFzIGZvciBFQ0IsIEZlZCBhbmQgb3RoZXIgY2VudHJhbCBiYW5rcywgYW5kIGZvciBkZXZlbG9wZWQgdmVyc3VzIGVtZXJnaW5nIG1hcmtldHMgY2VudHJhbCBiYW5rcy4NCg0KDQpgYGB7cn0NCg0KYmFua2RheV90eXBlIDwtIHNwZWVjaF9sZXZlbCAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgQ2VudHJhbF9CYW5rLCB0eXBlX2xhYmVsKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHNlbnRfYnRrICAgPSBtZWFuKHNlbnRfc3BlZWNoLCAgIG5hLnJtID0gVFJVRSksDQogICAgc3RhbmNlX2J0ayA9IG1lYW4oc3RhbmNlX3NwZWVjaCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KDQoNCnR5cGVfZGFpbHkgPC0gYmFua2RheV90eXBlICU+JQ0KICBncm91cF9ieShkYXRlLCB0eXBlX2xhYmVsKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGluZGV4X3NlbnRfdHlwZSAgID0gbWVhbihzZW50X2J0aywgICBuYS5ybSA9IFRSVUUpLA0KICAgIGluZGV4X3N0YW5jZV90eXBlID0gbWVhbihzdGFuY2VfYnRrLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQoNCmJhbmtkYXlfYWxsIDwtIGJhbmtkYXlfdHlwZSAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgQ2VudHJhbF9CYW5rKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHNlbnRfYnRfYWxsICAgPSBtZWFuKHNlbnRfYnRrLCAgIG5hLnJtID0gVFJVRSksDQogICAgc3RhbmNlX2J0X2FsbCA9IG1lYW4oc3RhbmNlX2J0aywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KDQpzZW50ZW5jZV9iYXNlMiA8LSBzZW50ZW5jZV9iYXNlJT4lDQogIHNlbGVjdCh1cmwsIGRhdGUpJT4lDQogIGRpc3RpbmN0KHVybCwgZGF0ZSklPiUNCiAgaW5uZXJfam9pbihhdWVyX2RhdGElPiVzZWxlY3QoVVJMX3RleHQsIHNwZWVjaF9zdGFuY2UpLCBieT1jKCJ1cmwiPSJVUkxfdGV4dCIpKSU+JQ0KICBncm91cF9ieShkYXRlKSU+JQ0KICBzdW1tYXJpemUoc3RhbmNlX2F1ZXIgPSBtZWFuKHNwZWVjaF9zdGFuY2UpKQ0KDQpnbG9iYWxfZGFpbHkgPC0gYmFua2RheV9hbGwgJT4lDQogIGdyb3VwX2J5KGRhdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgaW5kZXhfc2VudF9nbG9iYWwgICA9IG1lYW4oc2VudF9idF9hbGwsICAgbmEucm0gPSBUUlVFKSwNCiAgICBpbmRleF9zdGFuY2VfZ2xvYmFsID0gbWVhbihzdGFuY2VfYnRfYWxsLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSU+JQ0KICBsZWZ0X2pvaW4oc2VudGVuY2VfYmFzZTIsIGJ5PSJkYXRlIiklPiUNCiAgbXV0YXRlKHNwZWVjaGRheSA9IDEpDQoNCg0KZ2xvYmFsX2RhaWx5X2RldmVtZSA8LSBiYW5rZGF5X2FsbCAlPiUNCiAgbXV0YXRlKGRldmVtZSA9IGNhc2Vfd2hlbihDZW50cmFsX0JhbmsgJWluJSBjKCJCYW5rIG9mIEVuZ2xhbmQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1cm9wZWFuIENlbnRyYWwgQmFuayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5rIG9mIEphcGFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5rIG9mIENhbmFkYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZSBCYW5rIG9mIEF1c3RyYWxpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ZlcmlnZXMgUmlrc2JhbmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3aXNzIE5hdGlvbmFsIEJhbmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgQmFuayBvZiBJY2VsYW5kIiwgIk5vcmdlcyBCYW5rIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXRpb25hbCBCYW5rIG9mIERlbm1hcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZSBCYW5rIG9mIE5ldyBaZWFsYW5kIiwgIkJhbmsgb2YgRmlubGFuZCIpICB+IkRldmVsb3BlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4iRW1lcmdpbmciKSklPiUNCiAgZ3JvdXBfYnkoZGV2ZW1lLCBkYXRlKSU+JQ0KICBzdW1tYXJpc2UoaW5kZXhfc2VudF9kZXZlbWUgPSBtZWFuKHNlbnRfYnRfYWxsLG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICBpbmRleF9zdGFuY2VfZGV2ZW1lPW1lYW4oc3RhbmNlX2J0X2FsbCxuYS5ybSA9IFRSVUUpKSU+JQ0KICBhcnJhbmdlKGRhdGUpJT4ldW5ncm91cCgpJT4lIA0KICBkcGx5cjo6cmVuYW1lKA0KICAgIHNlbnQgID0gaW5kZXhfc2VudF9kZXZlbWUsDQogICAgc3RhbmNlID0gaW5kZXhfc3RhbmNlX2RldmVtZQ0KICApICU+JSANCiAgcGl2b3Rfd2lkZXIoDQogICAgaWRfY29scyAgID0gZGF0ZSwNCiAgICBuYW1lc19mcm9tICA9IGRldmVtZSwgICAgICAgICAgICAgICMgIkRldmVsb3BlZCIsICJFbWVyZ2luZyINCiAgICB2YWx1ZXNfZnJvbSA9IGMoc2VudCwgc3RhbmNlKSwNCiAgICBuYW1lc19nbHVlICA9ICJ7LnZhbHVlfV97ZGV2ZW1lfSIsICAjIHNlbnRfRGV2ZWxvcGVkLCBzdGFuY2VfRGV2ZWxvcGVkLCBldGMuDQogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KHNlbnQgPSAwLCBzdGFuY2UgPSAwKQ0KICApDQoNCg0KZ2xvYmFsX2RhaWx5X2RlY29tcG9zZWQgPC0gYmFua2RheV9hbGwgJT4lDQogIG11dGF0ZShDQiA9IGNhc2Vfd2hlbihDZW50cmFsX0JhbmsgJWluJSBjKA0KICAgICJFdXJvcGVhbiBDZW50cmFsIEJhbmsiKSB+ICJFQ0IiLCANCiAgICBDZW50cmFsX0JhbmsgPT0iRmVkIiB+ICJGZWQiLA0KICAgIFRSVUUgfiAiT3RoZXIiKSklPiUNCiAgZ3JvdXBfYnkoQ0IsIGRhdGUpJT4lDQogIHN1bW1hcmlzZShpbmRleF9zZW50X2NiID0gbWVhbihzZW50X2J0X2FsbCxuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgaW5kZXhfc3RhbmNlX2NiPW1lYW4oc3RhbmNlX2J0X2FsbCxuYS5ybSA9IFRSVUUpKSU+JQ0KICBhcnJhbmdlKGRhdGUpJT4ldW5ncm91cCgpJT4lIA0KICBkcGx5cjo6cmVuYW1lKA0KICAgIHNlbnQgID0gaW5kZXhfc2VudF9jYiwNCiAgICBzdGFuY2UgPSBpbmRleF9zdGFuY2VfY2INCiAgKSAlPiUgDQogIHBpdm90X3dpZGVyKA0KICAgIGlkX2NvbHMgICA9IGRhdGUsDQogICAgbmFtZXNfZnJvbSAgPSBDQiwgICAgICAgICAgICAgICMgIkRldmVsb3BlZCIsICJFbWVyZ2luZyINCiAgICB2YWx1ZXNfZnJvbSA9IGMoc2VudCwgc3RhbmNlKSwNCiAgICBuYW1lc19nbHVlICA9ICJ7LnZhbHVlfV97Q0J9IiwgICMgc2VudF9EZXZlbG9wZWQsIHN0YW5jZV9EZXZlbG9wZWQsIGV0Yy4NCiAgICB2YWx1ZXNfZmlsbCA9IGxpc3Qoc2VudCA9IDAsIHN0YW5jZSA9IDApDQogICkNCg0KDQpnbG9iYWxfZGFpbHlfZmVkZWNiIDwtIGJhbmtkYXlfYWxsICU+JQ0KICBtdXRhdGUoQ0IgPSBjYXNlX3doZW4oQ2VudHJhbF9CYW5rICVpbiUgYygNCiAgICAiRXVyb3BlYW4gQ2VudHJhbCBCYW5rIiwgIkZlZCIpIH4gIkVDQkZFRCIsIA0KICAgIFRSVUUgfiAibm9uRUNCRkVEIikpJT4lDQogIGdyb3VwX2J5KENCLCBkYXRlKSU+JQ0KICBzdW1tYXJpc2UoaW5kZXhfc2VudF9jYiA9IG1lYW4oc2VudF9idF9hbGwsbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIGluZGV4X3N0YW5jZV9jYj1tZWFuKHN0YW5jZV9idF9hbGwsbmEucm0gPSBUUlVFKSklPiUNCiAgYXJyYW5nZShkYXRlKSU+JXVuZ3JvdXAoKSU+JSANCiAgZHBseXI6OnJlbmFtZSgNCiAgICBzZW50ICA9IGluZGV4X3NlbnRfY2IsDQogICAgc3RhbmNlID0gaW5kZXhfc3RhbmNlX2NiDQogICkgJT4lIA0KICBwaXZvdF93aWRlcigNCiAgICBpZF9jb2xzICAgPSBkYXRlLA0KICAgIG5hbWVzX2Zyb20gID0gQ0IsICAgICAgICAgICAgICAjICJEZXZlbG9wZWQiLCAiRW1lcmdpbmciDQogICAgdmFsdWVzX2Zyb20gPSBjKHNlbnQsIHN0YW5jZSksDQogICAgbmFtZXNfZ2x1ZSAgPSAiey52YWx1ZX1fe0NCfSIsICAjIHNlbnRfRGV2ZWxvcGVkLCBzdGFuY2VfRGV2ZWxvcGVkLCBldGMuDQogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KHNlbnQgPSAwLCBzdGFuY2UgPSAwKQ0KICApDQoNCmRldmVtZV9jYiA8LSBnbG9iYWxfZGFpbHlfZGV2ZW1lICU+JQ0KICBsZWZ0X2pvaW4oZ2xvYmFsX2RhaWx5X2RlY29tcG9zZWQsIGJ5PSJkYXRlIiklPiUNCiAgbGVmdF9qb2luKGdsb2JhbF9kYWlseV9mZWRlY2IsIGJ5PSJkYXRlIikNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KYWxsX2RheXMgPC0gdGliYmxlKGRhdGUgPSBzZXEobWluKHNlbnRlbmNlX2Jhc2UkZGF0ZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChzZW50ZW5jZV9iYXNlJGRhdGUsIG5hLnJtID0gVFJVRSksIGJ5ID0gImRheSIpKQ0KDQp0eXBlX2RhaWx5X3NlbnRfd2lkZSA8LSB0eXBlX2RhaWx5ICU+JQ0KICBtdXRhdGUodHlwZV9jb2wgPSBtYWtlLm5hbWVzKHR5cGVfbGFiZWwpKSAlPiUNCiAgc2VsZWN0KGRhdGUsIHR5cGVfY29sLCBpbmRleF9zZW50X3R5cGUpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdHlwZV9jb2wsIHZhbHVlc19mcm9tID0gaW5kZXhfc2VudF90eXBlLCBuYW1lc19wcmVmaXggPSAic2VudF8iKQ0KDQp0eXBlX2RhaWx5X3N0YW5jZV93aWRlIDwtIHR5cGVfZGFpbHkgJT4lDQogIG11dGF0ZSh0eXBlX2NvbCA9IG1ha2UubmFtZXModHlwZV9sYWJlbCkpICU+JQ0KICBzZWxlY3QoZGF0ZSwgdHlwZV9jb2wsIGluZGV4X3N0YW5jZV90eXBlKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHR5cGVfY29sLCB2YWx1ZXNfZnJvbSA9IGluZGV4X3N0YW5jZV90eXBlLCBuYW1lc19wcmVmaXggPSAic3RhbmNlXyIpDQoNCmNiZGNfaWR4X2RhaWx5X2xhYmVscyA8LSBhbGxfZGF5cyAlPiUNCiAgbGVmdF9qb2luKGdsb2JhbF9kYWlseSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zZW50X3dpZGUsICAgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zdGFuY2Vfd2lkZSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4oZGV2ZW1lX2NiLCBieT0iZGF0ZSIpJT4lDQogIGFycmFuZ2UoZGF0ZSkNCg0KY2JkY19pZHhfd2Vla2x5X2xhYmVscyA8LSBjYmRjX2lkeF9kYWlseV9sYWJlbHMgJT4lDQogIG11dGF0ZSh3ZWVrID0gZmxvb3JfZGF0ZShkYXRlLCB1bml0ID0gIndlZWsiKSkgJT4lDQogIGdyb3VwX2J5KHdlZWspICU+JQ0KICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IG1lYW4oLngsIG5hLnJtID0gVFJVRSkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZHBseXI6OnJlbmFtZShkYXRlX3dlZWsgPSB3ZWVrKQ0KDQpgYGANCg0KIyMjIER5bmFtaWNzIG9mIHNwZWVjaGVzIHNlbnRpbWVudHMNCg0KDQpgYGB7cn0NCndlZWtseV9zZW50aW1lbnRfcGxvdCA8LSBjYmRjX2lkeF93ZWVrbHlfbGFiZWxzJT4lZ2dwbG90KGFlcyh4PWRhdGVfd2VlaywgeT1pbmRleF9zZW50X2dsb2JhbCkpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9saW5lKGx3ZD0uNSwgbHR5PTIpK2xhYnMoeD0iIiwgeT0iV2Vla2x5IFNlbnRpbWVudCIpDQoNCmRhaWx5X3NlbnRpbWVudF9wbG90IDwtIGNiZGNfaWR4X2RhaWx5X2xhYmVscyU+JWdncGxvdChhZXMoeD1kYXRlLCB5PWluZGV4X3NlbnRfZ2xvYmFsKSkrDQogIGdlb21fcG9pbnQoc2l6ZT0xKStnZW9tX2xpbmUobHdkPS41LCBsdHk9MikrbGFicyh4PSIiLCB5PSJEYWlseSBTZW50aW1lbnQiKQ0KDQpkYWlseV9zZW50aW1lbnRfcGxvdC93ZWVrbHlfc2VudGltZW50X3Bsb3QgDQpgYGANCg0KIyMjIFN0YXRpc3RpY3Mgb2Ygd2Vla2x5IHNwZWVjaGVzDQpgYGB7cn0NCmdsb2JhbF9kYWlseSAlPiUNCiAgbGVmdF9qb2luKHR5cGVfZGFpbHlfc2VudF93aWRlLCAgIGJ5ID0gImRhdGUiKSAlPiUNCiAgbGVmdF9qb2luKHR5cGVfZGFpbHlfc3RhbmNlX3dpZGUsIGJ5ID0gImRhdGUiKSAlPiUNCiAgbGVmdF9qb2luKGRldmVtZV9jYiwgICAgICAgICAgICAgIGJ5ID0gImRhdGUiKSAlPiUNCiAgYXJyYW5nZShkYXRlKSAlPiUNCiAgbXV0YXRlKHdlZWsgPSBmbG9vcl9kYXRlKGRhdGUsIHVuaXQgPSAid2VlayIpKSAlPiUNCiAgZ3JvdXBfYnkod2VlaykgJT4lDQogIHN1bW1hcmlzZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gbWVhbigueCwgbmEucm0gPSBUUlVFKSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBzZWxlY3QoLXNwZWVjaGRheSklPiUNCiAgdGJsX3N1bW1hcnkoDQogICAgdHlwZSA9IGxpc3QoDQogICAgICBhbGxfY29udGludW91cygpIH4gImNvbnRpbnVvdXMyIiwgICMgdG91cyBsZXMgY29udGludXMNCiAgICAgIHdlZWsgfiAiY29udGludW91cyIgICAgICAgICAgICAgICAjIHNhdWYgd2Vlaw0KICAgICksDQogICAgc3RhdGlzdGljID0gbGlzdCgNCiAgICAgIGFsbF9jb250aW51b3VzKCkgfiBjKCJ7bWVhbn0gKHtzZH0pIiksDQogICAgICB3ZWVrIH4gInttaW59LCB7bWF4fSIgICAgICAgICAgICAgIyBzZXVsZW1lbnQgbWluL21heCBwb3VyIHdlZWsNCiAgICApLA0KICAgIGxhYmVsID0gd2VlayB+ICJXZWVrIChtaW4sIG1heCkiDQogICklPiUNCiAgbW9kaWZ5X2Zvb3Rub3RlKGV2ZXJ5dGhpbmcoKSB+IE5BX2NoYXJhY3Rlcl8pDQpgYGANCg0KDQoNCiMgU3RhYmxlY29pbnMgc3VwcGx5IGRhdGENCiMjIERhdGEgaW1wb3J0DQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmFydGVtaXMgPC0gcmVhZHI6OnJlYWRfY3N2MigNCiAgIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvQXJ0ZW1pcyBkYXRhL1N0YWJsZWNvaW4gU3VwcGx5IGJ5IFN0YWJsZWNvaW4uY3N2IiwNCiAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRQ0KKQ0KDQpHUFIgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJDOi91c2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvR1BSLnhsc3giKSU+JQ0KICBtdXRhdGUoZGF0ZT1hcy5EYXRlKGRhdGUpKSU+JQ0KICBzZWxlY3QoLWMoREFZKSkNCnJlcXVpcmUocXVhbnRtb2QpDQpWSVggPC0gZ2V0U3ltYm9scygiXlZJWCIsIHNyYz0ieWFob28iLCBhdXRvLmFzc2lnbiA9IEZBTFNFKSANCnZpeF9kYXRhIDwtIGRhdGEuZnJhbWUoZGF0ZSA9IGluZGV4KFZJWCksIGNvcmVkYXRhKFZJWCkpJT4lDQogIGRwbHlyOjpyZW5hbWUoIlZJWF9jbG9zZSIgPSBgVklYLkNsb3NlYCklPiUNCiAgc2VsZWN0KGRhdGUsIFZJWF9jbG9zZSkNCnZpeF9kYXRhX3dlZWtseSA8LSBkYXRhLmZyYW1lKGRhdGUgPSBpbmRleChWSVgpLCBjb3JlZGF0YShWSVgpKSU+JQ0KICBkcGx5cjo6cmVuYW1lKCJWSVhfY2xvc2UiID0gYFZJWC5DbG9zZWApJT4lDQogIHNlbGVjdChkYXRlLCBWSVhfY2xvc2UpJT4lDQogIG11dGF0ZSh3ZWVrID0gZmxvb3JfZGF0ZShkYXRlLCAid2VlayIpKSU+JQ0KICBncm91cF9ieSh3ZWVrKSU+JQ0KICBzdW1tYXJpemUoVklYX2Nsb3NlID0gbWVhbihWSVhfY2xvc2UsIG5hLnJtPVQpKQ0KDQpHUFJfZGF0YV93ZWVrbHkgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvR1BSLnhsc3giKSU+JQ0KICBtdXRhdGUoZGF0ZT1hcy5EYXRlKGRhdGUpKSU+JQ0KICBzZWxlY3QoLWMoREFZKSApJT4lDQogIG11dGF0ZSh3ZWVrPWZsb29yX2RhdGUoZGF0ZSwgIndlZWsiKSklPiUNCiAgZ3JvdXBfYnkod2VlayklPiUNCiAgc3VtbWFyaXplKE4xMEQgPSBtZWFuKE4xMEQpLCBHUFJEID0gbWVhbihHUFJEKSwgDQogICAgICAgICAgICBHUFJEX0FDVCA9IG1lYW4oR1BSRF9BQ1QpLCBHUFJEX1RIUkVBVD1tZWFuKEdQUkRfVEhSRUFUKSklPiUNCiAgZmlsdGVyKHdlZWsgPiBhcy5EYXRlKCIyMDE3LTAxLTAxIikpDQoNCkNCRENfSW5kaWNlcyA8LSByZWFkLmNzdjIoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0NCRENfSW5kaWNlcy5jc3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIlVURi04IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSklPiUNCiAgZHBseXI6OnJlbmFtZSgiQ0JEQ19VbmNlcnRhaW50eSI9IkNCREMuVW5jZXJ0YWludHkuSW5kZXgiLCANCiAgICAgICAgICAgICAgICAiQ0JEQ19BdHRlbnRpb24iPSJDQkRDLkF0dGVudGlvbi5JbmRleCIpJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJWQvJW0vJVkiKSklPiUNCiAgIG11dGF0ZSgNCiAgICAjIGZpeCBudW1lcmljIGNvbHVtbnMgcmVhZCBhcyBjaGFyYWN0ZXINCiAgICBhY3Jvc3MoYyhDQkRDX1VuY2VydGFpbnR5LCBDQkRDX0F0dGVudGlvbiksDQogICAgICAgICAgIH4gYXMubnVtZXJpYyhnc3ViKCIsIiwgIi4iLCAuKSkpLA0KICAgIGlzb195ZWFyID0gaXNveWVhcihEYXRlKSwNCiAgICBpc29fd2VlayA9IGlzb3dlZWsoRGF0ZSkNCiAgKSAlPiUNCiAgZGlzdGluY3QoaXNvX3llYXIsIGlzb193ZWVrLCAua2VlcF9hbGwgPSBUUlVFKSANCg0KDQojIHNldCB5b3VyIGRlc2lyZWQgbmFtZXMNCm5hbWVzKGFydGVtaXMpIDwtIGMoIkRhdGUiLCJBWVNEIiwiQlVTRCIsIkRBSSIsIkVVUkMiLCJGRFVTRCIsIlBZVVNEIiwiVVNEMCIsIlVTREMiLCAgICAgICAgICAgICAgICAiVVNER0xPIiwiVVNEUCIsIlVTRFMiLCJVU0RUIiwiVVNEWSIsIlVTRGUiLCJjRVVSIiwiY0tFUyIsImNSRUFMIiwiY1VTRCIpDQoNCmFydGVtaXNfcmF3IDwtIGFydGVtaXMgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gZG15X2htKERhdGUsIHR6ID0gIlVUQyIpICAjIG9yIGRteV9obXMgaWYgeW91IGhhZCBzZWNvbmRzDQogICkNCg0KIyByZXNoYXBlIHRvIGxvbmcgd2l0aCBwaXZvdF9sb25nZXIgKHZhcmlhYmxlIHdpbGwgYmUgY2hhcmFjdGVyKQ0KcGFuZWxfYXJ0ZW1pcyA8LSBhcnRlbWlzX3JhdyAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdD0iJWQvJW0vJXkiKSkgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gLURhdGUsDQogICAgbmFtZXNfdG8gPSAic3RhYmxlY29pbiIsDQogICAgdmFsdWVzX3RvID0gInN1cHBseSIsDQogICAgdmFsdWVzX3RyYW5zZm9ybSA9IGxpc3Qoc3VwcGx5ID0gYXMubnVtZXJpYykgICAjIGVuc3VyZXMgbnVtZXJpYywgTkFzIHdoZXJlIG5lZWRlZA0KICApICU+JQ0KICBhcnJhbmdlKHN0YWJsZWNvaW4sIERhdGUpICAlPiUgIyBJTVBPUlRBTlQ6IHNvcnQgYmVmb3JlIHBsb3R0aW5nDQogIGdyb3VwX2J5KHN0YWJsZWNvaW4pJT4lDQogIG11dGF0ZShsb2dfc3VwcGx5ID0gbG9nKDErc3VwcGx5KSwgZGxvZ19zdXBwbHkgPSBsb2dfc3VwcGx5IC0gbGFnKGxvZ19zdXBwbHkpKQ0KDQoNCiNyZW1vdmUgb3V0bGllcnMgaW4gZGxvZ19zdXBwDQpwYW5lbF9hcnRlbWlzX3RyaW1tZWQgPC0gcGFuZWxfYXJ0ZW1pcyAlPiUNCiAgZ3JvdXBfYnkoc3RhYmxlY29pbikgJT4lDQogIG11dGF0ZSgNCiAgICBxMDEgPSBxdWFudGlsZShkbG9nX3N1cHBseSwgMC4wNSwgbmEucm0gPSBUUlVFKSwNCiAgICBxOTkgPSBxdWFudGlsZShkbG9nX3N1cHBseSwgMC45NSwgbmEucm0gPSBUUlVFKQ0KICApICU+JQ0KICAjIGtlZXAgb2JzZXJ2YXRpb25zIGluc2lkZSBbcTAxLCBxOTldDQogIGZpbHRlcihpcy5maW5pdGUoZGxvZ19zdXBwbHkpLA0KICAgICAgICAgIWlzLm5hKHEwMSksICFpcy5uYShxOTkpLA0KICAgICAgICAgZGxvZ19zdXBwbHkgPj0gcTAxLA0KICAgICAgICAgZGxvZ19zdXBwbHkgPD0gcTk5KSAlPiUNCiAgc2VsZWN0KC1xMDEsIC1xOTkpICU+JQ0KICBmaWx0ZXIoc2QoZGxvZ19zdXBwbHksIG5hLnJtPVQpID4gIDFlLTA2LCAhZGxvZ19zdXBwbHkgPT0wKSU+JQ0KICB1bmdyb3VwKCkNCg0KDQpwYW5lbF9hcnRlbWlzX3RyaW1tZWRfd2Vla2x5IDwtIHBhbmVsX2FydGVtaXNfdHJpbW1lZCAlPiUNCiAgbXV0YXRlKHdlZWsgPSBmbG9vcl9kYXRlKERhdGUsICJ3ZWVrIikpJT4lDQogIGdyb3VwX2J5KHdlZWssIHN0YWJsZWNvaW4pJT4lDQogIHN1bW1hcml6ZShzdXBwbHk9bWVhbihzdXBwbHkpKSU+JQ0KICBtdXRhdGUobG9nX3N1cHBseSA9IGxvZyhzdXBwbHkpLCAgZGxvZ19zdXBwbHkgPSBsb2dfc3VwcGx5LWxhZyhsb2dfc3VwcGx5KSApDQoNCg0KYGBgDQojIyBTdGF0aXN0aWNzDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCnBhbmVsX2FydGVtaXNfdHJpbW1lZCAlPiUgZmlsdGVyKERhdGUgPD1hcy5EYXRlKCIyMDI1LTA2LTAxIikpJT4lDQogIGdncGxvdChhZXMoRGF0ZSwgbG9nX3N1cHBseSkpICsNCiAgZ2VvbV9saW5lKG5hLnJtID0gVFJVRSwgbHdkPTAuOCkgKw0KICBsYWJzKHggPSAiRGF0ZSIsIHkgPSAiU3VwcGx5IChsb2cpIiwgdGl0bGUgPSAiU3RhYmxlY29pbnMgc3VwcGx5IChBcnRlbWlzKSIsIGNhcHRpb24gPSAiTm90ZTogd2UgcmVtb3ZlIG91dGxpZXJzIGJ5IHRyaW1taW5nIGRhdGEgb3V0c2lkZSA1JS05NSUgcXVhbnRpbGVzLiIpICsNCiAgdGhlbWVfbWluaW1hbCgpK2ZhY2V0X3dyYXAofnN0YWJsZWNvaW4sIHNjYWxlcz0iZnJlZV95IikNCmBgYA0KYGBge3J9DQpwYW5lbF9hcnRlbWlzX3RyaW1tZWQgJT4lDQogIHNlbGVjdChEYXRlLCBzdXBwbHksIHN0YWJsZWNvaW4pJT4lDQogIHRibF9zdW1tYXJ5KGJ5PXN0YWJsZWNvaW4sDQogICAgdHlwZSA9IGxpc3QoDQogICAgICBhbGxfY29udGludW91cygpIH4gImNvbnRpbnVvdXMyIiwgICMgdG91cyBsZXMgY29udGludXMNCiAgICAgIERhdGUgfiAiY29udGludW91cyIgICAgICAgICAgICAgICAjIHNhdWYgd2Vlaw0KICAgICksDQogICAgc3RhdGlzdGljID0gbGlzdCgNCiAgICAgIGFsbF9jb250aW51b3VzKCkgfiBjKCJ7bWVhbn0gKHtzZH0pIiksDQogICAgICBEYXRlIH4gInttaW59LCB7bWF4fSIgICAgICAgICAgICAgIyBzZXVsZW1lbnQgbWluL21heCBwb3VyIHdlZWsNCiAgICApLA0KICAgIGxhYmVsID0gRGF0ZSB+ICJEYXRlIChtaW4sIG1heCkiDQogICklPiUNCiAgbW9kaWZ5X2Zvb3Rub3RlKGV2ZXJ5dGhpbmcoKSB+IE5BX2NoYXJhY3Rlcl8pDQpgYGANCg0KIyBGaW5hbCBEYXRhYmFzZQ0KIyMgRGFpbHkNCmBgYHtyfQ0KZGF0YV9hcnRlbWlzIDwtcGFuZWxfYXJ0ZW1pc190cmltbWVkJT4lDQogIGxlZnRfam9pbihjYmRjX2lkeF9kYWlseV9sYWJlbHMsIGJ5PWMoIkRhdGUiPSJkYXRlIikpJT4lDQogIG11dGF0ZShxdWFydGVyeWVhciA9IHBhc3RlMChxdWFydGVyKERhdGUpLCB5ZWFyKERhdGUpICkpJT4lDQogIGxlZnRfam9pbihHUFIsIGJ5PWMoIkRhdGUiPSJkYXRlIikpJT4lDQogIGxlZnRfam9pbih2aXhfZGF0YSwgYnk9YygiRGF0ZSI9ImRhdGUiKSklPiUNCiAgYXJyYW5nZShzdGFibGVjb2luLCBEYXRlKSU+JQ0KICBtdXRhdGUoRlRYID0gaWZlbHNlKERhdGUgPiBhcy5EYXRlKCIyMDIyLTExLTAxIiksMSwwICkpJT4lDQogIG11dGF0ZShMdW5hID0gaWZlbHNlKERhdGUgPiBhcy5EYXRlKCIyMDIyLTA1LTAxIiksMSwwICkpJT4lDQogIG11dGF0ZShwZWdUeXBlID0gY2FzZV93aGVuKA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFQifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkRBSSJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNFVVIifiAiRVVSIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gIkVVUiIsDQogICAgc3RhYmxlY29pbiA9PSAiRkRVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJQWVVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RlIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNER0xPIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkJVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0QwIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNVU0QifiAiVVNEIg0KICAgICkpJT4lDQogIG11dGF0ZShwZWdNZWNoYW5pc20gPSBjYXNlX3doZW4oDQogICAgc3RhYmxlY29pbiA9PSAiVVNEVCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTREMifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiREFJIn4gImNyeXB0byIsDQogICAgc3RhYmxlY29pbiA9PSAiY0VVUiJ+ICJhbGdvIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkZEVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEZSJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RHTE8ifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJCVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRDAifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJjVVNEIn4gImZpYXQiDQogICAgDQogICkpJT4lDQogICNtdXRhdGUoYWNyb3NzKC1EYXRlLCB+IHRpZHlyOjpyZXBsYWNlX25hKC54LCAwKSkpJT4lICMgcmVtb3ZlIHRoaXMgdG8gcmVwbGFjZSAwIHdpdGggTkEgd2hlbiB0aGVyZSdzIG5vIHNwZWVjaA0KICByZW5hbWVfd2l0aCh+IGdzdWIoIlxcLiIsICJfIiwgLngpKQ0KDQpgYGANCg0KIyMgV2Vla2x5DQoNCmBgYHtyfQ0KZGF0YV9hcnRlbWlzX3dlZWtseSA8LXBhbmVsX2FydGVtaXNfdHJpbW1lZF93ZWVrbHklPiUNCiAgbGVmdF9qb2luKGNiZGNfaWR4X3dlZWtseV9sYWJlbHMsIGJ5PWMoIndlZWsiPSJkYXRlX3dlZWsiKSklPiUNCiAgbXV0YXRlKHF1YXJ0ZXJ5ZWFyID0gcGFzdGUwKHF1YXJ0ZXIod2VlayksIHllYXIod2VlaykgKSklPiUNCiAgbGVmdF9qb2luKHZpeF9kYXRhX3dlZWtseSwgYnk9IndlZWsiKSU+JQ0KICBsZWZ0X2pvaW4oR1BSX2RhdGFfd2Vla2x5LCBieT0id2VlayIpJT4lDQogIGFycmFuZ2Uoc3RhYmxlY29pbiwgd2VlayklPiUNCiAgZHBseXI6OnNlbGVjdChzdGFibGVjb2luLCB3ZWVrLGV2ZXJ5dGhpbmcoKSklPiUNCiAgI25hLm9taXQoKSU+JQ0KICBtdXRhdGUoRlRYID0gaWZlbHNlKHdlZWsgPiBhcy5EYXRlKCIyMDIyLTExLTAxIiksMSwwICkpJT4lDQogIG11dGF0ZShMdW5hID0gaWZlbHNlKHdlZWsgPiBhcy5EYXRlKCIyMDIyLTA1LTAxIiksMSwwICkpJT4lDQogIGFycmFuZ2Uoc3RhYmxlY29pbiwgd2VlayklPiUNCiAgbXV0YXRlKGFjcm9zcygtc3RhYmxlY29pbiwgfiB0aWR5cjo6cmVwbGFjZV9uYSgueCwgMCkpKSU+JSMgcmVtb3ZlIHRoaXMgdG8gcmVwbGFjZSAwIHdpdGggTkEgd2hlbiB0aGVyZSdzIG5vIHNwZWVjaA0KICByZW5hbWVfd2l0aCh+IGdzdWIoIlxcLiIsICJfIiwgLngpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmZ1bGxfd2Vla3MgPC0gc2VxKA0KICBmcm9tID0gbWluKGRhdGFfYXJ0ZW1pc193ZWVrbHkkd2VlaywgbmEucm0gPSBUUlVFKSwNCiAgdG8gICA9IG1heChkYXRhX2FydGVtaXNfd2Vla2x5JHdlZWssIG5hLnJtID0gVFJVRSksDQogIGJ5ICAgPSAid2VlayINCikNCg0KIyBQYW5lbCDDqXF1aWxpYnLDqSBzdGFibGVjb2luIMOXIHdlZWsNCnBhbmVsX2JhbGFuY2VkIDwtIGV4cGFuZF9ncmlkKA0KICBzdGFibGVjb2luID0gdW5pcXVlKGRhdGFfYXJ0ZW1pc193ZWVrbHkkc3RhYmxlY29pbiksDQogIHdlZWsgICAgICAgPSBmdWxsX3dlZWtzDQopDQoNCiMgT24gcmF0dGFjaGUgdG91dGVzIGxlcyB2YXJpYWJsZXMgZXhpc3RhbnRlcw0KZGF0YV9hcnRlbWlzX2JhbGFuY2VkIDwtIHBhbmVsX2JhbGFuY2VkICU+JQ0KICBsZWZ0X2pvaW4oZGF0YV9hcnRlbWlzX3dlZWtseSwgYnkgPSBjKCJzdGFibGVjb2luIiwgIndlZWsiKSklPiUNCiAgbXV0YXRlKGluZGV4X3NlbnRfZ2xvYmFsID0gaWZlbHNlKGluZGV4X3NlbnRfZ2xvYmFsID09ICJOYU4iLCBOQSwgaW5kZXhfc2VudF9nbG9iYWwpKSU+JQ0KICBtdXRhdGUod2VlazEgPSBmbG9vcl9kYXRlKHdlZWssICJ3ZWVrIiwgd2Vla19zdGFydCA9IDEpKSU+JQ0KICBtdXRhdGUoDQogICAgaXNvX3llYXIgPSBpc295ZWFyKHdlZWsxKSwNCiAgICBpc29fd2VlayA9IGlzb3dlZWsod2VlazEpLA0KICAgIHllYXJfd2VlayA9IHNwcmludGYoIiVkdyUwMmQiLCBpc29feWVhciwgaXNvX3dlZWspICAjIGV4IDogIjIwMjN3MDEiDQogICklPiUNCiAgc2VsZWN0KHN0YWJsZWNvaW4sIHllYXJfd2VlaywgZXZlcnl0aGluZygpKSU+JSBzZWxlY3QoLWMod2VlazEsIGlzb195ZWFyLCBpc29fd2VlaykpJT4lDQogIG11dGF0ZShwZWdUeXBlID0gY2FzZV93aGVuKA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFQifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkRBSSJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNFVVIifiAiRVVSIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gIkVVUiIsDQogICAgc3RhYmxlY29pbiA9PSAiRkRVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJQWVVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RlIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNER0xPIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkJVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0QwIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNVU0QifiAiVVNEIg0KICAgICkpJT4lDQogIG11dGF0ZShwZWdNZWNoYW5pc20gPSBjYXNlX3doZW4oDQogICAgc3RhYmxlY29pbiA9PSAiVVNEVCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTREMifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiREFJIn4gImNyeXB0byIsDQogICAgc3RhYmxlY29pbiA9PSAiY0VVUiJ+ICJhbGdvIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkZEVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEZSJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RHTE8ifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJCVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRDAifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJjVVNEIn4gImZpYXQiDQogICAgDQogICkpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGhhdmVuKQ0KI2hhdmVuOjp3cml0ZV9kdGEoZGF0YV9hcnRlbWlzLCAiQzovdXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1L2RhdGFfYXJ0ZW1pcy5kdGEiKQ0KaGF2ZW46OndyaXRlX2R0YShkYXRhX2FydGVtaXNfYmFsYW5jZWQsICJDOi91c2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvZGF0YV9hcnRlbWlzX3dlZWtseS5kdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9hcnRlbWlzX2JhbGFuY2VkICU+JQ0KICBjb3VudChzdGFibGVjb2luLCB5ZWFyX3dlZWspICU+JQ0KICBmaWx0ZXIobiA+IDEpDQpgYGANCg0KDQojIExvY2FsIFByb2plY3Rpb25zDQoNCiQkDQpZX3tpLHQraH0tWV97aSx0LTF9PSBcYWxwaGFfaSsgXGFscGhhX3EgKyBcYmV0YV5oIFxEZWx0YSBYX3QgKyBcZ2FtbWEgWl90ICsgXG11X3tpLHR9DQokJA0KV2hlcmUgJFkkIGlzIHRoZSBsb2ctZGlmZmVyZW5jZSBvZiBzdGFibGVjb2luIHN1cHBseSwgJFxhbHBoYV9pJCBpcyBhbiBpbmRpdmlkdWFsIEZFLCBhbmQgJFhfdCQgaXMgb3VyIGluZGV4IG9mIHNwZWVjaCBDQkRDLXJlbGF0ZWQgc2VudGltZW50L3N0YW5jZS4gJFpfdCQgYXJlIGNvbnRyb2wgdmFyaWFibGVzIHJlcHJlc2VudGluZyB0aGUgVklYIGFuZCB0aGUgR1BSRCBhbmQgdGhlaXIgbGFncywgYW5kIGR1bW1pZXMgcmVwcmVzZW50aW5nIFRlcnJhLUx1bmEgYW5kIEZUWCBjcmFzaGVzLiBXZSBpbmNsdWRlIGluZGl2aWR1YWwgKCRcYWxwaGFfaSQpIGFuZCBxdWFydGVyLXllYXIgKCRcYWxwaGFfcSQpIGZpeGVkLWVmZmVjdHMuICANCk5vdGUgOiB3ZSB0YWtlIHRoZSA5MCUgaW50ZXJ2YWwgY29uZmlkZW5jZXMgZm9yIGFsbCBlc3RpbWF0aW9ucy4gU3RhbmRhcmQgZXJyb3JzIGFyZSBoZXRlcm9za2VkYXN0aWNpdHkgcm9idXN0cyAoY2x1c3Rlcml6ZWQgYnkgc3RhYmxlY29pbikuIERhdGEgYXJlIGluIHdlZWtseSBmcmVxdWVuY2llcy4NCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdGlkeV9scF9wYW5lbCA8LSBmdW5jdGlvbihyZXMsIG1vZGVsX25hbWUgPSAibW9kZWwiKSB7DQogICMgbWF0cmljZXMgMSB4IEgsIGNvbG9ubmVzID0gaG9yaXpvbnMNCiAgaXJmX21lYW4gPC0gYXMubnVtZXJpYyhyZXMkaXJmX3BhbmVsX21lYW5bMSwgXSkNCiAgaXJmX2xvdyAgPC0gYXMubnVtZXJpYyhyZXMkaXJmX3BhbmVsX2xvd1sxLCBdKQ0KICBpcmZfdXAgICA8LSBhcy5udW1lcmljKHJlcyRpcmZfcGFuZWxfdXBbMSwgXSkNCg0KICB0aWJibGUoDQogICAgbW9kZWwgICA9IG1vZGVsX25hbWUsDQogICAgaG9yaXpvbiA9IHNlcV9hbG9uZyhpcmZfbWVhbikgLSAxLCAgIyAwLDEsLi4uLEgtMSBjb21tZSBkYW5zIHBsb3QubHBpcmZzDQogICAgaXJmICAgICA9IGlyZl9tZWFuLA0KICAgIGxvdyAgICAgPSBpcmZfbG93LA0KICAgIHVwICAgICAgPSBpcmZfdXANCiAgKQ0KfQ0KYGBgDQoNCg0KIyMgQmFzZWxpbmUgcmVzdWx0cw0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpyZXF1aXJlKGxwaXJmcykNCmhvciA9IDE1DQpjb25maW50ID0gMS42NQ0KdmNvdiA9ICJ2Y292SEMiDQogDQpyZXN1bHRzX2FydGVtaXNfYXVlcl93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfYmFsYW5jZWQlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic3RhbmNlX2F1ZXIiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZGlmZl9zaG9jayA9IEYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAiTHVuYSIsICJGVFgiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQpyZXN1bHRzX2FydGVtaXNfZ2xvYmFsX3NlbnRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoImluZGV4X3NlbnRfZ2xvYmFsIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQoNCnJlc3VsdHNfYXJ0ZW1pc19nbG9iYWxfc3RhbmNlX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc19iYWxhbmNlZCU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3RhYmxlY29pbiwgd2VlaywgZXZlcnl0aGluZygpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJpbmRleF9zdGFuY2VfZ2xvYmFsIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPWNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCnJlc3VsdHNfYXJ0ZW1pc19nZW5lcmFsX3NlbnRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfR2VuZXJhbF9VbnNwZWNpZmllZCIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9dmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQpyZXN1bHRzX2FydGVtaXNfZ2VuZXJhbF9zdGFuY2VfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9HZW5lcmFsX1Vuc3BlY2lmaWVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCnJlc3VsdHNfYXJ0ZW1pc19yZXRhaWxfc2VudF93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfYmFsYW5jZWQlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9SZXRhaWxfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJMdW5hIiwgIkZUWCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3JldGFpbF9zdGFuY2VfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9SZXRhaWxfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJMdW5hIiwgIkZUWCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQpyZXN1bHRzX2FydGVtaXNfd2hvbGVzYWxlX3NlbnRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfV2hvbGVzYWxlX0NCREMiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAiTHVuYSIsICJGVFgiKSwgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3dob2xlc2FsZV9zdGFuY2VfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX2JhbGFuY2VkJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9XaG9sZXNhbGVfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJMdW5hIiwgIkZUWCIpLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KYGBgDQoNCg0KDQoNCklSRnMgDQpFZmZlY3Qgb2Ygc2VudGltZW50L3N0YW5jZSBzaG9ja3Mgb24gdGhlIGxvZy1kaWZmZXJlbmNlIHN1cHBseSAoZnJvbSBBcnRlbWlzLnh5eikuDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KDQptb2RlbHMgPC0gbGlzdCgNCiAgIkF1ZXIiICAgICAgICAgICAgICA9IHJlc3VsdHNfYXJ0ZW1pc19hdWVyX3csDQogICJHbG9iYWwgc2VudGltZW50IiAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX2dsb2JhbF9zZW50X3csDQogICJHbG9iYWwgc3RhbmNlIiAgICAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX2dsb2JhbF9zdGFuY2VfdywNCiAgIkdlbmVyYWwgc2VudGltZW50IiAgICAgICAgICAgPSByZXN1bHRzX2FydGVtaXNfZ2VuZXJhbF9zZW50X3csDQogICJHZW5lcmFsIHN0YW5jZSIgICAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX2dlbmVyYWxfc3RhbmNlX3csDQogICJSZXRhaWwgc2VudGltZW50IiAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX3JldGFpbF9zZW50X3csDQogICJSZXRhaWwgc3RhbmNlIiAgICAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX3JldGFpbF9zdGFuY2VfdywNCiAgIldob2xlc2FsZSBzZW50aW1lbnQiICAgICAgICAgPSByZXN1bHRzX2FydGVtaXNfd2hvbGVzYWxlX3NlbnRfdywNCiAgIldob2xlc2FsZSBzdGFuY2UiICAgICAgICAgICAgPSByZXN1bHRzX2FydGVtaXNfd2hvbGVzYWxlX3N0YW5jZV93DQopDQoNCmlyZnNfYWxsIDwtIGltYXBfZGZyKG1vZGVscywgfiB0aWR5X2xwX3BhbmVsKC54LCAueSkpICU+JQ0KICBtdXRhdGUoDQogICAgdHlwZSA9IGNhc2Vfd2hlbigNCiAgICAgIHN0cl9kZXRlY3QobW9kZWwsIHJlZ2V4KCJzZW50aW1lbnQiLCBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJTZW50aW1lbnQiLA0KICAgICAgc3RyX2RldGVjdChtb2RlbCwgcmVnZXgoInN0YW5jZSIsICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIlN0YW5jZSIsDQogICAgICBUUlVFIH4gIkF1ZXIiDQogICAgKQ0KICApDQoNCmNvbHNfdHlwZSA8LSBjKA0KICAiU2VudGltZW50IiA9ICIjMWY3N2I0IiwgICMgYmxldQ0KICAiU3RhbmNlIiAgICA9ICIjZDYyNzI4IiwgICMgcm91Z2UNCiAgIkF1ZXIiICAgICA9ICIjZDk1ZjAyIiAgICMgYXUgY2FzIG/DuSAoQXVlciBzZW50aW1lbnQgc2V1bCwgZXRjLikNCikNCg0KbWFrZV9pcmZfcGxvdCA8LSBmdW5jdGlvbihkYXRhLCB0aXRsZSA9IE5VTEwpIHsNCiAgZ2dwbG90KA0KICAgIGRhdGEsDQogICAgYWVzKA0KICAgICAgeCA9IGhvcml6b24sIHkgPSBpcmYsDQogICAgICB5bWluID0gbG93LCB5bWF4ID0gdXAsDQogICAgICBjb2xvciA9IHR5cGUsIGZpbGwgPSB0eXBlDQogICAgKQ0KICApICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogICAgZ2VvbV9yaWJib24oYWxwaGEgPSAwLjMsIGNvbG9yID0gTkEpICsNCiAgICBnZW9tX2xpbmUobGluZXdpZHRoID0gMC43KSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIGxhYnMoDQogICAgICB4ID0gIkhvcml6b24gKHdlZWtzKSIsDQogICAgICB5ID0gIlJlc3BvbnNlIG9mIFN1cHBseSAoZGxvZykiLA0KICAgICAgY29sb3IgPSBOVUxMLCBmaWxsID0gTlVMTCwNCiAgICAgIHRpdGxlID0gdGl0bGUNCiAgICApICsNCiAgICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQogICAgdGhlbWUoDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpDQogICAgKQ0KfQ0KDQpHbG9iYWxfcGxvdCA8LSBpcmZzX2FsbCAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobW9kZWwsICJeR2xvYmFsIikpICU+JQ0KICBtYWtlX2lyZl9wbG90KCJFZmZlY3Qgb2YgaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSIpDQoNCkdlbmVyYWxfcGxvdCA8LSBpcmZzX2FsbCAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobW9kZWwsICJeR2VuZXJhbCIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIEdlbmVyYWwvVW5zcGVjaWZpZWQgc2VudGltZW50L3N0YW5jZSIpDQoNClJldGFpbF9wbG90IDwtIGlyZnNfYWxsICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIl5SZXRhaWwiKSkgJT4lDQogIG1ha2VfaXJmX3Bsb3QoIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBSZXRhaWwgc2VudGltZW50L3N0YW5jZSIpDQoNCldob2xlc2FsZV9wbG90IDwtIGlyZnNfYWxsICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIl5XaG9sZXNhbGUiKSkgJT4lDQogIG1ha2VfaXJmX3Bsb3QoIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBXaG9sZXNhbGUgc2VudGltZW50L3N0YW5jZSIpDQoNCkF1ZXJfcGxvdCA8LSBpcmZzX2FsbCAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobW9kZWwsICJeQXVlciIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIEF1ZXIgKDIwMjEpIHNlbnRpbWVudCAiKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCkF1ZXJfcGxvdA0KR2xvYmFsX3Bsb3QNCkdlbmVyYWxfcGxvdA0KUmV0YWlsX3Bsb3QNCldob2xlc2FsZV9wbG90DQpgYGANCg0KDQoNCiMjIERldmVsb3BlZCBWZXJzdXMgRW1lcmdpbmcgQ2VudHJhbCBCYW5rcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnJlc3VsdHNfYXJ0ZW1pc19zZW50X2Rldl93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfRGV2ZWxvcGVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQpyZXN1bHRzX2FydGVtaXNfc2VudF9lbWVfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzZW50X0VtZXJnaW5nIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCiMjIw0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9kZXZfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRGV2ZWxvcGVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9lbWVfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRW1lcmdpbmciICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQoNCg0KbW9kZWxzX2RldmVtZSA8LSBsaXN0KA0KICAiR2xvYmFsIHNlbnRpbWVudCBEZXZlbG9wZWQiICAgICAgICAgICAgPSByZXN1bHRzX2FydGVtaXNfc2VudF9kZXZfdywNCiAgIkdsb2JhbCBzdGFuY2UgRGV2ZWxvcGVkIiAgICAgICAgICAgICAgID0gcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9kZXZfdywNCiAgICAiR2xvYmFsIHNlbnRpbWVudCBFbWVyZ2luZyIgICAgICAgICAgICA9IHJlc3VsdHNfYXJ0ZW1pc19zZW50X2VtZV93LA0KICAiR2xvYmFsIHN0YW5jZSBFbWVyZ2luZyIgICAgICAgICAgICAgICA9IHJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZW1lX3cNCikNCg0KaXJmc19kZXZlbWUgPC0gaW1hcF9kZnIobW9kZWxzX2RldmVtZSwgfiB0aWR5X2xwX3BhbmVsKC54LCAueSkpICU+JQ0KICBtdXRhdGUoDQogICAgdHlwZSA9IGNhc2Vfd2hlbigNCiAgICAgIHN0cl9kZXRlY3QobW9kZWwsIHJlZ2V4KCJzZW50aW1lbnQiLCBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJTZW50aW1lbnQiLA0KICAgICAgc3RyX2RldGVjdChtb2RlbCwgcmVnZXgoInN0YW5jZSIsICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIlN0YW5jZSIsDQogICAgICBUUlVFIH4gIkF1ZXIiDQogICAgKQ0KICApDQoNCkRldmVsb3BlZF9QbG90IDwtIGlyZnNfZGV2ZW1lICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIkRldmVsb3BlZCIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2UgaW4gRGV2ZWxvcGVkIE1hcmtldHMiKQ0KDQpFbWVyZ2luZ19QbG90IDwtIGlyZnNfZGV2ZW1lICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIkVtZXJnaW5nIikpICU+JQ0KICBtYWtlX2lyZl9wbG90KCJFZmZlY3Qgb2YgaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSBpbiBFbWVyZ2luZyBNYXJrZXRzIikNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KRGV2ZWxvcGVkX1Bsb3QNCkVtZXJnaW5nX1Bsb3QNCmBgYA0KDQojIyBFQ0IsIEZlZCBhbmQgT3RoZXINCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9lY2JfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRUNCIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3NlbnRfZWNiX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9FQ0IiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCmNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9mZWRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRmVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQpyZXN1bHRzX2FydGVtaXNfc2VudF9mZWRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzZW50X0ZlZCIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQpyZXN1bHRzX2FydGVtaXNfc3RhbmNlX290aF93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9PdGhlciIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3NlbnRfb3RoX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9PdGhlciIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQptb2RlbHNfZWNiZmVkIDwtIGxpc3QoDQogICJTZW50aW1lbnQgRUNCIiA9IHJlc3VsdHNfYXJ0ZW1pc19zZW50X2VjYl93LCANCiAgIlNlbnRpbWVudCBGZWQiID0gcmVzdWx0c19hcnRlbWlzX3NlbnRfZmVkX3csIA0KICAiU2VudGltZW50IG90aGVyIiA9IHJlc3VsdHNfYXJ0ZW1pc19zZW50X290aF93LCANCiAgDQogICJTdGFuY2UgRUNCIiA9IHJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZWNiX3csIA0KICAiU3RhbmNlIEZlZCIgPSByZXN1bHRzX2FydGVtaXNfc3RhbmNlX2ZlZF93LCANCiAgIlN0YW5jZSBvdGhlciIgPSByZXN1bHRzX2FydGVtaXNfc3RhbmNlX290aF93DQogIA0KKQ0KDQppcmZzX2VjYmZlZDwtIGltYXBfZGZyKG1vZGVsc19lY2JmZWQsIH4gdGlkeV9scF9wYW5lbCgueCwgLnkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIHR5cGUgPSBjYXNlX3doZW4oDQogICAgICBzdHJfZGV0ZWN0KG1vZGVsLCByZWdleCgic2VudGltZW50IiwgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiU2VudGltZW50IiwNCiAgICAgIHN0cl9kZXRlY3QobW9kZWwsIHJlZ2V4KCJzdGFuY2UiLCAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJTdGFuY2UiLA0KICAgICAgVFJVRSB+ICJBdWVyIg0KICAgICkNCiAgKQ0KDQoNCkVDQl9QbG90IDwtIGlyZnNfZWNiZmVkICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIkVDQiIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2UgaW4gRUNCIENvbW11bmljYXRpb24iKQ0KDQpGRURfUGxvdCA8LSBpcmZzX2VjYmZlZCAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobW9kZWwsICJGZWQiKSkgJT4lDQogIG1ha2VfaXJmX3Bsb3QoIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIGluIEZlZCBDb21tdW5pY2F0aW9uIikNCg0KT3RoZXJfUGxvdCA8LSBpcmZzX2VjYmZlZCAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QobW9kZWwsICJvdGhlciIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2UgaW4gT3RoZXIgQ0IgQ29tbXVuaWNhdGlvbiIpDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KRUNCX1Bsb3QNCkZFRF9QbG90DQpPdGhlcl9QbG90DQpgYGANCg0KDQojIyBFZmZlY3Qgb24gZmlhdCBjdXJyZW5jeQ0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQplY2JfZXVyX3NlbnQgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiVmaWx0ZXIoc3RhYmxlY29pbiVpbiUgYygiRVVSQyIsImNFVVIiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9FQ0IiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KZWNiX2V1cl9zdGFuY2UgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiVmaWx0ZXIoc3RhYmxlY29pbiVpbiUgYygiRVVSQyIsImNFVVIiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic3RhbmNlX0VDQiIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KZWNiX3VzZF9zZW50IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5JT4lZmlsdGVyKCFzdGFibGVjb2luICVpbiUgYygiRVVSQyIsImNFVVIiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9FQ0IiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KZWNiX3VzZF9zdGFuY2UgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiVmaWx0ZXIoIXN0YWJsZWNvaW4gJWluJSBjKCJFVVJDIiwiY0VVUiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRUNCIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQoNCg0KZmVkX3VzZF9zZW50IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5JT4lZmlsdGVyKCFzdGFibGVjb2luICVpbiUgYygiRVVSQyIsImNFVVIiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9GZWQiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KZmVkX3VzZF9zdGFuY2UgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiVmaWx0ZXIoIXN0YWJsZWNvaW4gJWluJSBjKCJFVVJDIiwiY0VVUiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRmVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQoNCg0KbW9kZWxzX2VjYiA8LSBsaXN0KA0KICAiU2VudGltZW50IEVDQiBFdXJvIiA9IGVjYl9ldXJfc2VudCwgDQogICJTdGFuY2UgRUNCIEV1cm8iID0gZWNiX2V1cl9zdGFuY2UsIA0KICANCiAgIlNlbnRpbWVudCBFQ0IgVVNEIiA9IGVjYl91c2Rfc2VudCwgDQogICJTdGFuY2UgRUNCIFVTRCIgPSBlY2JfdXNkX3N0YW5jZSwgIA0KICANCiAgIlNlbnRpbWVudCBGZWQgVVNEIiA9IGZlZF91c2Rfc2VudCwgDQogICJTdGFuY2UgRmVkIFVTRCIgPSBmZWRfdXNkX3N0YW5jZQ0KKQ0KDQppcmZzX2VjYjwtIGltYXBfZGZyKG1vZGVsc19lY2IsIH4gdGlkeV9scF9wYW5lbCgueCwgLnkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIHR5cGUgPSBjYXNlX3doZW4oDQogICAgICBzdHJfZGV0ZWN0KG1vZGVsLCByZWdleCgic2VudGltZW50IiwgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiU2VudGltZW50IiwNCiAgICAgIHN0cl9kZXRlY3QobW9kZWwsIHJlZ2V4KCJzdGFuY2UiLCAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJTdGFuY2UiLA0KICAgICAgVFJVRSB+ICJBdWVyIg0KICAgICkNCiAgKQ0KDQpFQ0JfRXVyb19QbG90IDwtIGlyZnNfZWNiICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIkVDQiBFdXJvIikpICU+JQ0KICBtYWtlX2lyZl9wbG90KCJFZmZlY3Qgb2YgaW5jcmVhc2UgaW4gc2VudGltZW50L3N0YW5jZSBvZiBFQ0Igb24gRVVSLWRlbm9taW5hdGVkIHN0YWJsZWNvaW5zIikNCg0KRUNCX1VTRF9QbG90IDwtIGlyZnNfZWNiICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChtb2RlbCwgIkVDQiBVU0QiKSkgJT4lDQogIG1ha2VfaXJmX3Bsb3QoIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIG9mIEVDQiBvbiBVU0QtZGVub21pbmF0ZWQgc3RhYmxlY29pbnMiKQ0KDQpGZWRfVVNEX1Bsb3QgPC0gaXJmc19lY2IgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KG1vZGVsLCAiRmVkIFVTRCIpKSAlPiUNCiAgbWFrZV9pcmZfcGxvdCgiRWZmZWN0IG9mIGluY3JlYXNlIGluIHNlbnRpbWVudC9zdGFuY2Ugb2YgRmVkIG9uIFVTRC1kZW5vbWluYXRlZCBzdGFibGVjb2lucyIpDQoNCg0KDQpgYGANCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KRUNCX0V1cm9fUGxvdA0KRUNCX1VTRF9QbG90DQpGZWRfVVNEX1Bsb3QNCmBgYA0KDQoNCg0KDQoNCiMgbWFudWFsIGxvY2FsIHByb2ogd2l0aCBmaXhlc3QNCg0KVG8gdmVyaWZ5IHRoZSByb2J1c3RuZXNzIG9mIG91ciByZXN1bHRzIG9idGFpbmVkIHdpdGggYGxwaXJmc2AgUiBwYWNrYWdlLCB3ZSBydW4gdGhlIGxvY2FsLXByb2plY3Rpb25zIGJ5IGhhbmQgd2l0aCBgZml4ZXN0YCB3aXRoIHRoZSBleGFjdCBzYW1lIG1vZGVsLiBUaGlzIHdheSwgd2UgY2FuIGNsdXN0ZXJpemUgb3VyIHJlc3VsdHMgYnkgc3RhYmxlY29pbiBhbmQgd2VlayA6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KaCA8LSAxNQ0KDQpscF9tYW5fYXVlciA8LSBmZW9scygNCiAgZihkbG9nX3N1cHBseSwgMDpoKS0gbChkbG9nX3N1cHBseSwxKSB+IGQoc3RhbmNlX2F1ZXIsMSkgKyAgbChHUFJELDA6MSkrbChWSVhfY2xvc2UsIDA6MSkrTHVuYStGVFggfCBzdGFibGVjb2luLA0KICBkYXRhID0gZGF0YV9hcnRlbWlzX3dlZWtseSwgcGFuZWwuaWQ9Yygic3RhYmxlY29pbiIsICJ3ZWVrIikNCikNCg0KbHBfbWFuX2dsb2JzZW50IDwtIGZlb2xzKA0KICBmKGRsb2dfc3VwcGx5LCAwOmgpLSBsKGRsb2dfc3VwcGx5LDEpIH4gZChpbmRleF9zZW50X2dsb2JhbCwxKSArICBsKEdQUkQsMDoxKStsKFZJWF9jbG9zZSwgMDoxKStMdW5hK0ZUWCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXNfd2Vla2x5LCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgIndlZWsiKQ0KKQ0KDQpscF9tYW5fZ2xvYnN0YW5jZSA8LSBmZW9scygNCiAgZihkbG9nX3N1cHBseSwgMDpoKS0gbChkbG9nX3N1cHBseSwxKSB+IGQoaW5kZXhfc3RhbmNlX2dsb2JhbCwxKSArICBsKEdQUkQsMDoxKStsKFZJWF9jbG9zZSwgMDoxKStMdW5hK0ZUWCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXNfd2Vla2x5LCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgIndlZWsiKQ0KKQ0KDQpscF9tYW5fZ2Vuc2VudCA8LSBmZW9scygNCiAgZihkbG9nX3N1cHBseSwgMDpoKS0gbChkbG9nX3N1cHBseSwxKSB+IGQoc2VudF9HZW5lcmFsX1Vuc3BlY2lmaWVkLDEpICsgIGwoR1BSRCwwOjEpK2woVklYX2Nsb3NlLCAwOjEpK0x1bmErRlRYIHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pc193ZWVrbHksIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAid2VlayIpDQopDQoNCmxwX21hbl9nZW5zdGFuY2UgPC0gZmVvbHMoDQogIGYoZGxvZ19zdXBwbHksIDA6aCktIGwoZGxvZ19zdXBwbHksMSkgfiBkKHN0YW5jZV9HZW5lcmFsX1Vuc3BlY2lmaWVkLDEpICsgIGwoR1BSRCwwOjEpK2woVklYX2Nsb3NlLCAwOjEpK0x1bmErRlRYIHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pc193ZWVrbHksIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAid2VlayIpDQopDQoNCmxwX21hbl9yZXRzZW50IDwtIGZlb2xzKA0KICBmKGRsb2dfc3VwcGx5LCAwOmgpLSBsKGRsb2dfc3VwcGx5LDEpIH4gZChzZW50X1JldGFpbF9DQkRDLDEpICsgIGwoR1BSRCwwOjEpK2woVklYX2Nsb3NlLCAwOjEpK0x1bmErRlRYIHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pc193ZWVrbHksIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAid2VlayIpDQopDQoNCmxwX21hbl9yZXRzdGFuY2UgPC0gZmVvbHMoDQogIGYoZGxvZ19zdXBwbHksIDA6aCktIGwoZGxvZ19zdXBwbHksMSkgfiBkKHN0YW5jZV9SZXRhaWxfQ0JEQywxKSArICBsKEdQUkQsMDoxKStsKFZJWF9jbG9zZSwgMDoxKStMdW5hK0ZUWCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXNfd2Vla2x5LCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgIndlZWsiKQ0KKQ0KDQoNCmxwX21hbl93aG9fc2VudCA8LSBmZW9scygNCiAgZihkbG9nX3N1cHBseSwgMDpoKS0gbChkbG9nX3N1cHBseSwxKSB+IGQoc2VudF9XaG9sZXNhbGVfQ0JEQywxKSArICBsKEdQUkQsMDoxKStsKFZJWF9jbG9zZSwgMDoxKStMdW5hK0ZUWCB8IHN0YWJsZWNvaW4sDQogIGRhdGEgPSBkYXRhX2FydGVtaXNfd2Vla2x5LCBwYW5lbC5pZD1jKCJzdGFibGVjb2luIiwgIndlZWsiKQ0KKQ0KDQpscF9tYW5fd2hvX3N0YW5jZSA8LSBmZW9scygNCiAgZihkbG9nX3N1cHBseSwgMDpoKS0gbChkbG9nX3N1cHBseSwxKSB+IGQoc3RhbmNlX1dob2xlc2FsZV9DQkRDLDEpICsgIGwoR1BSRCwwOjEpK2woVklYX2Nsb3NlLCAwOjEpK0x1bmErRlRYIHwgc3RhYmxlY29pbiwNCiAgZGF0YSA9IGRhdGFfYXJ0ZW1pc193ZWVrbHksIHBhbmVsLmlkPWMoInN0YWJsZWNvaW4iLCAid2VlayIpDQopDQoNCiNldGFibGUobHBfbWFuX3dob19zZW50LCB2Y292ID0gfnN0YWJsZWNvaW4rd2VlaykNCiNldGFibGUobHBfbWFuX3dob19zdGFuY2UsIHZjb3YgPSB+c3RhYmxlY29pbit3ZWVrKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpyZXF1aXJlKGJyb29tKQ0Kc2hvY2tfdmFyIDwtIGMoImQoc3RhbmNlX2F1ZXIsIDEpIiwgImQoaW5kZXhfc3RhbmNlX2dsb2JhbCwgMSkiLCAiZChpbmRleF9zZW50X2dsb2JhbCwgMSkiLCAiZChzZW50X1JldGFpbF9DQkRDLCAxKSIsICJkKHNlbnRfR2VuZXJhbF9VbnNwZWNpZmllZCwgMSkiICwgImQoc2VudF9XaG9sZXNhbGVfQ0JEQywgMSkiLCAiZChzdGFuY2VfV2hvbGVzYWxlX0NCREMsIDEpIiwgImQoc3RhbmNlX1JldGFpbF9DQkRDLCAxKSIgLCAiZChzdGFuY2VfR2VuZXJhbF9VbnNwZWNpZmllZCwgMSkiICAgICAgICAgICAgICAgKQ0KDQppcmZfZGZfYXVlciA8LSBtYXAyX2RmcigNCiAgbHBfbWFuX2F1ZXIsICAgICAgICAgICAgICAgICAgIyBjaGFxdWUgc291cy1tb2TDqGxlDQogIDA6aCwgICAgICAgICAgICAgICAgICAgICAgIyBob3Jpem9ucyBjb3JyZXNwb25kYW50cw0KICB+IHsNCiAgICAjIHRpZHkgYXZlYyBJQyByb2J1c3RlcyBIQzENCiAgICB0dCA8LSB0aWR5KC54LCBjb25mLmludCA9IFRSVUUsIHZjb3YgPSB+c3RhYmxlY29pbit3ZWVrKQ0KICAgIA0KICAgIHR0ICU+JQ0KICAgICAgZmlsdGVyKHRlcm0gJWluJSBzaG9ja192YXIpICU+JQ0KICAgICAgdHJhbnNtdXRlKA0KICAgICAgICBoICAgPSAueSwNCiAgICAgICAgaXJmID0gZXN0aW1hdGUsDQogICAgICAgIGxvdyA9IGNvbmYubG93LA0KICAgICAgICB1cCAgPSBjb25mLmhpZ2gsIA0KICAgICAgICB0ZXJtPXRlcm0NCiAgICAgICkNCiAgfQ0KKQ0KDQppcmZfZGZfZ2xvYl9zZW50PC0gbWFwMl9kZnIoDQogIGxwX21hbl9nbG9ic2VudCwgICAgICAgICAgICAgICAgICAjIGNoYXF1ZSBzb3VzLW1vZMOobGUNCiAgMDpoLCAgICAgICAgICAgICAgICAgICAgICAjIGhvcml6b25zIGNvcnJlc3BvbmRhbnRzDQogIH4gew0KICAgICMgdGlkeSBhdmVjIElDIHJvYnVzdGVzIEhDMQ0KICAgIHR0IDwtIHRpZHkoLngsIGNvbmYuaW50ID0gVFJVRSwgdmNvdiA9IH5zdGFibGVjb2luK3dlZWspDQogICAgDQogICAgdHQgJT4lDQogICAgICBmaWx0ZXIodGVybSAlaW4lIHNob2NrX3ZhcikgJT4lDQogICAgICB0cmFuc211dGUoDQogICAgICAgIGggICA9IC55LA0KICAgICAgICBpcmYgPSBlc3RpbWF0ZSwNCiAgICAgICAgbG93ID0gY29uZi5sb3csDQogICAgICAgIHVwICA9IGNvbmYuaGlnaCwgDQogICAgICAgIHRlcm09dGVybQ0KICAgICAgKQ0KICB9DQopDQppcmZfZGZfZ2xvYl9zdGFuY2U8LSBtYXAyX2RmcigNCiAgbHBfbWFuX2dsb2JzdGFuY2UsICAgICAgICAgICAgICAgICAgIyBjaGFxdWUgc291cy1tb2TDqGxlDQogIDA6aCwgICAgICAgICAgICAgICAgICAgICAgIyBob3Jpem9ucyBjb3JyZXNwb25kYW50cw0KICB+IHsNCiAgICAjIHRpZHkgYXZlYyBJQyByb2J1c3RlcyBIQzENCiAgICB0dCA8LSB0aWR5KC54LCBjb25mLmludCA9IFRSVUUsIHZjb3YgPSB+c3RhYmxlY29pbit3ZWVrKQ0KICAgIA0KICAgIHR0ICU+JQ0KICAgICAgZmlsdGVyKHRlcm0gJWluJSBzaG9ja192YXIpICU+JQ0KICAgICAgdHJhbnNtdXRlKA0KICAgICAgICBoICAgPSAueSwNCiAgICAgICAgaXJmID0gZXN0aW1hdGUsDQogICAgICAgIGxvdyA9IGNvbmYubG93LA0KICAgICAgICB1cCAgPSBjb25mLmhpZ2gsIA0KICAgICAgICB0ZXJtPXRlcm0NCiAgICAgICkNCiAgfQ0KKQ0KDQppcmZfZGZfZ2VuX3NlbnQ8LSBtYXAyX2RmcigNCiAgbHBfbWFuX2dlbnNlbnQsICAgICAgICAgICAgICAgICAgIyBjaGFxdWUgc291cy1tb2TDqGxlDQogIDA6aCwgICAgICAgICAgICAgICAgICAgICAgIyBob3Jpem9ucyBjb3JyZXNwb25kYW50cw0KICB+IHsNCiAgICAjIHRpZHkgYXZlYyBJQyByb2J1c3RlcyBIQzENCiAgICB0dCA8LSB0aWR5KC54LCBjb25mLmludCA9IFRSVUUsIHZjb3YgPSB+c3RhYmxlY29pbit3ZWVrKQ0KICAgIA0KICAgIHR0ICU+JQ0KICAgICAgZmlsdGVyKHRlcm0gJWluJSBzaG9ja192YXIpICU+JQ0KICAgICAgdHJhbnNtdXRlKA0KICAgICAgICBoICAgPSAueSwNCiAgICAgICAgaXJmID0gZXN0aW1hdGUsDQogICAgICAgIGxvdyA9IGNvbmYubG93LA0KICAgICAgICB1cCAgPSBjb25mLmhpZ2gsIA0KICAgICAgICB0ZXJtPXRlcm0NCiAgICAgICkNCiAgfQ0KKQ0KaXJmX2RmX2dlbl9zdGFuY2U8LSBtYXAyX2RmcigNCiAgbHBfbWFuX2dlbnN0YW5jZSwgICAgICAgICAgICAgICAgICAjIGNoYXF1ZSBzb3VzLW1vZMOobGUNCiAgMDpoLCAgICAgICAgICAgICAgICAgICAgICAjIGhvcml6b25zIGNvcnJlc3BvbmRhbnRzDQogIH4gew0KICAgICMgdGlkeSBhdmVjIElDIHJvYnVzdGVzIEhDMQ0KICAgIHR0IDwtIHRpZHkoLngsIGNvbmYuaW50ID0gVFJVRSwgdmNvdiA9IH5zdGFibGVjb2luK3dlZWspDQogICAgDQogICAgdHQgJT4lDQogICAgICBmaWx0ZXIodGVybSAlaW4lIHNob2NrX3ZhcikgJT4lDQogICAgICB0cmFuc211dGUoDQogICAgICAgIGggICA9IC55LA0KICAgICAgICBpcmYgPSBlc3RpbWF0ZSwNCiAgICAgICAgbG93ID0gY29uZi5sb3csDQogICAgICAgIHVwICA9IGNvbmYuaGlnaCwgDQogICAgICAgIHRlcm09dGVybQ0KICAgICAgKQ0KICB9DQopDQoNCmlyZl9kZl9yZXRfc2VudDwtIG1hcDJfZGZyKA0KICBscF9tYW5fcmV0c2VudCwgICAgICAgICAgICAgICAgICAjIGNoYXF1ZSBzb3VzLW1vZMOobGUNCiAgMDpoLCAgICAgICAgICAgICAgICAgICAgICAjIGhvcml6b25zIGNvcnJlc3BvbmRhbnRzDQogIH4gew0KICAgICMgdGlkeSBhdmVjIElDIHJvYnVzdGVzIEhDMQ0KICAgIHR0IDwtIHRpZHkoLngsIGNvbmYuaW50ID0gVFJVRSwgdmNvdiA9IH5zdGFibGVjb2luK3dlZWspDQogICAgDQogICAgdHQgJT4lDQogICAgICBmaWx0ZXIodGVybSAlaW4lIHNob2NrX3ZhcikgJT4lDQogICAgICB0cmFuc211dGUoDQogICAgICAgIGggICA9IC55LA0KICAgICAgICBpcmYgPSBlc3RpbWF0ZSwNCiAgICAgICAgbG93ID0gY29uZi5sb3csDQogICAgICAgIHVwICA9IGNvbmYuaGlnaCwgDQogICAgICAgIHRlcm09dGVybQ0KICAgICAgKQ0KICB9DQopDQppcmZfZGZfcmV0X3N0YW5jZTwtIG1hcDJfZGZyKA0KICBscF9tYW5fcmV0c3RhbmNlLCAgICAgICAgICAgICAgICAgICMgY2hhcXVlIHNvdXMtbW9kw6hsZQ0KICAwOmgsICAgICAgICAgICAgICAgICAgICAgICMgaG9yaXpvbnMgY29ycmVzcG9uZGFudHMNCiAgfiB7DQogICAgIyB0aWR5IGF2ZWMgSUMgcm9idXN0ZXMgSEMxDQogICAgdHQgPC0gdGlkeSgueCwgY29uZi5pbnQgPSBUUlVFLCB2Y292ID0gfnN0YWJsZWNvaW4rd2VlaykNCiAgICANCiAgICB0dCAlPiUNCiAgICAgIGZpbHRlcih0ZXJtICVpbiUgc2hvY2tfdmFyKSAlPiUNCiAgICAgIHRyYW5zbXV0ZSgNCiAgICAgICAgaCAgID0gLnksDQogICAgICAgIGlyZiA9IGVzdGltYXRlLA0KICAgICAgICBsb3cgPSBjb25mLmxvdywNCiAgICAgICAgdXAgID0gY29uZi5oaWdoLCANCiAgICAgICAgdGVybT10ZXJtDQogICAgICApDQogIH0NCikNCg0KDQoNCmlyZl9kZl93aG9fc2VudCA8LSBtYXAyX2RmcigNCiAgbHBfbWFuX3dob19zZW50LCAgICAgICAgICAgICAgICAgICMgY2hhcXVlIHNvdXMtbW9kw6hsZQ0KICAwOmgsICAgICAgICAgICAgICAgICAgICAgICMgaG9yaXpvbnMgY29ycmVzcG9uZGFudHMNCiAgfiB7DQogICAgIyB0aWR5IGF2ZWMgSUMgcm9idXN0ZXMgSEMxDQogICAgdHQgPC0gdGlkeSgueCwgY29uZi5pbnQgPSBUUlVFLCB2Y292ID0gfnN0YWJsZWNvaW4rd2VlaykNCiAgICANCiAgICB0dCAlPiUNCiAgICAgIGZpbHRlcih0ZXJtICVpbiUgc2hvY2tfdmFyKSAlPiUNCiAgICAgIHRyYW5zbXV0ZSgNCiAgICAgICAgaCAgID0gLnksDQogICAgICAgIGlyZiA9IGVzdGltYXRlLA0KICAgICAgICBsb3cgPSBjb25mLmxvdywNCiAgICAgICAgdXAgID0gY29uZi5oaWdoLCANCiAgICAgICAgdGVybT10ZXJtDQogICAgICApDQogIH0NCikNCg0KaXJmX2RmX3dob19zdGFuY2UgPC0gbWFwMl9kZnIoDQogIGxwX21hbl93aG9fc3RhbmNlLCAgICAgICAgICAgICAgICAgICMgY2hhcXVlIHNvdXMtbW9kw6hsZQ0KICAwOmgsICAgICAgICAgICAgICAgICAgICAgICMgaG9yaXpvbnMgY29ycmVzcG9uZGFudHMNCiAgfiB7DQogICAgIyB0aWR5IGF2ZWMgSUMgcm9idXN0ZXMgSEMxDQogICAgdHQgPC0gdGlkeSgueCwgY29uZi5pbnQgPSBUUlVFLCB2Y292ID0gfnN0YWJsZWNvaW4rd2VlaykNCiAgICANCiAgICB0dCAlPiUNCiAgICAgIGZpbHRlcih0ZXJtICVpbiUgc2hvY2tfdmFyKSAlPiUNCiAgICAgIHRyYW5zbXV0ZSgNCiAgICAgICAgaCAgID0gLnksDQogICAgICAgIGlyZiA9IGVzdGltYXRlLA0KICAgICAgICBsb3cgPSBjb25mLmxvdywNCiAgICAgICAgdXAgID0gY29uZi5oaWdoLCANCiAgICAgICAgdGVybT10ZXJtDQogICAgICApDQogIH0NCikNCg0KYXVlcl8yIDwtIGlyZl9kZl9hdWVyICU+JQ0KICBtdXRhdGUodHlwZT0iQXVlciIpDQoNCmdsb2JhbF8yPC0gaXJmX2RmX2dsb2Jfc2VudCAlPiUgcmJpbmQoaXJmX2RmX2dsb2Jfc3RhbmNlKSU+JQ0KICBtdXRhdGUodHlwZT1jYXNlX3doZW4oDQogICAgdGVybSA9PSAiZChpbmRleF9zZW50X2dsb2JhbCwgMSkiIH4gIlNlbnRpbWVudCIsIA0KICAgIA0KICAgIHRlcm09PSJkKGluZGV4X3N0YW5jZV9nbG9iYWwsIDEpIiB+IlN0YW5jZSINCiAgKSkNCg0KZ2VuZXJhbF8yPC0gaXJmX2RmX2dlbl9zZW50ICU+JSByYmluZChpcmZfZGZfZ2VuX3N0YW5jZSklPiUNCiAgbXV0YXRlKHR5cGU9Y2FzZV93aGVuKA0KICAgIHRlcm0gPT0gImQoc2VudF9HZW5lcmFsX1Vuc3BlY2lmaWVkLCAxKSIgfiAiU2VudGltZW50IiwgDQogICAgDQogICAgdGVybT09ImQoc3RhbmNlX0dlbmVyYWxfVW5zcGVjaWZpZWQsIDEpIiB+IlN0YW5jZSINCiAgKSkNCg0KcmV0YWlsXzI8LSBpcmZfZGZfcmV0X3NlbnQgJT4lIHJiaW5kKGlyZl9kZl9yZXRfc3RhbmNlKSU+JQ0KICBtdXRhdGUodHlwZT1jYXNlX3doZW4oDQogICAgdGVybSA9PSAiZChzZW50X1JldGFpbF9DQkRDLCAxKSIgfiAiU2VudGltZW50IiwgDQogICAgDQogICAgdGVybT09ImQoc3RhbmNlX1JldGFpbF9DQkRDLCAxKSIgfiJTdGFuY2UiDQogICkpDQoNCndob2xlc2FsZV8yPC0gaXJmX2RmX3dob19zZW50ICU+JSByYmluZChpcmZfZGZfd2hvX3N0YW5jZSklPiUNCiAgbXV0YXRlKHR5cGU9Y2FzZV93aGVuKA0KICAgIHRlcm0gPT0gImQoc2VudF9XaG9sZXNhbGVfQ0JEQywgMSkiIH4gIlNlbnRpbWVudCIsIA0KICAgIA0KICAgIHRlcm09PSJkKHN0YW5jZV9XaG9sZXNhbGVfQ0JEQywgMSkiIH4iU3RhbmNlIg0KICApKQ0KDQoNCmBgYA0KV2UgdGhlbiBwbG90IHRoZSBJUkZzIG9mIHRoZSBtb2RlbHMgOg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCm1ha2VfaXJmX3Bsb3RfMiA8LSBmdW5jdGlvbihkYXRhLCB0aXRsZSA9IE5VTEwpIHsNCiAgZ2dwbG90KA0KICAgIGRhdGEsDQogICAgYWVzKA0KICAgICAgeCA9IGgsIHkgPSBpcmYsDQogICAgICB5bWluID0gbG93LCB5bWF4ID0gdXAsDQogICAgICBjb2xvciA9IHR5cGUsIGZpbGwgPSB0eXBlDQogICAgKQ0KICApICsNCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogICAgZ2VvbV9yaWJib24oYWxwaGEgPSAwLjMsIGNvbG9yID0gTkEpICsNCiAgICBnZW9tX2xpbmUobGluZXdpZHRoID0gMC43KSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbHNfdHlwZSkgKw0KICAgIGxhYnMoDQogICAgICB4ID0gIkhvcml6b24gKHdlZWtzKSIsDQogICAgICB5ID0gIlJlc3BvbnNlIG9mIFN1cHBseSAoZGxvZykiLA0KICAgICAgY29sb3IgPSBOVUxMLCBmaWxsID0gTlVMTCwNCiAgICAgIHRpdGxlID0gdGl0bGUNCiAgICApICsNCiAgICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSArDQogICAgdGhlbWUoDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpDQogICAgKQ0KfQ0KDQoNCm1ha2VfaXJmX3Bsb3RfMihnbG9iYWxfMiwgIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBzZW50aW1lbnQvc3RhbmNlIikNCm1ha2VfaXJmX3Bsb3RfMihhdWVyXzIsICJFZmZlY3Qgb2YgaW5jcmVhc2UgaW4gQXVlciAoMjAyMSkgc2VudGltZW50ICIpDQoNCm1ha2VfaXJmX3Bsb3RfMihnZW5lcmFsXzIsIkVmZmVjdCBvZiBpbmNyZWFzZSBpbiBHZW5lcmFsL1Vuc3BlY2lmaWVkIHNlbnRpbWVudC9zdGFuY2UiKQ0KbWFrZV9pcmZfcGxvdF8yKHJldGFpbF8yLCAiRWZmZWN0IG9mIGluY3JlYXNlIGluIFJldGFpbCBzZW50aW1lbnQvc3RhbmNlIikNCg0KbWFrZV9pcmZfcGxvdF8yKHdob2xlc2FsZV8yLCJFZmZlY3Qgb2YgaW5jcmVhc2UgaW4gV2hvbGVzYWxlIHNlbnRpbWVudC9zdGFuY2UiKQ0KYGBgDQpBbmQgdGhvc2UgSVJGcyBhcmUgcGVyZmVjdGx5IGNvbnNpc3RlbnQgd2l0aCBiYXNlbGluZSBlc3RpbWF0aW9ucy4NCg==