Description of A simple Trading Strategy
The simple strategy follows that given a list of stocks, we want download is’s associated data in terms of open and closing prices from an API such as Yahoo Finance. Afterwards we would want to find those stocks has closed at 70 day high (i.e. the last closing price to be the #highest over the past 70 days), and over this period the 50-day MA always #stays above the 100-day MA.
start<-as.Date("2010-01-10")
end<-Sys.Date()
simple_strategy= function(start_date,end_date,tickers){
library(tidyquant)
library(zoo)
library(furrr)
library(tidyverse)
start<-as.Date(start_date)
end <-as.Date(end_date)
p <- tidyquant::tq_get(tickers , get = "stock.prices", from = start,
to =end)
p= na.omit(p)
#p <-quantmod:: getSymbols("AMZ", from = start,
# to = end, warnings = FALSE, src = 'yahoo',
# auto.assign = TRUE)
#p= get(p)
#p=na.approx(p)
prices <- p %>%
tidyquant::tq_mutate(select = close, mutate_fun = SMA, n = 100) %>%
dplyr::rename(SMA100 = SMA) %>%
tidyquant::tq_mutate(select = close, mutate_fun = SMA, n = 50) %>%
dplyr::rename(SMA50 = SMA)
prices<-
prices%>% dplyr::mutate(rolling70= c(rep(NA,69),rollmax(close, 70)))
df=
prices %>% dplyr::filter(close==rolling70)%>%
dplyr::filter(SMA50>SMA100)
return(df)
}
# for a single stock ,we can run the strategy function below which returns a dataframe which meets the strategy conditions
tickers <- c("GOOGL")
re=simple_strategy(start,end,tickers)
#For multiple stocks we can take advantage of functional programming where we can repeat the function for many stock indicators using a parallel version of the map function of the purrr package. The parallel version of the purrr package is the furrr package.
ticker= c("FB", "AAPL", "MSFT","GOOGL","TSLA","AMZ")
result =furrr::future_map_dfr(ticker,
function(x) simple_strategy(start_date=start,
end_date=end,
tickers=x))
#Equivalently, uisng a for loop
#result= list()
#for( i in 1:length(ticker)){
#result[[i]] = simple_strategy(start,end,ticker[i])
#}
result %>% head()%>%
kable(escape = F, align = "c") %>%
kable_styling(c("striped", "condensed"), full_width = F)
symbol
|
date
|
open
|
high
|
low
|
close
|
volume
|
adjusted
|
SMA100
|
SMA50
|
rolling70
|
FB
|
2012-12-13
|
27.59
|
28.75
|
27.43
|
28.24
|
81051600
|
28.24
|
21.9831
|
22.7988
|
28.24
|
FB
|
2013-01-04
|
28.01
|
28.93
|
27.83
|
28.76
|
72715400
|
28.76
|
22.4882
|
24.7086
|
28.76
|
FB
|
2013-01-07
|
28.69
|
29.79
|
28.65
|
29.42
|
83781800
|
29.42
|
22.5643
|
24.9106
|
29.42
|
FB
|
2013-01-09
|
29.67
|
30.60
|
29.49
|
30.59
|
104787700
|
30.59
|
22.7410
|
25.2490
|
30.59
|
FB
|
2013-01-10
|
30.60
|
31.45
|
30.28
|
31.30
|
95316400
|
31.30
|
22.8420
|
25.4238
|
31.30
|
FB
|
2013-01-11
|
31.28
|
31.96
|
31.10
|
31.72
|
89598000
|
31.72
|
22.9605
|
25.6194
|
31.72
|
library(viridis)
library(scales)
#start <- end - weeks(24)
start<-as.Date("2010-01-10")
end<-Sys.Date()
ticker= c("FB", "AAPL", "MSFT","GOOGL")
p1 <- tidyquant::tq_get(ticker,
get = "stock.prices",
from = start,
to =end) %>%
#filter(date >= start - days(2 * 20)) %>%
ggplot(aes(x = date, y = close,
open = open, high = high, low = low, close = close,
group = symbol)) +
geom_barchart( colour_up = "#FDE725FF",
colour_down = "#440154FF",
fill_up = "#FDE725FF",
fill_down = "#440154FF") +
geom_bbands(ma_fun = SMA, sd = 2, n = 50, linetype = 5,color_ma = "#55C667FF") +
labs(title = "50 Day Simple Moving Average of Several Stocks ",
subtitle = "BBands with SMA Applied",
y = "Closing Price", x = "") +
coord_x_date(xlim = c(start, end)) +
facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
#scale_color_viridis_d(option="D") +
scale_x_date(labels = date_format("%d-%m-%Y"),date_breaks = "2 year") +
theme(axis.text.x=element_text(angle=45, hjust=1)) +
labs(caption = "www.restsanalytics.com")
p1

#(gg <- ggplotly(p1, tooltip = "symbol"))
#gg=highlight(gg, "plotly_hover")
#htmlwidgets::saveWidget(as_widget(gg), "p1.html")
#gg
ticker= c("FB", "AAPL", "MSFT","GOOGL")
p2 <- tidyquant::tq_get(ticker,
get = "stock.prices",
from = start,
to =end) %>%
#filter(date >= start - days(2 * 20)) %>%
ggplot(aes(x = date, y = close,
open = open, high = high, low = low, close = close,
group = symbol)) +
geom_barchart( colour_up = "#FDE725FF",
colour_down = "#440154FF",
fill_up = "#FDE725FF",
fill_down = "#440154FF") +
geom_bbands(ma_fun = SMA, sd = 2, n = 100, linetype = 5,color_ma = "#55C667FF") +
labs(title = "100 Day Simple Moving Average of Several Stocks ",
subtitle = "BBands with SMA Applied",
y = "Closing Price", x = "") +
coord_x_date(xlim = c(start, end)) +
facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
#scale_color_viridis_d(option="D") +
scale_x_date(labels = date_format("%d-%m-%Y"),date_breaks = "2 year") +
theme(axis.text.x=element_text(angle=45, hjust=1)) +
labs(caption = "www.restsanalytics.com")
#gg <- ggplotly(p2, tooltip = "symbol")
#gg=highlight(gg, "plotly_hover")
#htmlwidgets::saveWidget(as_widget(gg), "p2.html")
p2

LS0tDQp0aXRsZTogU2ltcGxlIFRyYWRpbmcgU3RyYXRlZ3kNCnN1YnRpdGxlOiANCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBrZWVwX21kOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgI3RoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUgIyB0YWJsZSBvZiBjb250ZW50IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgICMgdXB0byB0aHJlZSBkZXB0aHMgb2YgaGVhZGluZ3MgKHNwZWNpZmllZCBieSAjLCAjIyBhbmQgIyMjKQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgIyMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQphdXRob3I6IE5hbmEgQm9hdGVuZw0KVGltZTogJ2ByIFN5cy50aW1lKClgJw0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIg0KcGFyYW1zOg0KICBzZXJpZXM6ICcyJw0KdGFnczogVHJhZGluZyBzdHJhdGVneSxTdG9ja3MsIFF1YW50aXRhdGl2ZSBGaW5hbmNlLCBBc3NldCBSZXR1cm4sIHRpZHlxdWFudCxxdWFudG1vZCANCiAgDQotLS0NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICAgICAgICAgICAgICAgICAgZWNobyAgICAgICA9IFRSVUUsDQogICAgICAgICAgICAgICAgICBldmFsICAgICAgID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgIGRwaSAgICAgICAgPSAzMDAsDQogICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gID0gImNlbnRlciIpDQpgYGANCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShwYmFwcGx5KQ0KbGlicmFyeShUVFIpDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHRpZHlxdWFudCkNCmxpYnJhcnkodGltZXRrKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCmxpYnJhcnkoa2FibGVFeHRyYSkNCm9wdGlvbnMoZHBseXIucHJpbnRfbWF4ID0gMWU5KQ0KcGFjbWFuOjpwX2xvYWQoZHlncmFwaHMsRFQsdGlkeXZlcnNlLGphbml0b3IsZ2d0aGVtZXMsc2NhbGVzLGdncHVicix2aXJpZGlzKQ0KDQp0aGVtZV9zZXQodGhlbWVfcHViY2xlYW4oKSkNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KIyMjIyBEZXNjcmlwdGlvbiBvZiAgQSBzaW1wbGUgVHJhZGluZyBTdHJhdGVneQ0KDQpUaGUgc2ltcGxlIHN0cmF0ZWd5IGZvbGxvd3MgdGhhdCBnaXZlbiBhIGxpc3Qgb2Ygc3RvY2tzLCB3ZSB3YW50IGRvd25sb2FkIGlzJ3MgYXNzb2NpYXRlZCBkYXRhIGluIHRlcm1zIG9mIG9wZW4gYW5kIGNsb3NpbmcgcHJpY2VzIGZyb20gYW4gQVBJIHN1Y2ggYXMgWWFob28gRmluYW5jZS4gQWZ0ZXJ3YXJkcyB3ZSB3b3VsZCB3YW50IHRvIGZpbmQgdGhvc2Ugc3RvY2tzICBoYXMgY2xvc2VkIGF0IDcwIGRheSBoaWdoIChpLmUuIHRoZSBsYXN0IGNsb3NpbmcgcHJpY2UgdG8gYmUgdGhlICNoaWdoZXN0IG92ZXIgdGhlIHBhc3QgNzAgZGF5cyksIGFuZCBvdmVyIHRoaXMgcGVyaW9kIHRoZSA1MC1kYXkgTUEgYWx3YXlzICNzdGF5cyBhYm92ZSB0aGUgMTAwLWRheSBNQS4NCg0KDQoNCg0KYGBge3J9DQoNCnN0YXJ0PC1hcy5EYXRlKCIyMDEwLTAxLTEwIikNCmVuZDwtU3lzLkRhdGUoKQ0KDQoNCg0KDQpzaW1wbGVfc3RyYXRlZ3k9IGZ1bmN0aW9uKHN0YXJ0X2RhdGUsZW5kX2RhdGUsdGlja2Vycyl7DQoNCmxpYnJhcnkodGlkeXF1YW50KSANCmxpYnJhcnkoem9vKSAgDQpsaWJyYXJ5KGZ1cnJyKSANCmxpYnJhcnkodGlkeXZlcnNlKSAgDQogIA0KDQoNCnN0YXJ0PC1hcy5EYXRlKHN0YXJ0X2RhdGUpDQplbmQgPC1hcy5EYXRlKGVuZF9kYXRlKQ0KDQpwICA8LSB0aWR5cXVhbnQ6OnRxX2dldCh0aWNrZXJzICwgZ2V0ID0gInN0b2NrLnByaWNlcyIsIGZyb20gPSBzdGFydCwNCiAgICAgICAgICAgdG8gPWVuZCkNCg0KDQpwPSBuYS5vbWl0KHApDQojcCA8LXF1YW50bW9kOjogZ2V0U3ltYm9scygiQU1aIiwgZnJvbSA9IHN0YXJ0LA0KIyAgICAgICAgICAgIHRvID0gZW5kLCB3YXJuaW5ncyA9IEZBTFNFLCBzcmMgPSAneWFob28nLA0KIyAgICAgICAgICAgYXV0by5hc3NpZ24gPSBUUlVFKQ0KI3A9IGdldChwKQ0KDQojcD1uYS5hcHByb3gocCkNCg0KDQoNCnByaWNlcyA8LSAgcCAlPiUNCiAgICB0aWR5cXVhbnQ6OnRxX211dGF0ZShzZWxlY3QgPSBjbG9zZSwgbXV0YXRlX2Z1biA9IFNNQSwgbiA9IDEwMCkgJT4lDQogICAgZHBseXI6OnJlbmFtZShTTUExMDAgPSBTTUEpICU+JQ0KICAgIHRpZHlxdWFudDo6dHFfbXV0YXRlKHNlbGVjdCA9IGNsb3NlLCBtdXRhdGVfZnVuID0gU01BLCBuID0gNTApICU+JQ0KICAgIGRwbHlyOjpyZW5hbWUoU01BNTAgPSBTTUEpDQoNCg0KcHJpY2VzPC0NCiAgIHByaWNlcyU+JSBkcGx5cjo6bXV0YXRlKHJvbGxpbmc3MD0gYyhyZXAoTkEsNjkpLHJvbGxtYXgoY2xvc2UsIDcwKSkpDQoNCg0KZGY9DQpwcmljZXMgJT4lIGRwbHlyOjpmaWx0ZXIoY2xvc2U9PXJvbGxpbmc3MCklPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoU01BNTA+U01BMTAwKQ0KDQogDQogcmV0dXJuKGRmKSANCiAgDQp9DQoNCg0KDQoNCg0KIyBmb3IgYSBzaW5nbGUgc3RvY2sgLHdlIGNhbiBydW4gdGhlIHN0cmF0ZWd5IGZ1bmN0aW9uIGJlbG93IHdoaWNoIHJldHVybnMgYSBkYXRhZnJhbWUgd2hpY2ggbWVldHMgdGhlIHN0cmF0ZWd5IGNvbmRpdGlvbnMNCnRpY2tlcnMgPC0gYygiR09PR0wiKQ0KcmU9c2ltcGxlX3N0cmF0ZWd5KHN0YXJ0LGVuZCx0aWNrZXJzKQ0KDQoNCg0KDQojRm9yIG11bHRpcGxlICBzdG9ja3Mgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgd2hlcmUgd2UgY2FuIHJlcGVhdCB0aGUgZnVuY3Rpb24gZm9yIG1hbnkgc3RvY2sgaW5kaWNhdG9ycyB1c2luZyBhIHBhcmFsbGVsIHZlcnNpb24gb2YgdGhlIG1hcCBmdW5jdGlvbiBvZiB0aGUgcHVycnIgcGFja2FnZS4gVGhlIHBhcmFsbGVsIHZlcnNpb24gb2YgdGhlIHB1cnJyIHBhY2thZ2UgaXMgdGhlIGZ1cnJyIHBhY2thZ2UuDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIiwiVFNMQSIsIkFNWiIpDQoNCnJlc3VsdCA9ZnVycnI6OmZ1dHVyZV9tYXBfZGZyKHRpY2tlciwNCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBzaW1wbGVfc3RyYXRlZ3koc3RhcnRfZGF0ZT1zdGFydCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2RhdGU9ZW5kLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXJzPXgpKQ0KDQoNCiNFcXVpdmFsZW50bHksIHVpc25nIGEgZm9yIGxvb3ANCiNyZXN1bHQ9IGxpc3QoKQ0KI2ZvciggaSBpbiAxOmxlbmd0aCh0aWNrZXIpKXsNCiNyZXN1bHRbW2ldXSAgPSBzaW1wbGVfc3RyYXRlZ3koc3RhcnQsZW5kLHRpY2tlcltpXSkNCiN9DQoNCg0KDQpyZXN1bHQgJT4lICBoZWFkKCklPiUNCiAga2FibGUoZXNjYXBlID0gRiwgYWxpZ24gPSAiYyIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiY29uZGVuc2VkIiksIGZ1bGxfd2lkdGggPSBGKQ0KICANCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShzY2FsZXMpDQoNCiNzdGFydCA8LSBlbmQgLSB3ZWVrcygyNCkNCg0KDQpzdGFydDwtYXMuRGF0ZSgiMjAxMC0wMS0xMCIpDQplbmQ8LVN5cy5EYXRlKCkNCg0KDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIikNCg0KIHAxIDwtIHRpZHlxdWFudDo6dHFfZ2V0KHRpY2tlciwgDQogICAgICAgICAgICAgICAgICAgICAgICBnZXQgPSAic3RvY2sucHJpY2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhcnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgdG8gPWVuZCkgJT4lDQogICAgI2ZpbHRlcihkYXRlID49IHN0YXJ0IC0gZGF5cygyICogMjApKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgb3BlbiA9IG9wZW4sIGhpZ2ggPSBoaWdoLCBsb3cgPSBsb3csIGNsb3NlID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgZ3JvdXAgPSBzeW1ib2wpKSArDQogICAgZ2VvbV9iYXJjaGFydCggY29sb3VyX3VwID0gIiNGREU3MjVGRiIsDQogIGNvbG91cl9kb3duID0gIiM0NDAxNTRGRiIsDQogIGZpbGxfdXAgPSAiI0ZERTcyNUZGIiwNCiAgZmlsbF9kb3duID0gIiM0NDAxNTRGRiIpICsNCiAgICBnZW9tX2JiYW5kcyhtYV9mdW4gPSBTTUEsIHNkID0gMiwgbiA9IDUwLCBsaW5ldHlwZSA9IDUsY29sb3JfbWEgPSAiIzU1QzY2N0ZGIikgKw0KICAgIGxhYnModGl0bGUgPSAiNTAgRGF5IFNpbXBsZSBNb3ZpbmcgQXZlcmFnZSBvZiBTZXZlcmFsIFN0b2NrcyAiLCANCiAgICAgICAgIHN1YnRpdGxlID0gIkJCYW5kcyB3aXRoIFNNQSBBcHBsaWVkIiwgDQogICAgICAgICB5ID0gIkNsb3NpbmcgUHJpY2UiLCB4ID0gIiIpICsgDQogICANCiAgICBjb29yZF94X2RhdGUoeGxpbSA9IGMoc3RhcnQsIGVuZCkpICsNCiAgICBmYWNldF93cmFwKH4gc3ltYm9sLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgDQogICAgI3NjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb249IkQiKSArDQogIA0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVkLSVtLSVZIiksZGF0ZV9icmVha3MgPSAiMiB5ZWFyIikgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKSArDQogICBsYWJzKGNhcHRpb24gPSAid3d3LnJlc3RzYW5hbHl0aWNzLmNvbSIpDQoNCiAgICANCnAxDQojKGdnIDwtIGdncGxvdGx5KHAxLCB0b29sdGlwID0gInN5bWJvbCIpKQ0KI2dnPWhpZ2hsaWdodChnZywgInBsb3RseV9ob3ZlciIpDQojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KGdnKSwgInAxLmh0bWwiKQ0KI2dnDQoNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KDQp0aWNrZXI9IGMoIkZCIiwgIkFBUEwiLCAiTVNGVCIsIkdPT0dMIikNCg0KcDIgPC0gIHRpZHlxdWFudDo6dHFfZ2V0KHRpY2tlciwgDQogICAgICAgICAgICAgICAgICAgICAgICBnZXQgPSAic3RvY2sucHJpY2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhcnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgdG8gPWVuZCkgJT4lDQogICAgI2ZpbHRlcihkYXRlID49IHN0YXJ0IC0gZGF5cygyICogMjApKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgb3BlbiA9IG9wZW4sIGhpZ2ggPSBoaWdoLCBsb3cgPSBsb3csIGNsb3NlID0gY2xvc2UsIA0KICAgICAgICAgICAgICAgZ3JvdXAgPSBzeW1ib2wpKSArDQogICAgZ2VvbV9iYXJjaGFydCggY29sb3VyX3VwID0gIiNGREU3MjVGRiIsDQogIGNvbG91cl9kb3duID0gIiM0NDAxNTRGRiIsDQogIGZpbGxfdXAgPSAiI0ZERTcyNUZGIiwNCiAgZmlsbF9kb3duID0gIiM0NDAxNTRGRiIpICsNCiAgICBnZW9tX2JiYW5kcyhtYV9mdW4gPSBTTUEsIHNkID0gMiwgbiA9IDEwMCwgbGluZXR5cGUgPSA1LGNvbG9yX21hID0gIiM1NUM2NjdGRiIpICsNCiAgICBsYWJzKHRpdGxlID0gIjEwMCBEYXkgU2ltcGxlIE1vdmluZyBBdmVyYWdlIG9mIFNldmVyYWwgU3RvY2tzICIsIA0KICAgICAgICAgc3VidGl0bGUgPSAiQkJhbmRzIHdpdGggU01BIEFwcGxpZWQiLCANCiAgICAgICAgIHkgPSAiQ2xvc2luZyBQcmljZSIsIHggPSAiIikgKyANCiAgIA0KICAgIGNvb3JkX3hfZGF0ZSh4bGltID0gYyhzdGFydCwgZW5kKSkgKw0KICAgIGZhY2V0X3dyYXAofiBzeW1ib2wsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICANCiAgICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbj0iRCIpICsNCiAgDQogIHNjYWxlX3hfZGF0ZShsYWJlbHMgPSBkYXRlX2Zvcm1hdCgiJWQtJW0tJVkiKSxkYXRlX2JyZWFrcyA9ICIyIHllYXIiKSArDQogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsNCiAgIGxhYnMoY2FwdGlvbiA9ICJ3d3cucmVzdHNhbmFseXRpY3MuY29tIikNCg0KI2dnIDwtIGdncGxvdGx5KHAyLCB0b29sdGlwID0gInN5bWJvbCIpDQoNCiNnZz1oaWdobGlnaHQoZ2csICJwbG90bHlfaG92ZXIiKQ0KDQojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KGdnKSwgInAyLmh0bWwiKQ0KDQpwMg0KICAgDQogICANCmBgYA0KDQo=