title: “Vall-Llobera Assignment 1”
output:
html_notebook: default
pdf_document: default

Please note that when trying to Knit a report to PDF I encountered an error due to memory constraints. This file contains the full code, while the PDF Report contains only the plots and summary statistics for illustrative purposes.

Load Commands

I loaded each file individually into R from the web to create a combined file of SEC data.

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q10.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q10.zip'
Content type 'application/octet-stream' length 12002626 bytes (11.4 MB)
downloaded 11.4 MB
unzip(temp, "q1_2012_all.csv")
q1_2012 <- read.csv("q1_2012_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q2.zip'
Content type 'application/octet-stream' length 12257834 bytes (11.7 MB)
downloaded 11.7 MB
unzip(temp, "q2_2012_all.csv")
q2_2012 <- read.csv("q2_2012_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q3.zip'
Content type 'application/octet-stream' length 11813209 bytes (11.3 MB)
downloaded 11.3 MB
unzip(temp, "q3_2012_all.csv")
q3_2012 <- read.csv("q3_2012_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q4.zip'
Content type 'application/octet-stream' length 11759021 bytes (11.2 MB)
downloaded 10.3 MB

downloaded length 10761477 != reported length 11759021
unzip(temp, "q4_2012_all.csv")
error 1 in extracting from zip file
q4_2012 <- read.csv("q4_2012_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q1.zip'
Content type 'application/octet-stream' length 11426842 bytes (10.9 MB)
downloaded 10.9 MB
unzip(temp, "q1_2013_all.csv")
q1_2013 <- read.csv("q1_2013_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q2.zip'
Content type 'application/octet-stream' length 12294800 bytes (11.7 MB)
downloaded 11.7 MB
unzip(temp, "q2_2013_all.csv")
q2_2013 <- read.csv("q2_2013_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q3.zip'
Content type 'application/octet-stream' length 12331275 bytes (11.8 MB)
downloaded 11.8 MB
unzip(temp, "q3_2013_all.csv")
q3_2013 <- read.csv("q3_2013_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q4.zip'
Content type 'application/octet-stream' length 12489295 bytes (11.9 MB)
downloaded 11.9 MB
unzip(temp, "q4_2013_all.csv")
q4_2013 <- read.csv("q4_2013_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q1.zip'
Content type 'application/octet-stream' length 12621169 bytes (12.0 MB)
downloaded 12.0 MB
unzip(temp, "q1_2014_all.csv")
q1_2014 <- read.csv("q1_2014_all.csv", sep=",", skipNul=T, header=T)

setwd("~/Georgia Tech/Managing FIs/Assign1")
The working directory was changed to C:/Users/joev2/OneDrive/Documents/Georgia Tech/Managing FIs/Assign1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
q2_2014 <- read.csv("~/Georgia Tech/Managing FIs/Assign1/q2_2014_all.csv")

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q3.zip'
Content type 'application/octet-stream' length 13239788 bytes (12.6 MB)
downloaded 12.6 MB
unzip(temp, "q3_2014_all.csv")
q3_2014 <- read.csv("q3_2014_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q4.zip'
Content type 'application/octet-stream' length 13436977 bytes (12.8 MB)
downloaded 12.8 MB
unzip(temp, "q4_2014_all.csv")
q4_2014 <- read.csv("q4_2014_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q1.zip'
Content type 'application/octet-stream' length 12806276 bytes (12.2 MB)
downloaded 12.2 MB
unzip(temp, "q1_2015_all.csv")
q1_2015 <- read.csv("q1_2015_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q2.zip'
Content type 'application/octet-stream' length 13183979 bytes (12.6 MB)
downloaded 12.6 MB
unzip(temp, "q2_2015_all.csv")
q2_2015 <- read.csv("q2_2015_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q3.zip'
Content type 'application/octet-stream' length 13707984 bytes (13.1 MB)
downloaded 13.1 MB
unzip(temp, "q3_2015_all.csv")
q3_2015 <- read.csv("q3_2015_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q4.zip'
Content type 'application/octet-stream' length 13672831 bytes (13.0 MB)
downloaded 13.0 MB
unzip(temp, "q4_2015_all.csv")
q4_2015 <- read.csv("q4_2015_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q1.zip'
Content type 'application/octet-stream' length 15177551 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q1_2016_all.csv")
q1_2016 <- read.csv("q1_2016_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q2.zip'
Content type 'application/octet-stream' length 15643843 bytes (14.9 MB)
downloaded 14.9 MB
unzip(temp, "q2_2016_all.csv")
q2_2016 <- read.csv("q2_2016_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q3.zip'
Content type 'application/octet-stream' length 15566189 bytes (14.8 MB)
downloaded 14.8 MB
unzip(temp, "q3_2016_all.csv")
q3_2016 <- read.csv("q3_2016_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q4.zip'
Content type 'application/octet-stream' length 15371263 bytes (14.7 MB)
downloaded 14.7 MB
unzip(temp, "q4_2016_all.csv")
q4_2016 <- read.csv("q4_2016_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q1.zip'
Content type 'application/octet-stream' length 15146559 bytes (14.4 MB)
downloaded 14.4 MB
unzip(temp, "q1_2017_all.csv")
q1_2017 <- read.csv("q1_2017_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q2.zip'
Content type 'application/octet-stream' length 15231558 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q2_2017_all.csv")
q2_2017 <- read.csv("q2_2017_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q3.zip'
Content type 'application/octet-stream' length 15255963 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q3_2017_all.csv")
q3_2017 <- read.csv("q3_2017_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q4.zip'
Content type 'application/octet-stream' length 15448988 bytes (14.7 MB)
downloaded 14.7 MB
unzip(temp, "q4_2017_all.csv")
q4_2017 <- read.csv("q4_2017_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q1.zip'
Content type 'application/octet-stream' length 15320197 bytes (14.6 MB)
downloaded 14.6 MB
unzip(temp, "q1_2018_all.csv")
q1_2018 <- read.csv("q1_2018_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q2.zip'
Content type 'application/octet-stream' length 16136876 bytes (15.4 MB)
downloaded 15.4 MB
unzip(temp, "q2_2018_all.csv")
q2_2018 <- read.csv("q2_2018_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q3.zip'
Content type 'application/octet-stream' length 16309710 bytes (15.6 MB)
downloaded 15.6 MB
unzip(temp, "q3_2018_all.csv")
q3_2018 <- read.csv("q3_2018_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q4.zip'
Content type 'application/octet-stream' length 16832740 bytes (16.1 MB)
downloaded 16.1 MB
unzip(temp, "q4_2018_all.csv")
q4_2018 <- read.csv("q4_2018_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q1.zip'
Content type 'application/octet-stream' length 16220248 bytes (15.5 MB)
downloaded 15.5 MB
unzip(temp, "q1_2019_all.csv")
q1_2019 <- read.csv("q1_2019_all.csv", sep=",", skipNul=T, header=T)

temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q2.zip'
Content type 'application/octet-stream' length 16783561 bytes (16.0 MB)
downloaded 16.0 MB
unzip(temp, "q2_2019_all.csv")
q2_2019 <- read.csv("q2_2019_all.csv", sep=",", skipNul=T, header=T)

Load Packages

I loaded the dplyr, tidyr, and ggplot2 packages to execute my R commands

library(dplyr)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)

Combine files

I used “rbind” to combine each file into a single dataframe. Reading this dataframe was not possible when knitting report due to memory constraints; I attempted both rbind using commas for each data frame, separate rbinds with pipes (shown below), and bind.rows, but each proved to require too much memory for the knit pdf function to handle.

SEC_comb <- 
  q1_2012 %>%
    rbind(q2_2012) %>%
    rbind(q3_2012) %>%
    rbind(q4_2012) %>%
    rbind(q1_2013) %>%
    rbind(q2_2013) %>%
    rbind(q3_2013) %>%
    rbind(q4_2013) %>%
    rbind(q1_2014) %>%
    rbind(q2_2014) %>%
    rbind(q3_2014) %>%
    rbind(q4_2014) %>%
    rbind(q1_2015) %>%
    rbind(q2_2015) %>%
    rbind(q3_2015) %>%
    rbind(q4_2015) %>%
    rbind(q1_2016) %>%
    rbind(q2_2016) %>%
    rbind(q3_2016) %>%
    rbind(q4_2016) %>%
    rbind(q1_2017) %>%
    rbind(q2_2017) %>%
    rbind(q3_2017) %>%
    rbind(q4_2017) %>%
    rbind(q1_2018) %>%
    rbind(q2_2018) %>%
    rbind(q3_2018) %>%
    rbind(q4_2018) %>%
    rbind(q1_2019) %>%
    rbind(q2_2019)
SEC_comb <- transform(SEC_comb, Date = as.Date(as.character(Date), "%Y%m%d"))

Summary Statistics for SEC data

To run summary statistics on the combined dataset, I created a new data frame that grouped the columns by ETF and STOCK and ran summary statistics for each of the variables requested.

While the SEC MIDAS website states that there are variables for Trades and TradeVol, these don’t actually appear to exist within the CSV files on the site.

When reviewing the summary statistics we can see that for both ETF’s and Stocks across all metrics, the standard deviations are far greater than the means of each variable, showing that there is significant variability amongst both individual Stocks and ETFs. Additionally, the medians are quite low compared to the averages of many of the variables, indicating that some stocks/ETFs with a lot more trading activity drive the numbers up.

ETFs appear to have a much higher order volume relative to Stocks, with an average order volume of of 122K for ETFs and only 16K for Stocks.

options(scipen = 999)
options(digits=3)
Sum_stats <- SEC_comb %>%
  select(Security, LitVol..000.,  OrderVol..000., Hidden, TradesForHidden, 
         HiddenVol..000., TradeVolForHidden..000., Cancels, LitTrades, OddLots, 
         TradesForOddLots, OddLotVol..000., TradeVolForOddLots..000.) %>%
  group_by(Security) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = median, p75 = quantile(.,.75), sd = sd))%>%
  gather(type, value, -Security)
funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.
Sum_stats

Select a sample from Q1_2012

In order to select a random sample of 100 Stocks and ETFs, I first split the Q1_2012 into two data frames by applying a filter; one for STOCKs and one for ETFs. I then pulled 100 random stocks and ETFs from each file, and set them as an object to be queried each time I create a data frame to be plotted.

q1_2012 <- transform(q1_2012, Date = as.Date(as.character(Date), "%Y%m%d"))
q1_2012_STOCK <- filter(q1_2012,Security == "Stock")
q1_2012_ETF <- filter(q1_2012,Security == "ETF")
stock_list <- unique(q1_2012_STOCK$Ticker)
stock_list_sample <- sample(stock_list, 100)
ETF_list <- unique(q1_2012_ETF$Ticker)
ETF_list_sample <- sample(ETF_list,100)
stock_list_sample
  [1] SNTA FCEL ENDP MAT  TSS  PBTH SMBC RDNT LCRY LL   SURG HMSY JW.A RYL  CBOE BWEN XRIT IVD 
 [19] WHRT UNH  NSP  VIST XIDE TMP  MATW CPLA BKH  PZZI TIGR DUCK MRNA UVSP ABCD IFT  AWR  ELRC
 [37] SUMR MBFI CIDM EXAM TNCC HTCO TSRX OMPI XXIA SBUX NAVR KRO  CMCO INAP GROW INCB GTI  GCO 
 [55] OMN  LTXC BFIN FITB CVBK BIOD RSOL CTBI HWBK FLOW MTSN ITMN KFT  SLAB RDIB CBK  HAST ACAD
 [73] SAL  CAH  RMTR MOV  EW   BOOT MCBC MOFG FBC  COH  ZION EDUC RVR  ASBB SONS CHD  SCMR JCS 
 [91] JOSB CHYR HEI  AATI RRR  WPC  VCBI PETS KERX IKAN
5064 Levels: A AA AACC AADR AAIT AAME AAN AAON AAP AAPL AATI AAU AAWW AAXJ ABAX ABC ABCB ... ZZ
ETF_list_sample
  [1] RZV  EMDI PXJ  TDV  UCO  IDHQ PJB  IAU  HGEM UVT  GMFS CMD  EWZS XHS  IXC  MBB  NYF  PLW 
 [19] RXD  MONY RWR  BIV  LWC  IFGL SBB  FCL  VONV MEXS PSCD VIOV XOIL XME  IST  TOTS GNR  GRID
 [37] SAA  MDYG SH   JKH  EFZ  SHY  AXJS PKW  SOXS EZJ  IVOO TDX  SPHQ UYM  WDTI RWK  BTAL ONEF
 [55] PRF  GSG  SCHR PHYS REMX RUSL FMU  ERY  AXTE SMMU PYH  CRBQ GLJ  VWO  VBR  IVV  YINN PNQI
 [73] COLX GWL  UBR  RETL RCD  UVG  XHB  FCD  IYF  UWM  BIB  IHI  TMW  TAO  TRXT GTAA RWV  RWO 
 [91] AGRG DSUM FAZ  GREK AXSL EMLC MCRO TYNS DTD  SLVP
5064 Levels: A AA AACC AADR AAIT AAME AAN AAON AAP AAPL AATI AAU AAWW AAXJ ABAX ABC ABCB ... ZZ
SEC_comb_STOCK <- filter(SEC_comb,Security == "Stock")
SEC_comb_ETF <- filter(SEC_comb,Security == "ETF")

Build the Plots

Given the complex matrix of data (100 stocks and 100 ETFs for 12 variables across 5 statistics plotted on a time series), I elected to create a separate plot for each of the 12 variables, plotting the 5 summary statistics on a time series. The plots are shown below

Stock LitVol(000s) Plot

stock_LitVol <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, LitVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_LitVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock OrderVol(000s) Plot

stock_OrderVol <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, OrderVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_OrderVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock Hidden Plot

stock_Hidden <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, Hidden) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_Hidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock TradesForHidden Plot

stock_TradesForHidden <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, TradesForHidden) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_TradesForHidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock HiddenVol (000s) Plot

stock_HiddenVol <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, HiddenVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_HiddenVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock TradeVolForHidden (000s) Plot

stock_TradeVolForHidden <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, TradeVolForHidden..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_TradeVolForHidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock Cancels Plot

stock_Cancels <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, Cancels) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_Cancels %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock LitTrades Plot

stock_LitTrades <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, LitTrades) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_LitTrades %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock OddLots Plot

stock_OddLots <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, OddLots) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_OddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock TradesForOddLots Plot

stock_TradeForOddLots <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, TradesForOddLots) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_TradeForOddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock OddLotVol (000s) Plot

stock_OddLotVol <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, OddLotVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_OddLotVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

Stock TradeVolForOddLots (000s) Plot

stock_TradeVoldForOddLots <- SEC_comb_STOCK %>%
  filter(Ticker %in% stock_list_sample) %>%
  select(Date, TradeVolForOddLots..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
stock_TradeVoldForOddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF LitVol(000s) Plot

ETF_LitVol <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, LitVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_LitVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF OrderVol(000s) Plot

ETF_OrderVol <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, OrderVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_OrderVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF Hidden Plot

ETF_Hidden <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, Hidden) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_Hidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF TradesForHidden Plot

ETF_TradesForHidden <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, TradesForHidden) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_TradesForHidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF HiddenVol (000s) Plot

ETF_HiddenVol <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, HiddenVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_HiddenVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF TradeVolForHidden (000s) Plot

ETF_TradeVolForHidden <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, TradeVolForHidden..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_TradeVolForHidden %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF Cancels Plot

ETF_Cancels <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, Cancels) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_Cancels %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF LitTrades Plot

ETF_LitTrades <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, LitTrades) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_LitTrades %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF OddLots Plot

ETF_OddLots <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, OddLots) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_OddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF TradesForOddLots Plot

ETF_TradeForOddLots <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, TradesForOddLots) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_TradeForOddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF OddLotVol (000s) Plot

ETF_OddLotVol <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, OddLotVol..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_OddLotVol %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

ETF TradeVolForOddLots (000s) Plot

ETF_TradeVoldForOddLots <- SEC_comb_ETF %>%
  filter(Ticker %in% ETF_list_sample) %>%
  select(Date, TradeVolForOddLots..000.) %>%
  group_by(Date) %>%
  na.omit() %>%
  summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
  gather(type, value, -Date)
ETF_TradeVoldForOddLots %>%
  ggplot(aes(x = Date, y = value, color = type)) +
  geom_line()

The individual plots for ETFs and Stocks in Q1 2012 are in line with the overall SEC combined file summary statistics. Standard deviations are much higher than the mean across the board, and ETF order volumes are also much higher than stocks. Also, interestingly, many of the Stock graphs show a significant spike in standard deviation at different periods throughout the time series, suggesting that there are one off events that dramatically influences trading activity over the period. The OddLotVol and OddLot graphs for both stocks and ETFs also tell an interesting story, which is that over time, the trade batches got smaller relative to the overall amount of trades. The random sampling we performed shows that we have selected a pool of stocks and ETFs with a broad level of trading activity, and perhaps if we converted the stocks into bins with trading thresholds, we would be able to perform more informative analysis on stocks and ETFs that fall within a certain range of trading volume.

LS0tDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KLS0tDQp0aXRsZTogIlZhbGwtTGxvYmVyYSBBc3NpZ25tZW50IDEiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIC0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpQbGVhc2Ugbm90ZSB0aGF0IHdoZW4gdHJ5aW5nIHRvIEtuaXQgYSByZXBvcnQgdG8gUERGIEkgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVlIHRvIG1lbW9yeSBjb25zdHJhaW50cy4gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdWxsIGNvZGUsIHdoaWxlIHRoZSBQREYgUmVwb3J0IGNvbnRhaW5zIG9ubHkgdGhlIHBsb3RzIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4NCg0KIyMgTG9hZCBDb21tYW5kcw0KDQpJIGxvYWRlZCBlYWNoIGZpbGUgaW5kaXZpZHVhbGx5IGludG8gUiBmcm9tIHRoZSB3ZWIgdG8gY3JlYXRlIGEgY29tYmluZWQgZmlsZSBvZiBTRUMgZGF0YS4NCg0KYGBge3J9DQp0ZW1wIDwtIHRlbXBmaWxlKCkNCmRvd25sb2FkLmZpbGUoImh0dHBzOi8vd3d3LnNlYy5nb3YvZmlsZXMvb3BhL2RhdGEvbWFya2V0LXN0cnVjdHVyZS9tZXRyaWNzLWluZGl2aWR1YWwtc2VjdXJpdHkvaW5kaXZpZHVhbF9zZWN1cml0eV8yMDEyX3ExMC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDEyX2FsbC5jc3YiKQ0KcTFfMjAxMiA8LSByZWFkLmNzdigicTFfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xMi56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMl8yMDEyX2FsbC5jc3YiKQ0KcTJfMjAxMiA8LSByZWFkLmNzdigicTJfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xMy56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxM18yMDEyX2FsbC5jc3YiKQ0KcTNfMjAxMiA8LSByZWFkLmNzdigicTNfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xNC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxNF8yMDEyX2FsbC5jc3YiKQ0KcTRfMjAxMiA8LSByZWFkLmNzdigicTRfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMS56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDEzX2FsbC5jc3YiKQ0KcTFfMjAxMyA8LSByZWFkLmNzdigicTFfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMi56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMl8yMDEzX2FsbC5jc3YiKQ0KcTJfMjAxMyA8LSByZWFkLmNzdigicTJfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMy56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxM18yMDEzX2FsbC5jc3YiKQ0KcTNfMjAxMyA8LSByZWFkLmNzdigicTNfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xNC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxNF8yMDEzX2FsbC5jc3YiKQ0KcTRfMjAxMyA8LSByZWFkLmNzdigicTRfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxNF9xMS56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDE0X2FsbC5jc3YiKQ0KcTFfMjAxNCA8LSByZWFkLmNzdigicTFfMjAxNF9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0Kc2V0d2QoIn4vR2VvcmdpYSBUZWNoL01hbmFnaW5nIEZJcy9Bc3NpZ24xIikNCnEyXzIwMTQgPC0gcmVhZC5jc3YoIn4vR2VvcmdpYSBUZWNoL01hbmFnaW5nIEZJcy9Bc3NpZ24xL3EyXzIwMTRfYWxsLmNzdiIpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTRfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNF9hbGwuY3N2IikNCnEzXzIwMTQgPC0gcmVhZC5jc3YoInEzXzIwMTRfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTRfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNF9hbGwuY3N2IikNCnE0XzIwMTQgPC0gcmVhZC5jc3YoInE0XzIwMTRfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxNV9hbGwuY3N2IikNCnExXzIwMTUgPC0gcmVhZC5jc3YoInExXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxNV9hbGwuY3N2IikNCnEyXzIwMTUgPC0gcmVhZC5jc3YoInEyXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNV9hbGwuY3N2IikNCnEzXzIwMTUgPC0gcmVhZC5jc3YoInEzXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNV9hbGwuY3N2IikNCnE0XzIwMTUgPC0gcmVhZC5jc3YoInE0XzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxNl9hbGwuY3N2IikNCnExXzIwMTYgPC0gcmVhZC5jc3YoInExXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxNl9hbGwuY3N2IikNCnEyXzIwMTYgPC0gcmVhZC5jc3YoInEyXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNl9hbGwuY3N2IikNCnEzXzIwMTYgPC0gcmVhZC5jc3YoInEzXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNl9hbGwuY3N2IikNCnE0XzIwMTYgPC0gcmVhZC5jc3YoInE0XzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxN19hbGwuY3N2IikNCnExXzIwMTcgPC0gcmVhZC5jc3YoInExXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxN19hbGwuY3N2IikNCnEyXzIwMTcgPC0gcmVhZC5jc3YoInEyXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxN19hbGwuY3N2IikNCnEzXzIwMTcgPC0gcmVhZC5jc3YoInEzXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxN19hbGwuY3N2IikNCnE0XzIwMTcgPC0gcmVhZC5jc3YoInE0XzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxOF9hbGwuY3N2IikNCnExXzIwMTggPC0gcmVhZC5jc3YoInExXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxOF9hbGwuY3N2IikNCnEyXzIwMTggPC0gcmVhZC5jc3YoInEyXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxOF9hbGwuY3N2IikNCnEzXzIwMTggPC0gcmVhZC5jc3YoInEzXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxOF9hbGwuY3N2IikNCnE0XzIwMTggPC0gcmVhZC5jc3YoInE0XzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTlfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxOV9hbGwuY3N2IikNCnExXzIwMTkgPC0gcmVhZC5jc3YoInExXzIwMTlfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTlfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxOV9hbGwuY3N2IikNCnEyXzIwMTkgPC0gcmVhZC5jc3YoInEyXzIwMTlfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQpgYGANCg0KIyMgTG9hZCBQYWNrYWdlcw0KDQpJIGxvYWRlZCB0aGUgZHBseXIsIHRpZHlyLCBhbmQgZ2dwbG90MiBwYWNrYWdlcyB0byBleGVjdXRlIG15IFIgY29tbWFuZHMNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyBDb21iaW5lIGZpbGVzDQoNCkkgdXNlZCAicmJpbmQiIHRvIGNvbWJpbmUgZWFjaCBmaWxlIGludG8gYSBzaW5nbGUgZGF0YWZyYW1lLiBSZWFkaW5nIHRoaXMgZGF0YWZyYW1lIHdhcyBub3QgcG9zc2libGUgd2hlbiBrbml0dGluZyByZXBvcnQgZHVlIHRvIG1lbW9yeSBjb25zdHJhaW50czsgSSBhdHRlbXB0ZWQgYm90aCByYmluZCB1c2luZyBjb21tYXMgZm9yIGVhY2ggZGF0YSBmcmFtZSwgc2VwYXJhdGUgcmJpbmRzIHdpdGggcGlwZXMgKHNob3duIGJlbG93KSwgYW5kIGJpbmQucm93cywgYnV0IGVhY2ggcHJvdmVkIHRvIHJlcXVpcmUgdG9vIG11Y2ggbWVtb3J5IGZvciB0aGUga25pdCBwZGYgZnVuY3Rpb24gdG8gaGFuZGxlLg0KDQpgYGB7cn0NClNFQ19jb21iIDwtIA0KICBxMV8yMDEyICU+JQ0KICAgIHJiaW5kKHEyXzIwMTIpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTIpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTIpICU+JQ0KICAgIHJiaW5kKHExXzIwMTMpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTMpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTMpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTMpICU+JQ0KICAgIHJiaW5kKHExXzIwMTQpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTQpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTQpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTQpICU+JQ0KICAgIHJiaW5kKHExXzIwMTUpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTUpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTUpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTUpICU+JQ0KICAgIHJiaW5kKHExXzIwMTYpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTYpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTYpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTYpICU+JQ0KICAgIHJiaW5kKHExXzIwMTcpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTcpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTcpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTcpICU+JQ0KICAgIHJiaW5kKHExXzIwMTgpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTgpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTgpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTgpICU+JQ0KICAgIHJiaW5kKHExXzIwMTkpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTkpDQpTRUNfY29tYiA8LSB0cmFuc2Zvcm0oU0VDX2NvbWIsIERhdGUgPSBhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgIiVZJW0lZCIpKQ0KYGBgDQoNCiMjIFN1bW1hcnkgU3RhdGlzdGljcyBmb3IgU0VDIGRhdGENCg0KVG8gcnVuIHN1bW1hcnkgc3RhdGlzdGljcyBvbiB0aGUgY29tYmluZWQgZGF0YXNldCwgSSBjcmVhdGVkIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBncm91cGVkIHRoZSBjb2x1bW5zIGJ5IEVURiBhbmQgU1RPQ0sgYW5kIHJhbiBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcyByZXF1ZXN0ZWQuDQoNCldoaWxlIHRoZSBTRUMgTUlEQVMgd2Vic2l0ZSBzdGF0ZXMgdGhhdCB0aGVyZSBhcmUgdmFyaWFibGVzIGZvciBUcmFkZXMgYW5kIFRyYWRlVm9sLCB0aGVzZSBkb27igJl0IGFjdHVhbGx5IGFwcGVhciB0byBleGlzdCB3aXRoaW4gdGhlIENTViBmaWxlcyBvbiB0aGUgc2l0ZS4NCg0KV2hlbiByZXZpZXdpbmcgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyB3ZSBjYW4gc2VlIHRoYXQgZm9yIGJvdGggRVRG4oCZcyBhbmQgU3RvY2tzIGFjcm9zcyBhbGwgbWV0cmljcywgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgYXJlIGZhciBncmVhdGVyIHRoYW4gdGhlIG1lYW5zIG9mIGVhY2ggdmFyaWFibGUsIHNob3dpbmcgdGhhdCB0aGVyZSBpcyBzaWduaWZpY2FudCB2YXJpYWJpbGl0eSBhbW9uZ3N0IGJvdGggaW5kaXZpZHVhbCBTdG9ja3MgYW5kIEVURnMuIEFkZGl0aW9uYWxseSwgdGhlIG1lZGlhbnMgYXJlIHF1aXRlIGxvdyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZXMgb2YgbWFueSBvZiB0aGUgdmFyaWFibGVzLCBpbmRpY2F0aW5nIHRoYXQgc29tZSBzdG9ja3MvRVRGcyB3aXRoIGEgbG90IG1vcmUgdHJhZGluZyBhY3Rpdml0eSBkcml2ZSB0aGUgbnVtYmVycyB1cC4NCg0KRVRGcyBhcHBlYXIgdG8gaGF2ZSBhIG11Y2ggaGlnaGVyIG9yZGVyIHZvbHVtZSByZWxhdGl2ZSB0byBTdG9ja3MsIHdpdGggYW4gYXZlcmFnZSBvcmRlciB2b2x1bWUgb2Ygb2YgMTIySyBmb3IgRVRGcyBhbmQgb25seSAxNksgZm9yIFN0b2Nrcy4NCg0KDQpgYGB7cn0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0Kb3B0aW9ucyhkaWdpdHM9MykNClN1bV9zdGF0cyA8LSBTRUNfY29tYiAlPiUNCiAgc2VsZWN0KFNlY3VyaXR5LCBMaXRWb2wuLjAwMC4sICBPcmRlclZvbC4uMDAwLiwgSGlkZGVuLCBUcmFkZXNGb3JIaWRkZW4sIA0KICAgICAgICAgSGlkZGVuVm9sLi4wMDAuLCBUcmFkZVZvbEZvckhpZGRlbi4uMDAwLiwgQ2FuY2VscywgTGl0VHJhZGVzLCBPZGRMb3RzLCANCiAgICAgICAgIFRyYWRlc0Zvck9kZExvdHMsIE9kZExvdFZvbC4uMDAwLiwgVHJhZGVWb2xGb3JPZGRMb3RzLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoU2VjdXJpdHkpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gbWVkaWFuLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1TZWN1cml0eSkNClN1bV9zdGF0cw0KYGBgDQoNCiMjIFNlbGVjdCBhIHNhbXBsZSBmcm9tIFExXzIwMTINCg0KSW4gb3JkZXIgdG8gc2VsZWN0IGEgcmFuZG9tIHNhbXBsZSBvZiAxMDAgU3RvY2tzIGFuZCBFVEZzLCBJIGZpcnN0IHNwbGl0IHRoZSBRMV8yMDEyIGludG8gdHdvIGRhdGEgZnJhbWVzIGJ5IGFwcGx5aW5nIGEgZmlsdGVyOyBvbmUgZm9yIFNUT0NLcyBhbmQgb25lIGZvciBFVEZzLiBJIHRoZW4gcHVsbGVkIDEwMCByYW5kb20gc3RvY2tzIGFuZCBFVEZzIGZyb20gZWFjaCBmaWxlLCBhbmQgc2V0IHRoZW0gYXMgYW4gb2JqZWN0IHRvIGJlIHF1ZXJpZWQgZWFjaCB0aW1lIEkgY3JlYXRlIGEgZGF0YSBmcmFtZSB0byBiZSBwbG90dGVkLg0KDQpgYGB7cn0NCnExXzIwMTIgPC0gdHJhbnNmb3JtKHExXzIwMTIsIERhdGUgPSBhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgIiVZJW0lZCIpKQ0KcTFfMjAxMl9TVE9DSyA8LSBmaWx0ZXIocTFfMjAxMixTZWN1cml0eSA9PSAiU3RvY2siKQ0KcTFfMjAxMl9FVEYgPC0gZmlsdGVyKHExXzIwMTIsU2VjdXJpdHkgPT0gIkVURiIpDQpzdG9ja19saXN0IDwtIHVuaXF1ZShxMV8yMDEyX1NUT0NLJFRpY2tlcikNCnN0b2NrX2xpc3Rfc2FtcGxlIDwtIHNhbXBsZShzdG9ja19saXN0LCAxMDApDQpFVEZfbGlzdCA8LSB1bmlxdWUocTFfMjAxMl9FVEYkVGlja2VyKQ0KRVRGX2xpc3Rfc2FtcGxlIDwtIHNhbXBsZShFVEZfbGlzdCwxMDApDQpzdG9ja19saXN0X3NhbXBsZQ0KRVRGX2xpc3Rfc2FtcGxlDQpTRUNfY29tYl9TVE9DSyA8LSBmaWx0ZXIoU0VDX2NvbWIsU2VjdXJpdHkgPT0gIlN0b2NrIikNClNFQ19jb21iX0VURiA8LSBmaWx0ZXIoU0VDX2NvbWIsU2VjdXJpdHkgPT0gIkVURiIpDQpgYGANCg0KIyMgQnVpbGQgdGhlIFBsb3RzDQoNCkdpdmVuIHRoZSBjb21wbGV4IG1hdHJpeCBvZiBkYXRhICgxMDAgc3RvY2tzIGFuZCAxMDAgRVRGcyBmb3IgMTIgdmFyaWFibGVzIGFjcm9zcyA1IHN0YXRpc3RpY3MgcGxvdHRlZCBvbiBhIHRpbWUgc2VyaWVzKSwgSSBlbGVjdGVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIHBsb3QgZm9yIGVhY2ggb2YgdGhlIDEyIHZhcmlhYmxlcywgcGxvdHRpbmcgdGhlIDUgc3VtbWFyeSBzdGF0aXN0aWNzIG9uIGEgdGltZSBzZXJpZXMuIFRoZSBwbG90cyBhcmUgc2hvd24gYmVsb3cNCg0KIyMjIFN0b2NrIExpdFZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfTGl0Vm9sIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgTGl0Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19MaXRWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBPcmRlclZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfT3JkZXJWb2wgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPcmRlclZvbC4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfT3JkZXJWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBIaWRkZW4gUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0hpZGRlbiA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIEhpZGRlbikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfSGlkZGVuICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVzRm9ySGlkZGVuIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZXNGb3JIaWRkZW4gPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZXNGb3JIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCnN0b2NrX1RyYWRlc0ZvckhpZGRlbiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIEhpZGRlblZvbCAoMDAwcykgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0hpZGRlblZvbCA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIEhpZGRlblZvbC4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfSGlkZGVuVm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVWb2xGb3JIaWRkZW4gKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZVZvbEZvckhpZGRlbiA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIFRyYWRlVm9sRm9ySGlkZGVuLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19UcmFkZVZvbEZvckhpZGRlbiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIENhbmNlbHMgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0NhbmNlbHMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBDYW5jZWxzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19DYW5jZWxzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgTGl0VHJhZGVzIFBsb3QNCg0KYGBge3J9DQpzdG9ja19MaXRUcmFkZXMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBMaXRUcmFkZXMpICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCnN0b2NrX0xpdFRyYWRlcyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIE9kZExvdHMgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX09kZExvdHMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPZGRMb3RzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19PZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVzRm9yT2RkTG90cyBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfVHJhZGVGb3JPZGRMb3RzIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVzRm9yT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfVHJhZGVGb3JPZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgT2RkTG90Vm9sICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfT2RkTG90Vm9sIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgT2RkTG90Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19PZGRMb3RWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBUcmFkZVZvbEZvck9kZExvdHMgKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZVZvbGRGb3JPZGRMb3RzIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVWb2xGb3JPZGRMb3RzLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19UcmFkZVZvbGRGb3JPZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIExpdFZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX0xpdFZvbCA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgTGl0Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfTGl0Vm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIE9yZGVyVm9sKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpFVEZfT3JkZXJWb2wgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIE9yZGVyVm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfT3JkZXJWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgSGlkZGVuIFBsb3QNCg0KYGBge3J9DQpFVEZfSGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9IaWRkZW4gJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVzRm9ySGlkZGVuIFBsb3QNCg0KYGBge3J9DQpFVEZfVHJhZGVzRm9ySGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZXNGb3JIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9UcmFkZXNGb3JIaWRkZW4gJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgSGlkZGVuVm9sICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX0hpZGRlblZvbCA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgSGlkZGVuVm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfSGlkZGVuVm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIFRyYWRlVm9sRm9ySGlkZGVuICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlVm9sRm9ySGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZVZvbEZvckhpZGRlbi4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlVm9sRm9ySGlkZGVuICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIENhbmNlbHMgUGxvdA0KDQpgYGB7cn0NCkVURl9DYW5jZWxzIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBDYW5jZWxzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfQ2FuY2VscyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBMaXRUcmFkZXMgUGxvdA0KDQpgYGB7cn0NCkVURl9MaXRUcmFkZXMgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIExpdFRyYWRlcykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX0xpdFRyYWRlcyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBPZGRMb3RzIFBsb3QNCg0KYGBge3J9DQpFVEZfT2RkTG90cyA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX09kZExvdHMgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVzRm9yT2RkTG90cyBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlRm9yT2RkTG90cyA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVzRm9yT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlRm9yT2RkTG90cyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBPZGRMb3RWb2wgKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpFVEZfT2RkTG90Vm9sIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPZGRMb3RWb2wuLjAwMC4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9PZGRMb3RWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVWb2xGb3JPZGRMb3RzICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlVm9sZEZvck9kZExvdHMgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIFRyYWRlVm9sRm9yT2RkTG90cy4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlVm9sZEZvck9kZExvdHMgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCg0KVGhlIGluZGl2aWR1YWwgcGxvdHMgZm9yIEVURnMgYW5kIFN0b2NrcyBpbiBRMSAyMDEyIGFyZSBpbiBsaW5lIHdpdGggdGhlIG92ZXJhbGwgU0VDIGNvbWJpbmVkIGZpbGUgc3VtbWFyeSBzdGF0aXN0aWNzLiAgU3RhbmRhcmQgZGV2aWF0aW9ucyBhcmUgbXVjaCBoaWdoZXIgdGhhbiB0aGUgbWVhbiBhY3Jvc3MgdGhlIGJvYXJkLCBhbmQgRVRGIG9yZGVyIHZvbHVtZXMgYXJlIGFsc28gbXVjaCBoaWdoZXIgdGhhbiBzdG9ja3MuIEFsc28sIGludGVyZXN0aW5nbHksIG1hbnkgb2YgdGhlIFN0b2NrIGdyYXBocyBzaG93IGEgc2lnbmlmaWNhbnQgc3Bpa2UgaW4gc3RhbmRhcmQgZGV2aWF0aW9uIGF0IGRpZmZlcmVudCBwZXJpb2RzIHRocm91Z2hvdXQgdGhlIHRpbWUgc2VyaWVzLCBzdWdnZXN0aW5nIHRoYXQgdGhlcmUgYXJlIG9uZSBvZmYgZXZlbnRzIHRoYXQgZHJhbWF0aWNhbGx5IGluZmx1ZW5jZXMgdHJhZGluZyBhY3Rpdml0eSBvdmVyIHRoZSBwZXJpb2QuIFRoZSBPZGRMb3RWb2wgYW5kIE9kZExvdCBncmFwaHMgZm9yIGJvdGggc3RvY2tzIGFuZCBFVEZzIGFsc28gdGVsbCBhbiBpbnRlcmVzdGluZyBzdG9yeSwgd2hpY2ggaXMgdGhhdCBvdmVyIHRpbWUsIHRoZSB0cmFkZSBiYXRjaGVzIGdvdCBzbWFsbGVyIHJlbGF0aXZlIHRvIHRoZSBvdmVyYWxsIGFtb3VudCBvZiB0cmFkZXMuIFRoZSByYW5kb20gc2FtcGxpbmcgd2UgcGVyZm9ybWVkIHNob3dzIHRoYXQgd2UgaGF2ZSBzZWxlY3RlZCBhIHBvb2wgb2Ygc3RvY2tzIGFuZCBFVEZzIHdpdGggYSBicm9hZCBsZXZlbCBvZiB0cmFkaW5nIGFjdGl2aXR5LCBhbmQgcGVyaGFwcyBpZiB3ZSBjb252ZXJ0ZWQgdGhlIHN0b2NrcyBpbnRvIGJpbnMgd2l0aCB0cmFkaW5nIHRocmVzaG9sZHMsIHdlIHdvdWxkIGJlIGFibGUgdG8gcGVyZm9ybSBtb3JlIGluZm9ybWF0aXZlIGFuYWx5c2lzIG9uIHN0b2NrcyBhbmQgRVRGcyB0aGF0IGZhbGwgd2l0aGluIGEgY2VydGFpbiByYW5nZSBvZiB0cmFkaW5nIHZvbHVtZS4=