This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

# load packages
library(dplyr)
library(tidyr)
library(ggplot2)
# view dataset
View(financialanalysis)
#summary of dataset
summary(financialanalysis)
    gvkey              datadate              conm                act                 ap          
 Length:1632        Min.   :1997-01-31   Length:1632        Min.   :    0.07   Min.   :    0.12  
 Class :character   1st Qu.:2000-08-31   Class :character   1st Qu.:  132.01   1st Qu.:   24.41  
 Mode  :character   Median :2005-01-31   Mode  :character   Median :  366.32   Median :   78.30  
                    Mean   :2005-11-07                      Mean   : 1972.03   Mean   :  757.92  
                    3rd Qu.:2011-01-31                      3rd Qu.: 1142.68   3rd Qu.:  277.23  
                    Max.   :2017-08-31                      Max.   :63278.00   Max.   :41433.00  
       at                 ceq               che               cogs               csho         
 Min.   :     0.24   Min.   :-3824.0   Min.   :   0.00   Min.   :     0.0   Min.   :   0.001  
 1st Qu.:   230.10   1st Qu.:  101.8   1st Qu.:  17.14   1st Qu.:   289.6   1st Qu.:  17.328  
 Median :   642.70   Median :  313.7   Median :  78.77   Median :   787.0   Median :  42.855  
 Mean   :  4749.65   Mean   : 1860.1   Mean   : 393.85   Mean   :  6936.2   Mean   : 153.360  
 3rd Qu.:  2288.80   3rd Qu.: 1121.4   3rd Qu.: 249.47   3rd Qu.:  2753.6   3rd Qu.: 115.092  
 Max.   :204751.00   Max.   :81394.0   Max.   :9135.00   Max.   :355913.0   Max.   :4470.000  
      dlc                 dltt                dv               ebit               invt         
 Min.   :    0.000   Min.   :    0.00   Min.   :   0.00   Min.   :-1877.00   Min.   :    0.00  
 1st Qu.:    0.000   1st Qu.:    0.00   1st Qu.:   0.00   1st Qu.:   10.56   1st Qu.:   67.96  
 Median :    1.283   Median :   25.41   Median :   0.00   Median :   63.18   Median :  194.77  
 Mean   :  173.963   Mean   : 1031.90   Mean   :  95.78   Mean   :  539.93   Mean   : 1164.16  
 3rd Qu.:   17.525   3rd Qu.:  265.96   3rd Qu.:  17.66   3rd Qu.:  264.06   3rd Qu.:  760.34  
 Max.   :12719.000   Max.   :47079.00   Max.   :6294.00   Max.   :26027.00   Max.   :45141.00  
      lct                 lt                 mrc1              mrc2              mrc3              mrc4        
 Min.   :    0.15   Min.   :     0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00   Min.   :   0.00  
 1st Qu.:   56.64   1st Qu.:    85.72   1st Qu.:  25.49   1st Qu.:  23.15   1st Qu.:  20.95   1st Qu.:  17.75  
 Median :  160.81   Median :   259.83   Median :  64.29   Median :  59.27   Median :  54.08   Median :  47.72  
 Mean   : 1460.92   Mean   :  2839.03   Mean   : 148.95   Mean   : 137.04   Mean   : 123.00   Mean   : 108.45  
 3rd Qu.:  618.96   3rd Qu.:  1188.13   3rd Qu.: 164.57   3rd Qu.: 155.44   3rd Qu.: 138.06   3rd Qu.: 119.08  
 Max.   :71818.00   Max.   :121921.00   Max.   :2270.00   Max.   :1989.00   Max.   :1794.00   Max.   :1697.00  
      mrc5             mrcta                ni                oancf              ppent          
 Min.   :   0.00   Min.   :    0.00   Min.   :-4803.000   Min.   :-2167.00   Min.   :     0.00  
 1st Qu.:  13.43   1st Qu.:   28.41   1st Qu.:    2.667   1st Qu.:   16.36   1st Qu.:    65.94  
 Median :  40.87   Median :  122.86   Median :   32.086   Median :   72.84   Median :   187.24  
 Mean   :  93.62   Mean   :  530.85   Mean   :  299.073   Mean   :  572.52   Mean   :  2218.62  
 3rd Qu.: 103.88   3rd Qu.:  386.41   3rd Qu.:  143.500   3rd Qu.:  289.32   3rd Qu.:   809.78  
 Max.   :1530.00   Max.   :12438.00   Max.   :16999.000   Max.   :31530.00   Max.   :117907.00  
       re                rect                revt               txc                xint                sich     
 Min.   :-7064.00   Min.   :    0.000   Min.   :     0.0   Min.   :-133.000   Min.   :   0.0000   Min.   :5311  
 1st Qu.:   22.57   1st Qu.:    1.389   1st Qu.:   456.7   1st Qu.:   0.084   1st Qu.:   0.2815   1st Qu.:5331  
 Median :  190.78   Median :   10.007   Median :  1270.1   Median :  14.540   Median :   3.4155   Median :5621  
 Mean   : 1532.31   Mean   :  305.465   Mean   :  9655.8   Mean   : 165.049   Mean   :  71.4836   Mean   :5521  
 3rd Qu.:  775.93   3rd Qu.:   55.071   3rd Qu.:  4252.7   3rd Qu.:  73.585   3rd Qu.:  27.5822   3rd Qu.:5651  
 Max.   :78609.00   Max.   :31622.000   Max.   :483521.0   Max.   :8619.000   Max.   :2587.0000   Max.   :5661  
     prcc_c              year     
 Min.   :  0.0026   Min.   :1997  
 1st Qu.:  7.7300   1st Qu.:2000  
 Median : 18.2250   Median :2005  
 Mean   : 23.3104   Mean   :2006  
 3rd Qu.: 31.4331   3rd Qu.:2011  
 Max.   :186.1200   Max.   :2017  
# compute variables
ratios<-financialanalysis %>%
  group_by(gvkey)%>%
  mutate(mrc6=mrcta/5,
         mrc7=mrcta/5,
         mrc8=mrcta/5,
         mrc9=mrcta/5,
         mrc10=mrcta/5,
         pv_mrc1=mrc1/1.06,
         pv_mrc2=mrc2/1.06^2,
         pv_mrc3=mrc3/1.06^3,
         pv_mrc4=mrc4/1.06^4,
         pv_mrc5=mrc5/1.06^5,
         pv_mrc6=mrc6/1.06^6,
         pv_mrc7=mrc7/1.06^7,
         pv_mrc8=mrc8/1.06^8,
         pv_mrc9=mrc9/1.06^9,
         pv_mrc10=mrc10/1.06^10,
         total_pv=pv_mrc1+pv_mrc2+pv_mrc3+pv_mrc4+pv_mrc5+pv_mrc6+pv_mrc7+pv_mrc8+pv_mrc9+pv_mrc10,
         
         adj_assets=at+total_pv,
         adj_liab=lt+total_pv,
         adj_debt=dltt+dlc+total_pv,
         
         roa=ni/lag(adj_assets),
         roe=ni/lag(ceq),
         ros=ni/revt,
         gpm=(revt-cogs)/revt,
         daysAR=rect/(revt/365),
         daysInvt=invt/(cogs/365),
         daysAP=ap/(cogs/365),
         ppeTO=revt/(ppent+total_pv),
         currentRt=act/lct,
         quickRt=(act-invt)/lct,
         cashRt=che/lct,
         optCFRt=oancf/lct,
         liabToEqRt=adj_liab/ceq,
         debtToEqRt=adj_debt/ceq,
         intCovRt=(ni+txc+xint)/xint,
         divPayoutRt=dv/ni)
        
# compute median of valuation ratios by year
medians_by_year<-ratios %>% group_by(year)%>% summarize (median_roa=median(roa, na.rm=TRUE  ),
                                                         median_roe=median(roe, na.rm=TRUE  ),
                                                         median_ros=median(ros, na.rm=TRUE  ),
                                                         median_gpm=median(gpm, na.rm=TRUE),
                                                         median_daysAR=median(daysAR, na.rm=TRUE),
                                                         median_daysInvt=median(daysInvt, na.rm=TRUE),
                                                         median_daysAP=median(daysAP, na.rm=TRUE),
                                                         median_ppeTO=median(ppeTO, na.rm=TRUE),
                                                         median_currentRt=median(currentRt, na.rm=TRUE),
                                                         median_quickRt=median(quickRt, na.rm=TRUE),
                                                         median_cashRt=median(cashRt, na.rm=TRUE),
                                                         median_optCFRt=median(optCFRt, na.rm=TRUE),
                                                         median_liabToEqRt=median(liabToEqRt, na.rm=TRUE),
                                                         median_debtToEqRt=median(debtToEqRt, na.rm=TRUE),
                                                         median_intCovRt=median(intCovRt, na.rm=TRUE),
                                                         median_divPayoutRt=median(divPayoutRt, na.rm=TRUE))
                                                    
# create dataframe containing only data for your company
dsw_ratios<-ratios %>% filter(gvkey=="024171")
# merge dataframe for your company with dataframe containing year medians.  merge by year.
firm_with_year_medians <- merge(dsw_ratios,medians_by_year,by="year")
# for each valuation ratio create a barplot of median by year with a line graph for your company's ratio by year
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_roa), stat="identity") +
  geom_line(aes(x = year, y = roa))

# for each valuation ratio create a barplot of median by year with a line graph for your company's ratio by year
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_roe), stat="identity") +
  geom_line(aes(x = year, y = roe))

# for each valuation ratio create a barplot of median by year with a line graph for your company's ratio by year
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_ros), stat="identity") +
  geom_line(aes(x = year, y = ros))

# Gross Profit Margin
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_gpm), stat="identity") +
  geom_line(aes(x = year, y = gpm))

# Days Receivables Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_daysAR), stat="identity") +
  geom_line(aes(x = year, y = daysAR))

# Days Inventory Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_daysInvt), stat="identity") +
  geom_line(aes(x = year, y = daysInvt))

# Days Payable Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_daysAP), stat="identity") +
  geom_line(aes(x = year, y = daysAP))

#PP&E Turnover
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_ppeTO), stat="identity") +
  geom_line(aes(x = year, y = ppeTO))

#Current Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_currentRt), stat="identity") +
  geom_line(aes(x = year, y = currentRt))

#Quick Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_quickRt), stat="identity") +
  geom_line(aes(x = year, y = quickRt))

#Cash Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_cashRt), stat="identity") +
  geom_line(aes(x = year, y = cashRt))

#Operating Cash Flow Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_optCFRt), stat="identity") +
  geom_line(aes(x = year, y = optCFRt))

#Liabilities-to-Equity Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_liabToEqRt), stat="identity") +
  geom_line(aes(x = year, y = liabToEqRt))

#Debt-to-Equity Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_debtToEqRt), stat="identity") +
  geom_line(aes(x = year, y = debtToEqRt))

#   Interest Coverage Ratio (earnings basis)
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_intCovRt), stat="identity") +
  geom_line(aes(x = year, y = intCovRt))

#   Dividend Payout Ratio
ggplot(firm_with_year_medians)+geom_bar(aes(x =year, y=median_divPayoutRt), stat="identity") +
  geom_line(aes(x = year, y = divPayoutRt))

View(firm_with_year_medians)

Part 2

#Altman Z-Score Ratios 
Zscore_ratios<-ratios %>%
  group_by(gvkey) %>%
  mutate(Z=1.2*((lag(act)-lag(lct))/lag(adj_assets))
         + 1.4*(lag(re)/lag(adj_assets))
         + 3.3*(ebit/lag(adj_assets))
         + .6*((lag(csho)*lag(prcc_c))/lag(adj_debt))
         + (revt/lag(adj_assets))
         )
#Medians
Zscore_medians_by_year<-Zscore_ratios %>% group_by(year)%>% summarize (Zscore_median=median(Z, na.rm=TRUE))
Zscore_dsw<-Zscore_ratios %>% filter(gvkey== "024171")
Zscore_firm_with_year_medians <- merge(Zscore_dsw,Zscore_medians_by_year,by="year")
View(Zscore_firm_with_year_medians)
#Model
ggplot(Zscore_firm_with_year_medians)+geom_bar(aes(x =year, y=Zscore_median), stat="identity") +
  geom_line(aes(x = year, y = Z))

LS0tCnRpdGxlOiAiQXNzaWdubWVudCA1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCmBgYHtyfQojIGxvYWQgcGFja2FnZXMKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQoKYGBgCgpgYGB7cn0KIyB2aWV3IGRhdGFzZXQKVmlldyhmaW5hbmNpYWxhbmFseXNpcykKYGBgCgpgYGB7cn0KI3N1bW1hcnkgb2YgZGF0YXNldApzdW1tYXJ5KGZpbmFuY2lhbGFuYWx5c2lzKQpgYGAKCmBgYHtyfQojIGNvbXB1dGUgdmFyaWFibGVzCnJhdGlvczwtZmluYW5jaWFsYW5hbHlzaXMgJT4lCiAgZ3JvdXBfYnkoZ3ZrZXkpJT4lCiAgbXV0YXRlKG1yYzY9bXJjdGEvNSwKICAgICAgICAgbXJjNz1tcmN0YS81LAogICAgICAgICBtcmM4PW1yY3RhLzUsCiAgICAgICAgIG1yYzk9bXJjdGEvNSwKICAgICAgICAgbXJjMTA9bXJjdGEvNSwKICAgICAgICAgcHZfbXJjMT1tcmMxLzEuMDYsCiAgICAgICAgIHB2X21yYzI9bXJjMi8xLjA2XjIsCiAgICAgICAgIHB2X21yYzM9bXJjMy8xLjA2XjMsCiAgICAgICAgIHB2X21yYzQ9bXJjNC8xLjA2XjQsCiAgICAgICAgIHB2X21yYzU9bXJjNS8xLjA2XjUsCiAgICAgICAgIHB2X21yYzY9bXJjNi8xLjA2XjYsCiAgICAgICAgIHB2X21yYzc9bXJjNy8xLjA2XjcsCiAgICAgICAgIHB2X21yYzg9bXJjOC8xLjA2XjgsCiAgICAgICAgIHB2X21yYzk9bXJjOS8xLjA2XjksCiAgICAgICAgIHB2X21yYzEwPW1yYzEwLzEuMDZeMTAsCiAgICAgICAgIHRvdGFsX3B2PXB2X21yYzErcHZfbXJjMitwdl9tcmMzK3B2X21yYzQrcHZfbXJjNStwdl9tcmM2K3B2X21yYzcrcHZfbXJjOCtwdl9tcmM5K3B2X21yYzEwLAogICAgICAgICAKICAgICAgICAgYWRqX2Fzc2V0cz1hdCt0b3RhbF9wdiwKICAgICAgICAgYWRqX2xpYWI9bHQrdG90YWxfcHYsCiAgICAgICAgIGFkal9kZWJ0PWRsdHQrZGxjK3RvdGFsX3B2LAogICAgICAgICAKICAgICAgICAgcm9hPW5pL2xhZyhhZGpfYXNzZXRzKSwKICAgICAgICAgcm9lPW5pL2xhZyhjZXEpLAogICAgICAgICByb3M9bmkvcmV2dCwKICAgICAgICAgZ3BtPShyZXZ0LWNvZ3MpL3JldnQsCiAgICAgICAgIGRheXNBUj1yZWN0LyhyZXZ0LzM2NSksCiAgICAgICAgIGRheXNJbnZ0PWludnQvKGNvZ3MvMzY1KSwKICAgICAgICAgZGF5c0FQPWFwLyhjb2dzLzM2NSksCiAgICAgICAgIHBwZVRPPXJldnQvKHBwZW50K3RvdGFsX3B2KSwKICAgICAgICAgY3VycmVudFJ0PWFjdC9sY3QsCiAgICAgICAgIHF1aWNrUnQ9KGFjdC1pbnZ0KS9sY3QsCiAgICAgICAgIGNhc2hSdD1jaGUvbGN0LAogICAgICAgICBvcHRDRlJ0PW9hbmNmL2xjdCwKICAgICAgICAgbGlhYlRvRXFSdD1hZGpfbGlhYi9jZXEsCiAgICAgICAgIGRlYnRUb0VxUnQ9YWRqX2RlYnQvY2VxLAogICAgICAgICBpbnRDb3ZSdD0obmkrdHhjK3hpbnQpL3hpbnQsCiAgICAgICAgIGRpdlBheW91dFJ0PWR2L25pKQogICAgICAgIApgYGAKCmBgYHtyfQojIGNvbXB1dGUgbWVkaWFuIG9mIHZhbHVhdGlvbiByYXRpb3MgYnkgeWVhcgptZWRpYW5zX2J5X3llYXI8LXJhdGlvcyAlPiUgZ3JvdXBfYnkoeWVhciklPiUgc3VtbWFyaXplIChtZWRpYW5fcm9hPW1lZGlhbihyb2EsIG5hLnJtPVRSVUUgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9yb2U9bWVkaWFuKHJvZSwgbmEucm09VFJVRSAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX3Jvcz1tZWRpYW4ocm9zLCBuYS5ybT1UUlVFICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fZ3BtPW1lZGlhbihncG0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fZGF5c0FSPW1lZGlhbihkYXlzQVIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fZGF5c0ludnQ9bWVkaWFuKGRheXNJbnZ0LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX2RheXNBUD1tZWRpYW4oZGF5c0FQLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX3BwZVRPPW1lZGlhbihwcGVUTywgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9jdXJyZW50UnQ9bWVkaWFuKGN1cnJlbnRSdCwgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9xdWlja1J0PW1lZGlhbihxdWlja1J0LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX2Nhc2hSdD1tZWRpYW4oY2FzaFJ0LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX29wdENGUnQ9bWVkaWFuKG9wdENGUnQsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5fbGlhYlRvRXFSdD1tZWRpYW4obGlhYlRvRXFSdCwgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9kZWJ0VG9FcVJ0PW1lZGlhbihkZWJ0VG9FcVJ0LCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuX2ludENvdlJ0PW1lZGlhbihpbnRDb3ZSdCwgbmEucm09VFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbl9kaXZQYXlvdXRSdD1tZWRpYW4oZGl2UGF5b3V0UnQsIG5hLnJtPVRSVUUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKYGBge3J9CiMgY3JlYXRlIGRhdGFmcmFtZSBjb250YWluaW5nIG9ubHkgZGF0YSBmb3IgeW91ciBjb21wYW55CmRzd19yYXRpb3M8LXJhdGlvcyAlPiUgZmlsdGVyKGd2a2V5PT0iMDI0MTcxIikKYGBgCgpgYGB7cn0KIyBtZXJnZSBkYXRhZnJhbWUgZm9yIHlvdXIgY29tcGFueSB3aXRoIGRhdGFmcmFtZSBjb250YWluaW5nIHllYXIgbWVkaWFucy4gIG1lcmdlIGJ5IHllYXIuCmZpcm1fd2l0aF95ZWFyX21lZGlhbnMgPC0gbWVyZ2UoZHN3X3JhdGlvcyxtZWRpYW5zX2J5X3llYXIsYnk9InllYXIiKQpgYGAKCmBgYHtyfQojIGZvciBlYWNoIHZhbHVhdGlvbiByYXRpbyBjcmVhdGUgYSBiYXJwbG90IG9mIG1lZGlhbiBieSB5ZWFyIHdpdGggYSBsaW5lIGdyYXBoIGZvciB5b3VyIGNvbXBhbnkncyByYXRpbyBieSB5ZWFyCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5fcm9hKSwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHJvYSkpCmBgYAoKYGBge3J9CiMgZm9yIGVhY2ggdmFsdWF0aW9uIHJhdGlvIGNyZWF0ZSBhIGJhcnBsb3Qgb2YgbWVkaWFuIGJ5IHllYXIgd2l0aCBhIGxpbmUgZ3JhcGggZm9yIHlvdXIgY29tcGFueSdzIHJhdGlvIGJ5IHllYXIKZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9yb2UpLCBzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gcm9lKSkKYGBgCgpgYGB7cn0KIyBmb3IgZWFjaCB2YWx1YXRpb24gcmF0aW8gY3JlYXRlIGEgYmFycGxvdCBvZiBtZWRpYW4gYnkgeWVhciB3aXRoIGEgbGluZSBncmFwaCBmb3IgeW91ciBjb21wYW55J3MgcmF0aW8gYnkgeWVhcgpnZ3Bsb3QoZmlybV93aXRoX3llYXJfbWVkaWFucykrZ2VvbV9iYXIoYWVzKHggPXllYXIsIHk9bWVkaWFuX3JvcyksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSByb3MpKQpgYGAKCmBgYHtyfQojIEdyb3NzIFByb2ZpdCBNYXJnaW4KZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9ncG0pLCBzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gZ3BtKSkKYGBgCgpgYGB7cn0KIyBEYXlzIFJlY2VpdmFibGVzIFJhdGlvCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5fZGF5c0FSKSwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGRheXNBUikpCmBgYAoKYGBge3J9CiMgRGF5cyBJbnZlbnRvcnkgUmF0aW8KZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9kYXlzSW52dCksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBkYXlzSW52dCkpCmBgYAoKYGBge3J9CiMgRGF5cyBQYXlhYmxlIFJhdGlvCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5fZGF5c0FQKSwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGRheXNBUCkpCmBgYAoKYGBge3J9CiNQUCZFIFR1cm5vdmVyCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5fcHBlVE8pLCBzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gcHBlVE8pKQpgYGAKCmBgYHtyfQojQ3VycmVudCBSYXRpbwpnZ3Bsb3QoZmlybV93aXRoX3llYXJfbWVkaWFucykrZ2VvbV9iYXIoYWVzKHggPXllYXIsIHk9bWVkaWFuX2N1cnJlbnRSdCksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBjdXJyZW50UnQpKQpgYGAKCmBgYHtyfQojUXVpY2sgUmF0aW8KZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9xdWlja1J0KSwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHF1aWNrUnQpKQpgYGAKCmBgYHtyfQojQ2FzaCBSYXRpbwpnZ3Bsb3QoZmlybV93aXRoX3llYXJfbWVkaWFucykrZ2VvbV9iYXIoYWVzKHggPXllYXIsIHk9bWVkaWFuX2Nhc2hSdCksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBjYXNoUnQpKQpgYGAKCmBgYHtyfQojT3BlcmF0aW5nIENhc2ggRmxvdyBSYXRpbwpnZ3Bsb3QoZmlybV93aXRoX3llYXJfbWVkaWFucykrZ2VvbV9iYXIoYWVzKHggPXllYXIsIHk9bWVkaWFuX29wdENGUnQpLCBzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gb3B0Q0ZSdCkpCmBgYAoKYGBge3J9CiNMaWFiaWxpdGllcy10by1FcXVpdHkgUmF0aW8KZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9saWFiVG9FcVJ0KSwgc3RhdD0iaWRlbnRpdHkiKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IGxpYWJUb0VxUnQpKQoKYGBgCgpgYGB7cn0KI0RlYnQtdG8tRXF1aXR5IFJhdGlvCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5fZGVidFRvRXFSdCksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBkZWJ0VG9FcVJ0KSkKYGBgCgpgYGB7cn0KIwlJbnRlcmVzdCBDb3ZlcmFnZSBSYXRpbyAoZWFybmluZ3MgYmFzaXMpCmdncGxvdChmaXJtX3dpdGhfeWVhcl9tZWRpYW5zKStnZW9tX2JhcihhZXMoeCA9eWVhciwgeT1tZWRpYW5faW50Q292UnQpLCBzdGF0PSJpZGVudGl0eSIpICsKICBnZW9tX2xpbmUoYWVzKHggPSB5ZWFyLCB5ID0gaW50Q292UnQpKQoKYGBgCgpgYGB7cn0KIwlEaXZpZGVuZCBQYXlvdXQgUmF0aW8KZ2dwbG90KGZpcm1fd2l0aF95ZWFyX21lZGlhbnMpK2dlb21fYmFyKGFlcyh4ID15ZWFyLCB5PW1lZGlhbl9kaXZQYXlvdXRSdCksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBkaXZQYXlvdXRSdCkpCmBgYAoKYGBge3J9ClZpZXcoZmlybV93aXRoX3llYXJfbWVkaWFucykKYGBgCgojUGFydCAyCmBgYHtyfQojQWx0bWFuIFotU2NvcmUgUmF0aW9zIApac2NvcmVfcmF0aW9zPC1yYXRpb3MgJT4lCiAgZ3JvdXBfYnkoZ3ZrZXkpICU+JQogIG11dGF0ZShaPTEuMiooKGxhZyhhY3QpLWxhZyhsY3QpKS9sYWcoYWRqX2Fzc2V0cykpCiAgICAgICAgICsgMS40KihsYWcocmUpL2xhZyhhZGpfYXNzZXRzKSkKICAgICAgICAgKyAzLjMqKGViaXQvbGFnKGFkal9hc3NldHMpKQogICAgICAgICArIC42KigobGFnKGNzaG8pKmxhZyhwcmNjX2MpKS9sYWcoYWRqX2RlYnQpKQogICAgICAgICArIChyZXZ0L2xhZyhhZGpfYXNzZXRzKSkKICAgICAgICAgKQpgYGAKCmBgYHtyfQojTWVkaWFucwpac2NvcmVfbWVkaWFuc19ieV95ZWFyPC1ac2NvcmVfcmF0aW9zICU+JSBncm91cF9ieSh5ZWFyKSU+JSBzdW1tYXJpemUgKFpzY29yZV9tZWRpYW49bWVkaWFuKFosIG5hLnJtPVRSVUUpKQoKWnNjb3JlX2RzdzwtWnNjb3JlX3JhdGlvcyAlPiUgZmlsdGVyKGd2a2V5PT0gIjAyNDE3MSIpCgpac2NvcmVfZmlybV93aXRoX3llYXJfbWVkaWFucyA8LSBtZXJnZShac2NvcmVfZHN3LFpzY29yZV9tZWRpYW5zX2J5X3llYXIsYnk9InllYXIiKQoKVmlldyhac2NvcmVfZmlybV93aXRoX3llYXJfbWVkaWFucykKYGBgCgpgYGB7cn0KI01vZGVsCmdncGxvdChac2NvcmVfZmlybV93aXRoX3llYXJfbWVkaWFucykrZ2VvbV9iYXIoYWVzKHggPXllYXIsIHk9WnNjb3JlX21lZGlhbiksIHN0YXQ9ImlkZW50aXR5IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSBaKSkKYGBgCgoKCgoKCgo=