General ideas before creating slide
First we create a Powerpoint document by importing a pptx file as an
R object. To make it most easy, I create my own powerpoint document
based on my own template that is my style. Of course you can create your
own template in Powerpoint office software. To do this, in Powerpoint
software: file -> new -> blank presentation: in View tab choose
Slide Master you can edit slide master as you wish then save file as any
name such as template.pptx. Using read_pptx() notice that an argument is
your template file.
Layout summary
layout_summary(my_pres )
## layout master
## 1 Title Slide Office Theme
## 2 Title and Content Office Theme
## 3 Section Header Office Theme
## 4 Two Content Office Theme
## 5 Comparison Office Theme
## 6 Title Only Office Theme
## 7 Blank Office Theme
This is Layout of my Powerpoint template Threre most important part
of creating an powerpoint in R is to understand the structure of
Layouts. My template file has 7 layout: Title Slide, Title and Content,
Section Header, Two Content, Comparison, Title Only,
View Layout property
It is very useful to uderstand the structure of layout_property of a
template. An object named lay_pro
is created
lay_pro <- my_pres %>% officer::layout_properties()
haven::write_sav(lay_pro,"my_pres_layout.sav") # write sav read by SPSS about Layout and property
To know the layout summary
layout_summary(my_pres )
## layout master
## 1 Title Slide Office Theme
## 2 Title and Content Office Theme
## 3 Section Header Office Theme
## 4 Two Content Office Theme
## 5 Comparison Office Theme
## 6 Title Only Office Theme
## 7 Blank Office Theme
glimpse(layout_summary(my_pres ))
## Rows: 7
## Columns: 2
## $ layout <chr> "Title Slide", "Title and Content", "Section Header", "Two Cont…
## $ master <chr> "Office Theme", "Office Theme", "Office Theme", "Office Theme",…
Layout properties
z1 <- layout_properties(my_pres, layout = "Title Slide")
z2 <- layout_properties(my_pres, layout = "Title and Content")
z3 <- layout_properties(my_pres, layout = "Section Header")
z4 <- layout_properties(my_pres, layout = "Two Content")
z5 <- layout_properties(my_pres, layout = "Comparison")
z6 <- layout_properties(my_pres, layout = "Title Only")
z7 <- layout_properties(my_pres, layout = "Blank")
#my_pres %>% layout_properties( layout = "Title and Content") %>% haven:: write_sav("my_pres_layout_properties.sav")
layout of templates
01. Title Slide
ggplot(z1, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

02. Title and Content
ggplot(z2, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

04. Two Content
ggplot(z4, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

05. Comparison
ggplot(z5, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

06. Title Only
ggplot(z6, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

07. Blank
ggplot(z7, aes(xmin = offx, ymin = -offy, xmax = offx + cx, ymax = -offy - cy)) +
geom_rect(fill = "pink") +
geom_text(aes(x = offx, y = -offy - cy/2, label = ph_label),
color = "black", size = 3.5, hjust = 0) +
theme_void()

Creat slides on Powerpoint based in your own template.
After you have your own template on your working directory, you will
add contents to the slide.
Creae your own first slide of a PowerPoint presentation. Your purpose
is to put contents onto the “Title slide”. Notice that understanding
properties of layout is very important since you should understand the
type, placeholder and other properties of your first slide.
z1 %>% knitr::kable()
Office Theme |
Title Slide |
ctrTitle |
1 |
2 |
Title 1 |
|
1.0000000 |
2.00000 |
11.333333 |
1.6076389 |
NA |
NA |
NA |
Office Theme |
Title Slide |
subTitle |
1 |
3 |
Subtitle 2 |
|
2.0000000 |
4.25000 |
9.333333 |
1.9166667 |
NA |
NA |
NA |
Office Theme |
Title Slide |
dt |
1 |
4 |
Date Placeholder 3 |
|
0.6666667 |
6.95139 |
3.111111 |
0.3993056 |
NA |
{E6744CE3-0875-4B69-89C0-6F72D8139561} |
datetimeFigureOut |
Office Theme |
Title Slide |
ftr |
1 |
5 |
Footer Placeholder 4 |
|
4.5555556 |
6.95139 |
4.222222 |
0.3993056 |
NA |
NA |
NA |
Office Theme |
Title Slide |
sldNum |
1 |
6 |
Slide Number Placeholder 5 |
|
9.5555556 |
6.95139 |
3.111111 |
0.3993056 |
NA |
{8DADB20D-508E-4C6D-A9E4-257D5607B0F6} |
slidenum |
Create the first slide: (“Title Slide)
We use add_slide()
to create a slide, you also
specify the layout of the slide, in this case I choe “Title Slide”,
because it is my first slide of powerpoint.
Also use add_slide()
function to put contents to
place holder.
Remember this slide: has two main placeholder:
Title 1
and Subtitle 2
we should enter command
as `
With Title 1
my_pres <- ph_with(my_pres, value = " your Title text....", location = ph_location_type(type = "ctrTitle"))
my_pres <- ph_with(my_pres, value = " your subtile text....", location = ph_location_type(type = "subTitle"))
my_pres <- add_slide(my_pres , layout = "Title Slide", master = "Office Theme")
my_pres <- ph_with(my_pres, value = " Resiliense for caregivers of Dementia", location = ph_location_type(type = "ctrTitle")) # Main title
my_pres <- ph_with(my_pres, value = " Dr Liem, Dr Loan", location = ph_location_type(type = "subTitle")) # subtitle
Create the next slide: (“Title and Content”)
- After creating “Title Slide”, We create another slide, since I want
to add contents to this slide I use
add_slide()
, however I
choose “Title and Content”.
- Also use
add_slide()
function to put contents to place
holder however since we need to put a lot of texts with different kind
of lists, so I use level_list()
function to create structure
of headings and unordered_list()
function to write
contents.
ul <- unordered_list(
level_list = c(1, 2, 1, 2, 2),
str_list = c("Câu hỏi nghiên cứu", "Ở người chăm sóc bệnh nhân sa sút trí tuệ, chiến lược thích nghi với căng thẳng là gì.
", "Mục tiêu", "Mô tả các đặc điểm thích nghi của người chăm sóc bệnh nhân sa sút trí tuệ.
", "Mô tả chiến lược thích nghi của người chăm sóc bệnh nhân sa sút trí tuệ...
"),
style = fp_text(color = "black", font.size = 0) )
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "Research Question and Objectives", location = ph_location_type(type = "title"))
my_pres <- ph_with(x = my_pres, value = ul,
location = ph_location_type(type = "body") )
Next slide of title and content
Next slide of title and content 3
# add slide
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
# add title of slide
my_pres <- ph_with(my_pres, value = "Objectives", location = ph_location_type(type = "title"))
# add body of slide
my_pres <- ph_with(my_pres, value = c("A novel model of resilience was tested in caregivers of people with mild-to-moderate dementia and was extended to explore whether including self-efficacy, optimism, and self-esteem improved its predictive value."), location = ph_location_type(type = "body"))
# Add footer
my_pres <- ph_with(my_pres, value = "https://doi.org/10.1186/s12877-023-04549-y", location = ph_location_type(type = "ftr"))
# Add footer with date
my_pres <- ph_with(my_pres, value = format(Sys.Date()), location = ph_location_type(type = "dt"))
# Add infor to footer
my_pres <- ph_with(my_pres, value = "slide thứ nhất", location = ph_location_type(type = "sldNum"))
We put table inside
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- on_slide(my_pres , index = 4)
my_pres <- ph_with(my_pres, value = "Psychological resilience", location = ph_location_type(type = "title"))
emp <- data.frame(name=c("Mild resilience", "Moderate resilience", "High resilience"), salary=c("Less than 50%", "50-75%", "More than 75%" )) # cteate a dataframe and make it to table
loc <- ph_location(
left=1.5,
top = 1.5,
width = 10,
height = 4,
rotation = 0,
bg="#333333"
)
my_pres <- ph_with(my_pres , emp, location = loc)
Add slide
my_pres <- add_slide(my_pres, layout = 'Title and Content', master = 'Office Theme')
my_pres <- ph_with(my_pres, value = "Sự thích nghi Resilient", location = ph_location_type(type = "title"))
my_pres <- ph_with(my_pres, c(
"Tự động viên - self-appraisal",
"Sự chấp nhận Aceptance",
"Hỗ trợ xã hội - Social support",
"Đời sống tâm linh- spirituality"
),
location = ph_location_type(type = "body") )
Add more slide
# add slide
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
# add title of slide
my_pres <- ph_with(my_pres, value = "Current study", location = ph_location_type(type = "title"))
# add body of slide
my_pres <- ph_with(my_pres, value = c("The present study found that there are factors relating to the caregiver and to the person with dementia that affect how resilient a dementia caregiver may be.", "It is apparent that caregiver resilience is not solely due to the personal assets and resources of the caregiver but may also be affected by the level of dependence of the person with dementia.", "Findings suggest that caregivers with high levels of neuroticism and low subjective caregiver competence"), location = ph_location_type(type = "body"))
add ggplot
library(ggplot2)
gg_plot <- ggplot(data = iris ) +
geom_point(
mapping = aes(Sepal.Length, Petal.Length, color = Species),
size = 3) + theme_minimal()
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "cho ggplot vô body", location = ph_location_type(type = "title"))
my_pres <- ph_with(x = my_pres, gg_plot,
location = ph_location_type(type = "body") )
add image
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "Thêm hình", location = ph_location_type(type = "title"))
img.file <- file.path( "i1.png" )
my_pres <- ph_with(x = my_pres, external_img(img.file, width = 1.58*3, height = 0.79*3),
location = ph_location_type(type = "body"), use_loc_size = TRUE )
add table
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "Thêm bảng", location = ph_location_type(type = "title"))
ft <- flextable(head(mtcars))
ft <- set_table_properties(ft, width = 0.5, layout = "autofit")
my_pres <- ph_with(x = my_pres, ft, location = ph_location_type(type = "body") )
add table in the center
my_pres <- add_slide(my_pres , layout = "Title and Content", master = "Office Theme")
my_pres <- ph_with(my_pres, value = "Thêm bảng", location = ph_location_type(type = "title"))
ft <- flextable(head(mtcars))
ft <- set_table_properties(ft, width = 0.5, layout = "autofit")
my_pres <- ph_with(x = my_pres, ft, location = ph_location(width = 7, height = 5, newlabel = "hello") )
LS0tDQp0aXRsZTogIm9mZmljZXIgYW5kIFBvd2VycG9pbnQgIg0Kc3VidGl0bGU6IDxhIG5hbWU9ImhvbWUiPjwvYT4NCmF1dGhvcjogIkhlbnJ5Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IGZhbHNlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgd29yZF9kb2N1bWVudHM6DQogICAgdG9jOiB0cnVlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHBhY21hbikNCnBfbG9hZCh0aWR5dmVyc2Usb2ZmaWNlcixoYXZlbiwgZ3QsIGZsZXh0YWJsZSkNCg0KYGBgDQoNCiMgR2VuZXJhbCBpZGVhcyBiZWZvcmUgY3JlYXRpbmcgc2xpZGUNCg0KRmlyc3Qgd2UgY3JlYXRlIGEgUG93ZXJwb2ludCBkb2N1bWVudCBieSBpbXBvcnRpbmcgYSBwcHR4IGZpbGUgYXMgYW4gUiBvYmplY3QuIFRvIG1ha2UgaXQgbW9zdCBlYXN5LCBJIGNyZWF0ZSBteSBvd24gcG93ZXJwb2ludCBkb2N1bWVudCBiYXNlZCBvbiBteSBvd24gdGVtcGxhdGUgdGhhdCBpcyBteSBzdHlsZS4gT2YgY291cnNlIHlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlIGluIFBvd2VycG9pbnQgb2ZmaWNlIHNvZnR3YXJlLiBUbyBkbyB0aGlzLCBpbiBQb3dlcnBvaW50IHNvZnR3YXJlOiBmaWxlIC1cPiBuZXcgLVw+IGJsYW5rIHByZXNlbnRhdGlvbjogaW4gVmlldyB0YWIgY2hvb3NlIFNsaWRlIE1hc3RlciB5b3UgY2FuIGVkaXQgc2xpZGUgbWFzdGVyIGFzIHlvdSB3aXNoIHRoZW4gc2F2ZSBmaWxlIGFzIGFueSBuYW1lIHN1Y2ggYXMgdGVtcGxhdGUucHB0eC4gVXNpbmcgcmVhZF9wcHR4KCkgbm90aWNlIHRoYXQgYW4gYXJndW1lbnQgaXMgeW91ciB0ZW1wbGF0ZSBmaWxlLg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbXlfcHJlcyAgPC0gcmVhZF9wcHR4KCJ0ZW1wbGF0ZS5wcHR4IikgDQpgYGANCg0KIyMgTGF5b3V0IHN1bW1hcnkNCg0KYGBge3J9DQpsYXlvdXRfc3VtbWFyeShteV9wcmVzICkNCmBgYA0KDQpUaGlzIGlzIExheW91dCBvZiBteSBQb3dlcnBvaW50IHRlbXBsYXRlIFRocmVyZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGNyZWF0aW5nIGFuIHBvd2VycG9pbnQgaW4gUiBpcyB0byB1bmRlcnN0YW5kIHRoZSBzdHJ1Y3R1cmUgb2YgTGF5b3V0cy4gTXkgdGVtcGxhdGUgZmlsZSBoYXMgNyBsYXlvdXQ6IFRpdGxlIFNsaWRlLCBUaXRsZSBhbmQgQ29udGVudCwgU2VjdGlvbiBIZWFkZXIsIFR3byBDb250ZW50LCBDb21wYXJpc29uLCBUaXRsZSBPbmx5LA0KDQojIyBWaWV3IExheW91dCBwcm9wZXJ0eQ0KDQpJdCBpcyB2ZXJ5IHVzZWZ1bCB0byB1ZGVyc3RhbmQgdGhlIHN0cnVjdHVyZSBvZiBsYXlvdXRfcHJvcGVydHkgb2YgYSB0ZW1wbGF0ZS4gQW4gb2JqZWN0IG5hbWVkIGBsYXlfcHJvYCBpcyBjcmVhdGVkDQoNCmBgYHtyfQ0KbGF5X3BybyA8LSBteV9wcmVzICAlPiUgICBvZmZpY2VyOjpsYXlvdXRfcHJvcGVydGllcygpIA0KaGF2ZW46OndyaXRlX3NhdihsYXlfcHJvLCJteV9wcmVzX2xheW91dC5zYXYiKSAjIHdyaXRlIHNhdiByZWFkIGJ5IFNQU1MgYWJvdXQgTGF5b3V0IGFuZCBwcm9wZXJ0eQ0KYGBgDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIEdseW1wZSBhdCBwb3dlciBwb2ludCBsYXlvdXQgcHJvcGVydGllcw0KI0xheW91dCBwcm9wZXJ0eSBpcyBhICJibGFjay1ib3giIG9mIFBvd2VycG9pbnQgc2xpZGUgbWFzdGVyDQpnbGltcHNlKGxheV9wcm8pDQpsYXlfcHJvICU+JSBndCgpDQpgYGANCg0KIyMgVG8ga25vdyB0aGUgbGF5b3V0IHN1bW1hcnkNCg0KYGBge3J9DQpsYXlvdXRfc3VtbWFyeShteV9wcmVzICkNCmBgYA0KDQpgYGB7cn0NCmdsaW1wc2UobGF5b3V0X3N1bW1hcnkobXlfcHJlcyApKQ0KYGBgDQoNCiMjIExheW91dCBwcm9wZXJ0aWVzDQoNCmBgYHtyfQ0KejEgPC0gbGF5b3V0X3Byb3BlcnRpZXMobXlfcHJlcywgbGF5b3V0ID0gIlRpdGxlIFNsaWRlIikNCnoyIDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIpDQp6MyA8LSBsYXlvdXRfcHJvcGVydGllcyhteV9wcmVzLCBsYXlvdXQgPSAiU2VjdGlvbiBIZWFkZXIiKQ0KejQgPC0gbGF5b3V0X3Byb3BlcnRpZXMobXlfcHJlcywgbGF5b3V0ID0gIlR3byBDb250ZW50IikNCno1IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJDb21wYXJpc29uIikNCno2IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJUaXRsZSBPbmx5IikNCno3IDwtIGxheW91dF9wcm9wZXJ0aWVzKG15X3ByZXMsIGxheW91dCA9ICJCbGFuayIpDQojbXlfcHJlcyAlPiUgbGF5b3V0X3Byb3BlcnRpZXMoIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIpICU+JSBoYXZlbjo6IHdyaXRlX3NhdigibXlfcHJlc19sYXlvdXRfcHJvcGVydGllcy5zYXYiKQ0KDQpgYGANCg0KIyMgbGF5b3V0IG9mIHRlbXBsYXRlcw0KDQojIyAwMS4gVGl0bGUgU2xpZGUNCg0KYGBge3J9DQpnZ3Bsb3QoejEsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwMi4gVGl0bGUgYW5kIENvbnRlbnQNCg0KYGBge3J9DQpnZ3Bsb3QoejIsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwMy4gU2VjdGlvbiBIZWFkZXINCg0KYGBge3J9DQpnZ3Bsb3QoejMsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwNC4gVHdvIENvbnRlbnQNCg0KYGBge3J9DQpnZ3Bsb3QoejQsIGFlcyh4bWluID0gb2ZmeCwgeW1pbiA9IC1vZmZ5LCB4bWF4ID0gb2ZmeCArIGN4LCB5bWF4ID0gLW9mZnkgLSBjeSkpICsgDQogIGdlb21fcmVjdChmaWxsID0gInBpbmsiKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBvZmZ4LCB5ID0gLW9mZnkgLSBjeS8yLCBsYWJlbCA9IHBoX2xhYmVsKSwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLjUsIGhqdXN0ID0gMCkgKw0KICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyAwNS4gQ29tcGFyaXNvbg0KDQpgYGB7cn0NCmdncGxvdCh6NSwgYWVzKHhtaW4gPSBvZmZ4LCB5bWluID0gLW9mZnksIHhtYXggPSBvZmZ4ICsgY3gsIHltYXggPSAtb2ZmeSAtIGN5KSkgKyANCiAgZ2VvbV9yZWN0KGZpbGwgPSAicGluayIpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IG9mZngsIHkgPSAtb2ZmeSAtIGN5LzIsIGxhYmVsID0gcGhfbGFiZWwpLCANCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMuNSwgaGp1c3QgPSAwKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCiMjIDA2LiBUaXRsZSBPbmx5DQoNCmBgYHtyfQ0KZ2dwbG90KHo2LCBhZXMoeG1pbiA9IG9mZngsIHltaW4gPSAtb2ZmeSwgeG1heCA9IG9mZnggKyBjeCwgeW1heCA9IC1vZmZ5IC0gY3kpKSArIA0KICBnZW9tX3JlY3QoZmlsbCA9ICJwaW5rIikgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gb2ZmeCwgeSA9IC1vZmZ5IC0gY3kvMiwgbGFiZWwgPSBwaF9sYWJlbCksIA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41LCBoanVzdCA9IDApICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyMgMDcuIEJsYW5rDQoNCmBgYHtyfQ0KZ2dwbG90KHo3LCBhZXMoeG1pbiA9IG9mZngsIHltaW4gPSAtb2ZmeSwgeG1heCA9IG9mZnggKyBjeCwgeW1heCA9IC1vZmZ5IC0gY3kpKSArIA0KICBnZW9tX3JlY3QoZmlsbCA9ICJwaW5rIikgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gb2ZmeCwgeSA9IC1vZmZ5IC0gY3kvMiwgbGFiZWwgPSBwaF9sYWJlbCksIA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41LCBoanVzdCA9IDApICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyBDcmVhdCBzbGlkZXMgb24gUG93ZXJwb2ludCBiYXNlZCBpbiB5b3VyIG93biB0ZW1wbGF0ZS4NCg0KQWZ0ZXIgeW91IGhhdmUgeW91ciBvd24gdGVtcGxhdGUgb24geW91ciB3b3JraW5nIGRpcmVjdG9yeSwgeW91IHdpbGwgYWRkIGNvbnRlbnRzIHRvIHRoZSBzbGlkZS4NCg0KQ3JlYWUgeW91ciBvd24gZmlyc3Qgc2xpZGUgb2YgYSBQb3dlclBvaW50IHByZXNlbnRhdGlvbi4gWW91ciBwdXJwb3NlIGlzIHRvIHB1dCBjb250ZW50cyBvbnRvIHRoZSAiVGl0bGUgc2xpZGUiLiBOb3RpY2UgdGhhdCB1bmRlcnN0YW5kaW5nIHByb3BlcnRpZXMgb2YgbGF5b3V0IGlzIHZlcnkgaW1wb3J0YW50IHNpbmNlIHlvdSBzaG91bGQgdW5kZXJzdGFuZCB0aGUgdHlwZSwgcGxhY2Vob2xkZXIgYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgeW91ciBmaXJzdCBzbGlkZS4NCg0KYGBge3J9DQp6MSAlPiUga25pdHI6OmthYmxlKCkNCmBgYA0KDQojIyBDcmVhdGUgdGhlIGZpcnN0IHNsaWRlOiAoIlRpdGxlIFNsaWRlKQ0KDQotICAgV2UgdXNlIGBhZGRfc2xpZGUoKWAgdG8gY3JlYXRlIGEgc2xpZGUsIHlvdSBhbHNvIHNwZWNpZnkgdGhlIGxheW91dCBvZiB0aGUgc2xpZGUsIGluIHRoaXMgY2FzZSBJIGNob2UgIlRpdGxlIFNsaWRlIiwgYmVjYXVzZSBpdCBpcyBteSBmaXJzdCBzbGlkZSBvZiBwb3dlcnBvaW50Lg0KDQotICAgQWxzbyB1c2UgYGFkZF9zbGlkZSgpYGZ1bmN0aW9uIHRvIHB1dCBjb250ZW50cyB0byBwbGFjZSBob2xkZXIuDQoNCi0gICBSZW1lbWJlciB0aGlzIHNsaWRlOiBoYXMgdHdvIG1haW4gcGxhY2Vob2xkZXI6IGBUaXRsZSAxYCBhbmQgYFN1YnRpdGxlIDJgIHdlIHNob3VsZCBlbnRlciBjb21tYW5kIGFzIFxgDQoNCiAgLSAgIFdpdGggYFRpdGxlIDFgDQoNCiAgIGAgbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIiB5b3VyIFRpdGxlIHRleHQuLi4uIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiY3RyVGl0bGUiKSlgDQogICANCiAgLSAgIFdpdGggYFN1YnRpdGxlIDJgDQoNCiAgYG15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICIgeW91ciBzdWJ0aWxlIHRleHQuLi4uIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAic3ViVGl0bGUiKSlgICAgDQoNCmBgYHtyfQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgU2xpZGUiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIiBSZXNpbGllbnNlIGZvciBjYXJlZ2l2ZXJzIG9mIERlbWVudGlhIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiY3RyVGl0bGUiKSkgIyBNYWluIHRpdGxlDQoNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICIgRHIgTGllbSwgRHIgTG9hbiIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInN1YlRpdGxlIikpICMgc3VidGl0bGUNCg0KYGBgDQoNCiMjIENyZWF0ZSB0aGUgbmV4dCBzbGlkZTogKCJUaXRsZSBhbmQgQ29udGVudCIpDQoNCi0gICBBZnRlciBjcmVhdGluZyAiVGl0bGUgU2xpZGUiLCBXZSBjcmVhdGUgYW5vdGhlciBzbGlkZSwgc2luY2UgSSB3YW50IHRvIGFkZCBjb250ZW50cyB0byB0aGlzIHNsaWRlIEkgdXNlIGBhZGRfc2xpZGUoKWAsIGhvd2V2ZXIgSSBjaG9vc2UgIlRpdGxlIGFuZCBDb250ZW50Ii4NCi0gICBBbHNvIHVzZSBgYWRkX3NsaWRlKClgZnVuY3Rpb24gdG8gcHV0IGNvbnRlbnRzIHRvIHBsYWNlIGhvbGRlciBob3dldmVyIHNpbmNlIHdlIG5lZWQgdG8gcHV0IGEgbG90IG9mIHRleHRzIHdpdGggZGlmZmVyZW50IGtpbmQgb2YgbGlzdHMsIHNvIEkgdXNlICBgbGV2ZWxfbGlzdCgpYGZ1bmN0aW9uIHRvIGNyZWF0ZSBzdHJ1Y3R1cmUgb2YgaGVhZGluZ3MgYW5kICBgdW5vcmRlcmVkX2xpc3QoKWBmdW5jdGlvbiB0byB3cml0ZSBjb250ZW50cy4NCg0KYGBge3J9DQp1bCA8LSB1bm9yZGVyZWRfbGlzdCgNCiAgbGV2ZWxfbGlzdCA9IGMoMSwgMiwgIDEsIDIsIDIpLA0KICBzdHJfbGlzdCA9IGMoIkPDonUgaOG7j2kgbmdoacOqbiBj4bupdSIsICLhu54gbmfGsOG7nWkgY2jEg20gc8OzYyBi4buHbmggbmjDom4gc2Egc8O6dCB0csOtIHR14buHLCBjaGnhur9uIGzGsOG7o2MgdGjDrWNoIG5naGkgduG7m2kgY8SDbmcgdGjhurNuZyBsw6AgZ8OsLg0KIiwgIk3hu6VjIHRpw6p1IiwgIk3DtCB04bqjIGPDoWMgxJHhurdjIMSRaeG7g20gdGjDrWNoIG5naGkgY+G7p2EgbmfGsOG7nWkgY2jEg20gc8OzYyBi4buHbmggbmjDom4gc2Egc8O6dCB0csOtIHR14buHLg0KIiwgIk3DtCB04bqjIGNoaeG6v24gbMaw4bujYyB0aMOtY2ggbmdoaSBj4bunYSBuZ8aw4budaSBjaMSDbSBzw7NjIGLhu4duaCBuaMOibiBzYSBzw7p0IHRyw60gdHXhu4cuLi4NCiIpLA0KICBzdHlsZSA9IGZwX3RleHQoY29sb3IgPSAiYmxhY2siLCBmb250LnNpemUgPSAwKSApDQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIlJlc2VhcmNoIFF1ZXN0aW9uIGFuZCBPYmplY3RpdmVzIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCm15X3ByZXMgPC0gcGhfd2l0aCh4ID0gbXlfcHJlcywgdmFsdWUgPSB1bCwgDQogICAgICAgICAgICAgICBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJib2R5IikgKQ0KDQoNCmBgYA0KDQojIyMgTmV4dCBzbGlkZSBvZiB0aXRsZSBhbmQgY29udGVudA0KDQojIyMgTmV4dCBzbGlkZSBvZiB0aXRsZSBhbmQgY29udGVudCAzDQoNCmBgYHtyfQ0KIyBhZGQgc2xpZGUNCm15X3ByZXMgIDwtIGFkZF9zbGlkZShteV9wcmVzICwgbGF5b3V0ID0gIlRpdGxlIGFuZCBDb250ZW50IiwgbWFzdGVyID0gIk9mZmljZSBUaGVtZSIpDQojIGFkZCB0aXRsZSBvZiBzbGlkZQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gIk9iamVjdGl2ZXMiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KIyBhZGQgYm9keSBvZiBzbGlkZQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIHZhbHVlID0gYygiQSBub3ZlbCBtb2RlbCBvZiByZXNpbGllbmNlIHdhcyB0ZXN0ZWQgaW4gY2FyZWdpdmVycyBvZiBwZW9wbGUgd2l0aCBtaWxkLXRvLW1vZGVyYXRlIGRlbWVudGlhIGFuZCB3YXMgZXh0ZW5kZWQgdG8gZXhwbG9yZSB3aGV0aGVyIGluY2x1ZGluZyBzZWxmLWVmZmljYWN5LCBvcHRpbWlzbSwgYW5kIHNlbGYtZXN0ZWVtIGltcHJvdmVkIGl0cyBwcmVkaWN0aXZlIHZhbHVlLiIpLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJib2R5IikpDQojIEFkZCBmb290ZXINCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICJodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTI4NzctMDIzLTA0NTQ5LXkiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJmdHIiKSkNCiMgQWRkIGZvb3RlciB3aXRoIGRhdGUNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9IGZvcm1hdChTeXMuRGF0ZSgpKSwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiZHQiKSkNCiMgQWRkIGluZm9yIHRvIGZvb3Rlcg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAic2xpZGUgdGjhu6kgbmjhuqV0IiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAic2xkTnVtIikpDQoNCmBgYA0KDQojIyBXZSBwdXQgdGFibGUgaW5zaWRlDQoNCmBgYHtyfQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCm15X3ByZXMgIDwtIG9uX3NsaWRlKG15X3ByZXMgLCBpbmRleCA9IDQpDQoNCm15X3ByZXMgPC0gcGhfd2l0aChteV9wcmVzLCB2YWx1ZSA9ICJQc3ljaG9sb2dpY2FsIHJlc2lsaWVuY2UiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KDQplbXAgPC0gZGF0YS5mcmFtZShuYW1lPWMoIk1pbGQgcmVzaWxpZW5jZSIsICJNb2RlcmF0ZSByZXNpbGllbmNlIiwgIkhpZ2ggcmVzaWxpZW5jZSIpLCBzYWxhcnk9YygiTGVzcyB0aGFuIDUwJSIsICI1MC03NSUiLCAiTW9yZSB0aGFuIDc1JSIgKSkgIyBjdGVhdGUgYSBkYXRhZnJhbWUgYW5kIG1ha2UgaXQgdG8gdGFibGUgDQoNCmxvYyA8LSBwaF9sb2NhdGlvbigNCiAgbGVmdD0xLjUsDQogIHRvcCA9IDEuNSwNCiAgd2lkdGggPSAxMCwNCiAgaGVpZ2h0ID0gNCwNCiAgcm90YXRpb24gPSAwLA0KICBiZz0iIzMzMzMzMyINCikNCg0KbXlfcHJlcyAgPC0gcGhfd2l0aChteV9wcmVzICwgZW1wLCBsb2NhdGlvbiA9IGxvYykNCg0KYGBgDQoNCiMjIEFkZCBzbGlkZQ0KDQpgYGB7cn0NCm15X3ByZXMgPC0gYWRkX3NsaWRlKG15X3ByZXMsIGxheW91dCA9ICdUaXRsZSBhbmQgQ29udGVudCcsIG1hc3RlciA9ICdPZmZpY2UgVGhlbWUnKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiU+G7sSB0aMOtY2ggbmdoaSBSZXNpbGllbnQiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KbXlfcHJlcyA8LSBwaF93aXRoKG15X3ByZXMsIGMoDQogICJU4buxIMSR4buZbmcgdmnDqm4gLSBzZWxmLWFwcHJhaXNhbCIsDQogICJT4buxIGNo4bqlcCBuaOG6rW4gQWNlcHRhbmNlIiwgDQogICJI4buXIHRy4bujIHjDoyBo4buZaSAtIFNvY2lhbCBzdXBwb3J0IiwNCiAgIsSQ4budaSBz4buRbmcgdMOibSBsaW5oLSBzcGlyaXR1YWxpdHkiDQogICAgKSwgDQogICAgICAgICAgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpICkgDQpgYGANCg0KIyMgQWRkIG1vcmUgc2xpZGUNCg0KYGBge3J9DQojIGFkZCBzbGlkZQ0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCiMgYWRkIHRpdGxlIG9mIHNsaWRlDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiQ3VycmVudCBzdHVkeSIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInRpdGxlIikpDQojIGFkZCBib2R5IG9mIHNsaWRlDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSBjKCJUaGUgcHJlc2VudCBzdHVkeSBmb3VuZCB0aGF0IHRoZXJlIGFyZSBmYWN0b3JzIHJlbGF0aW5nIHRvIHRoZSBjYXJlZ2l2ZXIgYW5kIHRvIHRoZSBwZXJzb24gd2l0aCBkZW1lbnRpYSB0aGF0IGFmZmVjdCBob3cgcmVzaWxpZW50IGEgZGVtZW50aWEgY2FyZWdpdmVyIG1heSBiZS4iLCAiSXQgaXMgYXBwYXJlbnQgdGhhdCBjYXJlZ2l2ZXIgcmVzaWxpZW5jZSBpcyBub3Qgc29sZWx5IGR1ZSB0byB0aGUgcGVyc29uYWwgYXNzZXRzIGFuZCByZXNvdXJjZXMgb2YgdGhlIGNhcmVnaXZlciBidXQgbWF5IGFsc28gYmUgYWZmZWN0ZWQgYnkgdGhlIGxldmVsIG9mIGRlcGVuZGVuY2Ugb2YgdGhlIHBlcnNvbiB3aXRoIGRlbWVudGlhLiIsICAiRmluZGluZ3Mgc3VnZ2VzdCB0aGF0IGNhcmVnaXZlcnMgd2l0aCBoaWdoIGxldmVscyBvZiBuZXVyb3RpY2lzbSBhbmQgbG93IHN1YmplY3RpdmUgY2FyZWdpdmVyIGNvbXBldGVuY2UiKSwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpKQ0KYGBgDQoNCiMgYWRkIGdncGxvdA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdnX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBpcmlzICkgKw0KICBnZW9tX3BvaW50KA0KICAgIG1hcHBpbmcgPSBhZXMoU2VwYWwuTGVuZ3RoLCBQZXRhbC5MZW5ndGgsIGNvbG9yID0gU3BlY2llcyksDQogICAgc2l6ZSA9IDMpICsgdGhlbWVfbWluaW1hbCgpDQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiY2hvIGdncGxvdCB2w7QgYm9keSIsIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gInRpdGxlIikpDQoNCiAgDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGdnX3Bsb3QsIA0KICAgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAiYm9keSIpICkNCg0KYGBgDQoNCiMgYWRkIGltYWdlDQoNCg0KYGBge3J9DQoNCg0KbXlfcHJlcyAgPC0gYWRkX3NsaWRlKG15X3ByZXMgLCBsYXlvdXQgPSAiVGl0bGUgYW5kIENvbnRlbnQiLCBtYXN0ZXIgPSAiT2ZmaWNlIFRoZW1lIikNCg0KDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gaMOsbmgiLCBsb2NhdGlvbiA9IHBoX2xvY2F0aW9uX3R5cGUodHlwZSA9ICJ0aXRsZSIpKQ0KDQppbWcuZmlsZSA8LSBmaWxlLnBhdGgoICJpMS5wbmciICkNCm15X3ByZXMgPC0gcGhfd2l0aCh4ID0gbXlfcHJlcywgZXh0ZXJuYWxfaW1nKGltZy5maWxlLCB3aWR0aCA9IDEuNTgqMywgaGVpZ2h0ID0gMC43OSozKSwNCiAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gImJvZHkiKSwgdXNlX2xvY19zaXplID0gVFJVRSApDQoNCg0KYGBgDQojIGFkZCB0YWJsZQ0KDQpgYGB7cn0NCg0KDQpteV9wcmVzICA8LSBhZGRfc2xpZGUobXlfcHJlcyAsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIsIG1hc3RlciA9ICJPZmZpY2UgVGhlbWUiKQ0KDQogDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gYuG6o25nIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCg0KZnQgPC0gZmxleHRhYmxlKGhlYWQobXRjYXJzKSkNCmZ0IDwtIHNldF90YWJsZV9wcm9wZXJ0aWVzKGZ0LCB3aWR0aCA9IDAuNSwgbGF5b3V0ID0gImF1dG9maXQiKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGZ0LCAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb25fdHlwZSh0eXBlID0gImJvZHkiKSAgKQ0KDQpgYGANCg0KDQojIGFkZCB0YWJsZSBpbiB0aGUgY2VudGVyDQoNCg0KDQpgYGB7cn0NCg0KDQpteV9wcmVzICA8LSBhZGRfc2xpZGUobXlfcHJlcyAsIGxheW91dCA9ICJUaXRsZSBhbmQgQ29udGVudCIsIG1hc3RlciA9ICJPZmZpY2UgVGhlbWUiKQ0KDQogDQpteV9wcmVzIDwtIHBoX3dpdGgobXlfcHJlcywgdmFsdWUgPSAiVGjDqm0gYuG6o25nIiwgbG9jYXRpb24gPSBwaF9sb2NhdGlvbl90eXBlKHR5cGUgPSAidGl0bGUiKSkNCg0KZnQgPC0gZmxleHRhYmxlKGhlYWQobXRjYXJzKSkNCmZ0IDwtIHNldF90YWJsZV9wcm9wZXJ0aWVzKGZ0LCB3aWR0aCA9IDAuNSwgbGF5b3V0ID0gImF1dG9maXQiKQ0KDQpteV9wcmVzIDwtIHBoX3dpdGgoeCA9IG15X3ByZXMsIGZ0LCAgIGxvY2F0aW9uID0gcGhfbG9jYXRpb24od2lkdGggPSA3LCBoZWlnaHQgPSA1LCBuZXdsYWJlbCA9ICJoZWxsbyIpICkgIA0KDQpgYGANCg0KDQoNCiMgRXhwb3J0IHRvIHBwdHggZmlsZQ0KDQpgYGB7cn0NCnByaW50KG15X3ByZXMgLCAiZG9jdW1lbnQucHB0eCIpDQpgYGANCg==