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

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

plot(cars)

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

cat('Hello, World!\nWitaj Świecie!')

help(print)
?cat

args(print)

zmienna1 <- 1L
zmienna1
print(zmienna1)

zmienna2 <- 1.0 
typeof(zmienna1);mode(zmienna1)
typeof(zmienna2);mode(zmienna2)

(zmienna3 <- 1)
print(zmienna3)
zmienna3

typeof(zmienna3); mode(zmienna3)

str(zmienna3)
wektor <- c(0,1,2,3,4,5,6,7,8,9)
cat(wektor)
wektor[-4]
str(wektor[c(1,4,10)])
wektor[3] <- 5
wektor
wektor[c(4,5,6)] <- c(-1,-2,-3)
head(wektor, 3)
tail(wektor, 3)


length(wektor)
min(wektor)
max(wektor)
mean(wektor)

sum(wektor)
prod(wektor[c(2,3,4,5,6,7,8,9,10)])

wektor*2
min(wektor+2)


wektor1 <- 0:9
?seq
wektor2 <- seq(from = 0, by = 2, length.out = 11)
print(wektor2)
typeof(wektor2);mode(wektor2)

wektor3 <- rep(0,2)
help(rep)


wektor4 <- c(1L, 1.0, 1E0, "1"); typeof(wektor4)
is.numeric(wektor4)
wektor4prim <- as.numeric(wektor4)
is.numeric(wektor4prim)

wektor
wektor >= 5
5 <= wektor
wektor[1:5] < wektor[6:10]

wektor %% 2 == 0
parzyste <- wektor[wektor %% 2 == 0]
parzyste

funkcja.kwadrat <- function(argument)
{
  result <- argument*argument
  return(result)
}
typeof(funkcja.kwadrat)
mode(funkcja.kwadrat)

funkcja.kwadrat(2)
print(funkcja.kwadrat(2))
str(funkcja.kwadrat(2))

funkcja.kwadrat <- function(argument) argument**2
funkcja.kwadrat(3)

funkcja.kwadrat ~ argument^2

wektor
wynikiWektor <- funkcja.kwadrat(wektor)
wynikiWektor

print(wynikiWektor)
plot(wektor,wynikiWektor, type="l")

kolejność <- order(wektor)
kolejność
wektor[kolejność]
plot(wektor[kolejność],wynikiWektor[kolejność], type="l")
zmienna <- 1
zmienna = 1
zmienna
1 -> zmienna

polaczony <- paste(c("Jeden","Dwa","Trzy"), collapse = ",")
polaczony
strsplit(polaczony, ",")
2+3;1+2
2-3
2*3
2/3
2%/%3
2L/3L
2%%3
2^3
2**3

2==3
2!=3
2>3

{2+2}*2

2*pi
sin(pi/2)
sin(90)


deg2rad <- function(arg)
{
  return(arg*pi/180)
}
deg2rad(180)
sin(deg2rad(90))

z <- 2 + 3i
z
typeof(z)
mode(z)
Re(z)
Im(z)
Conj(z)
(r <- Mod(z)); (phi <- Arg(z))
r*exp(1i*phi)
exp(1i*pi)

wektor1 <- 0:9
wektor2 <- -9:0

wektor1;wektor2
wektor1+wektor2
wektor1-wektor2
wektor1*wektor2
wektor1/wektor2

a <- c(1,2,3)
b <- c(4,5,6)
a+b;a-b;a*b;a/b
(a+b)^2
sin(a)

wektor1
(-1)^wektor1
exp(wektor1)
plot(wektor1, sin(wektor1), type="l")
max(sin(wektor1))
-wektor1

wektor1;wektor2
min(wektor1,wektor2)
pmin(wektor1^2,wektor2^2)

wektor1
wektor1[1:10]
wektor1[]
wektor1[2:4]
wektor1[1:20]
wektor1[-(2:4)]

v1 <- c(2,1)
v2 <- c(1,-2)
v1;v2
sum(v1*v2)
(l1 <- sqrt(sum(v1^2)))
(l2 <- sqrt(sum(v2^2)))
cos_alpha <- sum(v1*v2)/(l1*l2)
cos_alpha
acos(cos_alpha)/pi*180

normalize <- function(v)
{
  lv <- sqrt(sum(v^2))
  return(v/lv)
}

nv1 <- normalize(v1)
nv1
sum(nv1^2)

Inf; -Inf; NA; NaN; TRUE; FALSE

plot(sin(wektor1), type="l")
wektor2 <- seq(0,2*pi,by=0.01)
plot(wektor2, sin(wektor2), type="l")
plot(wektor2, sin(wektor2)*sin(100*wektor2), type="l")
TRUE & TRUE #AND
wektor3 <- c(TRUE, TRUE, FALSE, FALSE)
wektor4 <- c(TRUE, FALSE, TRUE, FALSE)
wektor5 <- c(NA, NA, NA, NA)
xor(wektor3, wektor5)
!wektor5
all(wektor3)

wektor3&wektor4

isTRUE(wektor3[2])

wektor3 > wektor4
TRUE == 1
FALSE == 0

"Jacek" < "Placek"
"Jacek" == "Jacek"

(wektor6 <- 0:9)
(wektor6a <- wektor6[wektor6 < 5])
(wektor6b <- wektor6[wektor6 >= 5])
c(wektor6a,wektor6b)
wektor6[wektor6 %% 2 == 0]
wektor6[wektor6 %% 2 != 0 & wektor6 > 4]

(wektor6 <- -5:5)
which(wektor6 < 0)
which.max(wektor6)
which.min(wektor6)
(wektor7 <- sample(0:9, 20, replace = TRUE))
length(wektor7)
typeof(wektor7)
plot(wektor7, type = "l")

wektor8 <- rnorm(100, 1, 0.5)
wektor8

plot(wektor8)
hist(wektor8)

mean(wektor8)
sd(wektor8)

hist(sort(wektor8))


wektor8
abs(wektor8)
sign(wektor8)
sqrt(abs(wektor8))
sqrt(wektor8^2) == abs(wektor8)
e <- exp(1)
log(wektor8, base = e)
log10(1000)

floor(wektor8)
ceiling(wektor8)
trunc(wektor8)
round(wektor8, digits = 2)
signif(wektor8, 2)
kostka1 <- sample(1:6, 100000, replace = TRUE)
kostka2 <- sample(1:6, 100000, replace = TRUE)
wynik <- kostka1 + kostka2
min(wynik)
max(wynik)
range(wynik)
c(min(wynik),max(wynik))
mean(wynik)
(2+12)/2
median(wynik)
sd(wynik); var(wynik); sqrt(var(wynik))
quantile(wynik)
plot(wynik)
hist(wynik, 11)
summary(wynik)

any(wynik>10)
all(wynik >2)
posortowane <-sort(wynik)
is.unsorted(posortowane)
plot(rev(posortowane))
wynik[order(wynik)]
wektor <- c(1, 3L, 2.5, TRUE, "napis")
wektor
typeof(wektor); mode(wektor)
str(wektor)
is.vector(wektor)
is.list(wektor)
wektor[[1]]

lista <- list(1, 3L, 2.5, TRUE, "napis")
lista
typeof(lista); mode(lista)
typeof(lista[5])
str(lista)
is.vector(lista)
is.list(lista)
lista[1:2]
lista[[1]]
length(lista)
lista[-1]
lista

nielista <- unlist(lista)
typeof(nielista)
typeof(as.list(nielista))

sort(as.character(lista))

str(lista[1])
str(lista[[1]])
(liczba <- sample(0:9, 1))
if(liczba >= 5) {
  print("Duża")
} else {
  print("Mała") 
}

(wektor <- sample(0:9))
for(i in 1:length(wektor))
{
  liczba <- wektor[i]
  print(paste(i,liczba))
  
 if(liczba >= 5) 
 {
    print("Duża") 
 } 
 else 
 {
    print("Mała") 
  } 
}

i <- 0
while(i <= 9)
{
  print(i)
  i <- i + 1
  if(i == 5) next
  print(i)
}

i <- 0
repeat
{
  print(i)
  i <- i + 1
  if (i == 9) break
}

for(x in -1:1)
  for(y in -1:1)
  {
    if(x == 0 & y ==0) next
    print(paste("(",x,",",y,")"))
  }

lapply(lista, print)
funkcja.potęga <- function(podstawa, wykladnik = 2)
{
  result <- podstawa^wykladnik
  return(result)
}

funkcja.potęga(2, 3)
funkcja.potęga(wykladnik = 3, podstawa = 2)


funkcja.potęga(c(2,5,1))


funkcja.wektor <- function(wektor)
{
  wektor[2] <- NA
  print(wektor)
}

wektor <- 1:5
print(wektor)
funkcja.wektor(wektor)
print(wektor)


funkcja.trojkropek <- function(par1, ...)
{
  typeof(par1); mode(par1); print(par1)
  x <- list(...)
  typeof(x); mode(x); print(x)
  lapply(x, print)
}
funkcja.trojkropek(1,1:3,1:3,"1")
x <- 0:9
x
attributes(x)
attr(x, "dodatkowe.informacje") <- "bardzo wazne informacje"
attr(x, "opis") <- "indeksy"
attr(x, "dodatkowe.dane") <- list(1:3)
print(x)

z <- structure(1:10, opis = "elementy", names = c("I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"))
z
attributes(z)
names(z)

z["V"]

l <- as.list(z)
l
l[["V"]]
l$V

l <- list(I = 1, II = "2", III = TRUE)
l
typeof(l$III)

z <- c(I = 1, II = 2, III = 3)
z
#typeof(z$III)

funkcja.trojkropek(1, b=1:2, c=1:3, d="1")

z <- unname(z)

z$comment <- "komentarz"
z

class(z)

w <- c(x = 1, y = 2, z = 3)
w
class(w) <- "Wektor3D"
w
print(w)

print.Wektor3D <- function(v)
{
  stopifnot(length(v)==3)
  cat("[", as.character(v[1]), ",", as.character(v[2]), ",", as.character(v[3]), "]")
}

w <- unclass(w)
print(w)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpwbG90KGNhcnMpDQpgYGANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0KDQpgYGB7ciBuYXp3YX0NCmNhdCgnSGVsbG8sIFdvcmxkIVxuV2l0YWogxZp3aWVjaWUhJykNCg0KaGVscChwcmludCkNCj9jYXQNCg0KYXJncyhwcmludCkNCg0Kem1pZW5uYTEgPC0gMUwNCnptaWVubmExDQpwcmludCh6bWllbm5hMSkNCg0Kem1pZW5uYTIgPC0gMS4wIA0KdHlwZW9mKHptaWVubmExKTttb2RlKHptaWVubmExKQ0KdHlwZW9mKHptaWVubmEyKTttb2RlKHptaWVubmEyKQ0KDQooem1pZW5uYTMgPC0gMSkNCnByaW50KHptaWVubmEzKQ0Kem1pZW5uYTMNCg0KdHlwZW9mKHptaWVubmEzKTsgbW9kZSh6bWllbm5hMykNCg0Kc3RyKHptaWVubmEzKQ0KYGBgDQoNCmBgYHtyfQ0Kd2VrdG9yIDwtIGMoMCwxLDIsMyw0LDUsNiw3LDgsOSkNCmNhdCh3ZWt0b3IpDQp3ZWt0b3JbLTRdDQpzdHIod2VrdG9yW2MoMSw0LDEwKV0pDQp3ZWt0b3JbM10gPC0gNQ0Kd2VrdG9yDQp3ZWt0b3JbYyg0LDUsNildIDwtIGMoLTEsLTIsLTMpDQpoZWFkKHdla3RvciwgMykNCnRhaWwod2VrdG9yLCAzKQ0KDQoNCmxlbmd0aCh3ZWt0b3IpDQptaW4od2VrdG9yKQ0KbWF4KHdla3RvcikNCm1lYW4od2VrdG9yKQ0KDQpzdW0od2VrdG9yKQ0KcHJvZCh3ZWt0b3JbYygyLDMsNCw1LDYsNyw4LDksMTApXSkNCg0Kd2VrdG9yKjINCm1pbih3ZWt0b3IrMikNCg0KDQp3ZWt0b3IxIDwtIDA6OQ0KP3NlcQ0Kd2VrdG9yMiA8LSBzZXEoZnJvbSA9IDAsIGJ5ID0gMiwgbGVuZ3RoLm91dCA9IDExKQ0KcHJpbnQod2VrdG9yMikNCnR5cGVvZih3ZWt0b3IyKTttb2RlKHdla3RvcjIpDQoNCndla3RvcjMgPC0gcmVwKDAsMikNCmhlbHAocmVwKQ0KDQoNCndla3RvcjQgPC0gYygxTCwgMS4wLCAxRTAsICIxIik7IHR5cGVvZih3ZWt0b3I0KQ0KaXMubnVtZXJpYyh3ZWt0b3I0KQ0Kd2VrdG9yNHByaW0gPC0gYXMubnVtZXJpYyh3ZWt0b3I0KQ0KaXMubnVtZXJpYyh3ZWt0b3I0cHJpbSkNCg0Kd2VrdG9yDQp3ZWt0b3IgPj0gNQ0KNSA8PSB3ZWt0b3INCndla3RvclsxOjVdIDwgd2VrdG9yWzY6MTBdDQoNCndla3RvciAlJSAyID09IDANCnBhcnp5c3RlIDwtIHdla3Rvclt3ZWt0b3IgJSUgMiA9PSAwXQ0KcGFyenlzdGUNCmBgYA0KYGBge3IgZnVua2NqZX0NCg0KZnVua2NqYS5rd2FkcmF0IDwtIGZ1bmN0aW9uKGFyZ3VtZW50KQ0Kew0KICByZXN1bHQgPC0gYXJndW1lbnQqYXJndW1lbnQNCiAgcmV0dXJuKHJlc3VsdCkNCn0NCnR5cGVvZihmdW5rY2phLmt3YWRyYXQpDQptb2RlKGZ1bmtjamEua3dhZHJhdCkNCg0KZnVua2NqYS5rd2FkcmF0KDIpDQpwcmludChmdW5rY2phLmt3YWRyYXQoMikpDQpzdHIoZnVua2NqYS5rd2FkcmF0KDIpKQ0KDQpmdW5rY2phLmt3YWRyYXQgPC0gZnVuY3Rpb24oYXJndW1lbnQpIGFyZ3VtZW50KioyDQpmdW5rY2phLmt3YWRyYXQoMykNCg0KZnVua2NqYS5rd2FkcmF0IH4gYXJndW1lbnReMg0KDQp3ZWt0b3INCnd5bmlraVdla3RvciA8LSBmdW5rY2phLmt3YWRyYXQod2VrdG9yKQ0Kd3luaWtpV2VrdG9yDQoNCnByaW50KHd5bmlraVdla3RvcikNCnBsb3Qod2VrdG9yLHd5bmlraVdla3RvciwgdHlwZT0ibCIpDQoNCmtvbGVqbm/Fm8SHIDwtIG9yZGVyKHdla3RvcikNCmtvbGVqbm/Fm8SHDQp3ZWt0b3Jba29sZWpub8WbxIddDQpwbG90KHdla3Rvcltrb2xlam5vxZvEh10sd3luaWtpV2VrdG9yW2tvbGVqbm/Fm8SHXSwgdHlwZT0ibCIpDQpgYGANCg0KYGBge3J9DQp6bWllbm5hIDwtIDENCnptaWVubmEgPSAxDQp6bWllbm5hDQoxIC0+IHptaWVubmENCg0KcG9sYWN6b255IDwtIHBhc3RlKGMoIkplZGVuIiwiRHdhIiwiVHJ6eSIpLCBjb2xsYXBzZSA9ICIsIikNCnBvbGFjem9ueQ0Kc3Ryc3BsaXQocG9sYWN6b255LCAiLCIpDQpgYGANCg0KYGBge3J9DQoyKzM7MSsyDQoyLTMNCjIqMw0KMi8zDQoyJS8lMw0KMkwvM0wNCjIlJTMNCjJeMw0KMioqMw0KDQoyPT0zDQoyIT0zDQoyPjMNCg0KezIrMn0qMg0KDQoyKnBpDQpzaW4ocGkvMikNCnNpbig5MCkNCg0KDQpkZWcycmFkIDwtIGZ1bmN0aW9uKGFyZykNCnsNCiAgcmV0dXJuKGFyZypwaS8xODApDQp9DQpkZWcycmFkKDE4MCkNCnNpbihkZWcycmFkKDkwKSkNCg0KeiA8LSAyICsgM2kNCnoNCnR5cGVvZih6KQ0KbW9kZSh6KQ0KUmUoeikNCkltKHopDQpDb25qKHopDQoociA8LSBNb2QoeikpOyAocGhpIDwtIEFyZyh6KSkNCnIqZXhwKDFpKnBoaSkNCmV4cCgxaSpwaSkNCg0Kd2VrdG9yMSA8LSAwOjkNCndla3RvcjIgPC0gLTk6MA0KDQp3ZWt0b3IxO3dla3RvcjINCndla3RvcjErd2VrdG9yMg0Kd2VrdG9yMS13ZWt0b3IyDQp3ZWt0b3IxKndla3RvcjINCndla3RvcjEvd2VrdG9yMg0KDQphIDwtIGMoMSwyLDMpDQpiIDwtIGMoNCw1LDYpDQphK2I7YS1iO2EqYjthL2INCihhK2IpXjINCnNpbihhKQ0KDQp3ZWt0b3IxDQooLTEpXndla3RvcjENCmV4cCh3ZWt0b3IxKQ0KcGxvdCh3ZWt0b3IxLCBzaW4od2VrdG9yMSksIHR5cGU9ImwiKQ0KbWF4KHNpbih3ZWt0b3IxKSkNCi13ZWt0b3IxDQoNCndla3RvcjE7d2VrdG9yMg0KbWluKHdla3RvcjEsd2VrdG9yMikNCnBtaW4od2VrdG9yMV4yLHdla3RvcjJeMikNCg0Kd2VrdG9yMQ0Kd2VrdG9yMVsxOjEwXQ0Kd2VrdG9yMVtdDQp3ZWt0b3IxWzI6NF0NCndla3RvcjFbMToyMF0NCndla3RvcjFbLSgyOjQpXQ0KDQp2MSA8LSBjKDIsMSkNCnYyIDwtIGMoMSwtMikNCnYxO3YyDQpzdW0odjEqdjIpDQoobDEgPC0gc3FydChzdW0odjFeMikpKQ0KKGwyIDwtIHNxcnQoc3VtKHYyXjIpKSkNCmNvc19hbHBoYSA8LSBzdW0odjEqdjIpLyhsMSpsMikNCmNvc19hbHBoYQ0KYWNvcyhjb3NfYWxwaGEpL3BpKjE4MA0KDQpub3JtYWxpemUgPC0gZnVuY3Rpb24odikNCnsNCiAgbHYgPC0gc3FydChzdW0odl4yKSkNCiAgcmV0dXJuKHYvbHYpDQp9DQoNCm52MSA8LSBub3JtYWxpemUodjEpDQpudjENCnN1bShudjFeMikNCg0KSW5mOyAtSW5mOyBOQTsgTmFOOyBUUlVFOyBGQUxTRQ0KDQpwbG90KHNpbih3ZWt0b3IxKSwgdHlwZT0ibCIpDQp3ZWt0b3IyIDwtIHNlcSgwLDIqcGksYnk9MC4wMSkNCnBsb3Qod2VrdG9yMiwgc2luKHdla3RvcjIpLCB0eXBlPSJsIikNCnBsb3Qod2VrdG9yMiwgc2luKHdla3RvcjIpKnNpbigxMDAqd2VrdG9yMiksIHR5cGU9ImwiKQ0KYGBgDQoNCmBgYHtyfQ0KVFJVRSAmIFRSVUUgI0FORA0Kd2VrdG9yMyA8LSBjKFRSVUUsIFRSVUUsIEZBTFNFLCBGQUxTRSkNCndla3RvcjQgPC0gYyhUUlVFLCBGQUxTRSwgVFJVRSwgRkFMU0UpDQp3ZWt0b3I1IDwtIGMoTkEsIE5BLCBOQSwgTkEpDQp4b3Iod2VrdG9yMywgd2VrdG9yNSkNCiF3ZWt0b3I1DQphbGwod2VrdG9yMykNCg0Kd2VrdG9yMyZ3ZWt0b3I0DQoNCmlzVFJVRSh3ZWt0b3IzWzJdKQ0KDQp3ZWt0b3IzID4gd2VrdG9yNA0KVFJVRSA9PSAxDQpGQUxTRSA9PSAwDQoNCiJKYWNlayIgPCAiUGxhY2VrIg0KIkphY2VrIiA9PSAiSmFjZWsiDQoNCih3ZWt0b3I2IDwtIDA6OSkNCih3ZWt0b3I2YSA8LSB3ZWt0b3I2W3dla3RvcjYgPCA1XSkNCih3ZWt0b3I2YiA8LSB3ZWt0b3I2W3dla3RvcjYgPj0gNV0pDQpjKHdla3RvcjZhLHdla3RvcjZiKQ0Kd2VrdG9yNlt3ZWt0b3I2ICUlIDIgPT0gMF0NCndla3RvcjZbd2VrdG9yNiAlJSAyICE9IDAgJiB3ZWt0b3I2ID4gNF0NCg0KKHdla3RvcjYgPC0gLTU6NSkNCndoaWNoKHdla3RvcjYgPCAwKQ0Kd2hpY2gubWF4KHdla3RvcjYpDQp3aGljaC5taW4od2VrdG9yNikNCmBgYA0KYGBge3J9DQood2VrdG9yNyA8LSBzYW1wbGUoMDo5LCAyMCwgcmVwbGFjZSA9IFRSVUUpKQ0KbGVuZ3RoKHdla3RvcjcpDQp0eXBlb2Yod2VrdG9yNykNCnBsb3Qod2VrdG9yNywgdHlwZSA9ICJsIikNCg0Kd2VrdG9yOCA8LSBybm9ybSgxMDAsIDEsIDAuNSkNCndla3RvcjgNCg0KcGxvdCh3ZWt0b3I4KQ0KaGlzdCh3ZWt0b3I4KQ0KDQptZWFuKHdla3RvcjgpDQpzZCh3ZWt0b3I4KQ0KDQpoaXN0KHNvcnQod2VrdG9yOCkpDQoNCg0Kd2VrdG9yOA0KYWJzKHdla3RvcjgpDQpzaWduKHdla3RvcjgpDQpzcXJ0KGFicyh3ZWt0b3I4KSkNCnNxcnQod2VrdG9yOF4yKSA9PSBhYnMod2VrdG9yOCkNCmUgPC0gZXhwKDEpDQpsb2cod2VrdG9yOCwgYmFzZSA9IGUpDQpsb2cxMCgxMDAwKQ0KDQpmbG9vcih3ZWt0b3I4KQ0KY2VpbGluZyh3ZWt0b3I4KQ0KdHJ1bmMod2VrdG9yOCkNCnJvdW5kKHdla3RvcjgsIGRpZ2l0cyA9IDIpDQpzaWduaWYod2VrdG9yOCwgMikNCmBgYA0KDQoNCmBgYHtyfQ0Ka29zdGthMSA8LSBzYW1wbGUoMTo2LCAxMDAwMDAsIHJlcGxhY2UgPSBUUlVFKQ0Ka29zdGthMiA8LSBzYW1wbGUoMTo2LCAxMDAwMDAsIHJlcGxhY2UgPSBUUlVFKQ0Kd3luaWsgPC0ga29zdGthMSArIGtvc3RrYTINCm1pbih3eW5paykNCm1heCh3eW5paykNCnJhbmdlKHd5bmlrKQ0KYyhtaW4od3luaWspLG1heCh3eW5paykpDQptZWFuKHd5bmlrKQ0KKDIrMTIpLzINCm1lZGlhbih3eW5paykNCnNkKHd5bmlrKTsgdmFyKHd5bmlrKTsgc3FydCh2YXIod3luaWspKQ0KcXVhbnRpbGUod3luaWspDQpwbG90KHd5bmlrKQ0KaGlzdCh3eW5paywgMTEpDQpzdW1tYXJ5KHd5bmlrKQ0KDQphbnkod3luaWs+MTApDQphbGwod3luaWsgPjIpDQpwb3NvcnRvd2FuZSA8LXNvcnQod3luaWspDQppcy51bnNvcnRlZChwb3NvcnRvd2FuZSkNCnBsb3QocmV2KHBvc29ydG93YW5lKSkNCnd5bmlrW29yZGVyKHd5bmlrKV0NCmBgYA0KDQpgYGB7cn0NCndla3RvciA8LSBjKDEsIDNMLCAyLjUsIFRSVUUsICJuYXBpcyIpDQp3ZWt0b3INCnR5cGVvZih3ZWt0b3IpOyBtb2RlKHdla3RvcikNCnN0cih3ZWt0b3IpDQppcy52ZWN0b3Iod2VrdG9yKQ0KaXMubGlzdCh3ZWt0b3IpDQp3ZWt0b3JbWzFdXQ0KDQpsaXN0YSA8LSBsaXN0KDEsIDNMLCAyLjUsIFRSVUUsICJuYXBpcyIpDQpsaXN0YQ0KdHlwZW9mKGxpc3RhKTsgbW9kZShsaXN0YSkNCnR5cGVvZihsaXN0YVs1XSkNCnN0cihsaXN0YSkNCmlzLnZlY3RvcihsaXN0YSkNCmlzLmxpc3QobGlzdGEpDQpsaXN0YVsxOjJdDQpsaXN0YVtbMV1dDQpsZW5ndGgobGlzdGEpDQpsaXN0YVstMV0NCmxpc3RhDQoNCm5pZWxpc3RhIDwtIHVubGlzdChsaXN0YSkNCnR5cGVvZihuaWVsaXN0YSkNCnR5cGVvZihhcy5saXN0KG5pZWxpc3RhKSkNCg0Kc29ydChhcy5jaGFyYWN0ZXIobGlzdGEpKQ0KDQpzdHIobGlzdGFbMV0pDQpzdHIobGlzdGFbWzFdXSkNCmBgYA0KDQpgYGB7cn0NCihsaWN6YmEgPC0gc2FtcGxlKDA6OSwgMSkpDQppZihsaWN6YmEgPj0gNSkgew0KICBwcmludCgiRHXFvGEiKQ0KfSBlbHNlIHsNCiAgcHJpbnQoIk1hxYJhIikgDQp9DQoNCih3ZWt0b3IgPC0gc2FtcGxlKDA6OSkpDQpmb3IoaSBpbiAxOmxlbmd0aCh3ZWt0b3IpKQ0Kew0KICBsaWN6YmEgPC0gd2VrdG9yW2ldDQogIHByaW50KHBhc3RlKGksbGljemJhKSkNCiAgDQogaWYobGljemJhID49IDUpIA0KIHsNCiAgICBwcmludCgiRHXFvGEiKSANCiB9IA0KIGVsc2UgDQogew0KICAgIHByaW50KCJNYcWCYSIpIA0KICB9IA0KfQ0KDQppIDwtIDANCndoaWxlKGkgPD0gOSkNCnsNCiAgcHJpbnQoaSkNCiAgaSA8LSBpICsgMQ0KICBpZihpID09IDUpIG5leHQNCiAgcHJpbnQoaSkNCn0NCg0KaSA8LSAwDQpyZXBlYXQNCnsNCiAgcHJpbnQoaSkNCiAgaSA8LSBpICsgMQ0KICBpZiAoaSA9PSA5KSBicmVhaw0KfQ0KDQpmb3IoeCBpbiAtMToxKQ0KICBmb3IoeSBpbiAtMToxKQ0KICB7DQogICAgaWYoeCA9PSAwICYgeSA9PTApIG5leHQNCiAgICBwcmludChwYXN0ZSgiKCIseCwiLCIseSwiKSIpKQ0KICB9DQoNCmxhcHBseShsaXN0YSwgcHJpbnQpDQpgYGANCg0KYGBge3J9DQpmdW5rY2phLnBvdMSZZ2EgPC0gZnVuY3Rpb24ocG9kc3Rhd2EsIHd5a2xhZG5payA9IDIpDQp7DQogIHJlc3VsdCA8LSBwb2RzdGF3YV53eWtsYWRuaWsNCiAgcmV0dXJuKHJlc3VsdCkNCn0NCg0KZnVua2NqYS5wb3TEmWdhKDIsIDMpDQpmdW5rY2phLnBvdMSZZ2Eod3lrbGFkbmlrID0gMywgcG9kc3Rhd2EgPSAyKQ0KDQoNCmZ1bmtjamEucG90xJlnYShjKDIsNSwxKSkNCg0KDQpmdW5rY2phLndla3RvciA8LSBmdW5jdGlvbih3ZWt0b3IpDQp7DQogIHdla3RvclsyXSA8LSBOQQ0KICBwcmludCh3ZWt0b3IpDQp9DQoNCndla3RvciA8LSAxOjUNCnByaW50KHdla3RvcikNCmZ1bmtjamEud2VrdG9yKHdla3RvcikNCnByaW50KHdla3RvcikNCg0KDQpmdW5rY2phLnRyb2prcm9wZWsgPC0gZnVuY3Rpb24ocGFyMSwgLi4uKQ0Kew0KICB0eXBlb2YocGFyMSk7IG1vZGUocGFyMSk7IHByaW50KHBhcjEpDQogIHggPC0gbGlzdCguLi4pDQogIHR5cGVvZih4KTsgbW9kZSh4KTsgcHJpbnQoeCkNCiAgbGFwcGx5KHgsIHByaW50KQ0KfQ0KZnVua2NqYS50cm9qa3JvcGVrKDEsMTozLDE6MywiMSIpDQpgYGANCmBgYHtyfQ0KeCA8LSAwOjkNCngNCmF0dHJpYnV0ZXMoeCkNCmF0dHIoeCwgImRvZGF0a293ZS5pbmZvcm1hY2plIikgPC0gImJhcmR6byB3YXpuZSBpbmZvcm1hY2plIg0KYXR0cih4LCAib3BpcyIpIDwtICJpbmRla3N5Ig0KYXR0cih4LCAiZG9kYXRrb3dlLmRhbmUiKSA8LSBsaXN0KDE6MykNCnByaW50KHgpDQoNCnogPC0gc3RydWN0dXJlKDE6MTAsIG9waXMgPSAiZWxlbWVudHkiLCBuYW1lcyA9IGMoIkkiLCAiSUkiLCAiSUlJIiwgIklWIiwgIlYiLCAiVkkiLCAiVklJIiwgIlZJSUkiLCAiSVgiLCAiWCIpKQ0Keg0KYXR0cmlidXRlcyh6KQ0KbmFtZXMoeikNCg0KelsiViJdDQoNCmwgPC0gYXMubGlzdCh6KQ0KbA0KbFtbIlYiXV0NCmwkVg0KDQpsIDwtIGxpc3QoSSA9IDEsIElJID0gIjIiLCBJSUkgPSBUUlVFKQ0KbA0KdHlwZW9mKGwkSUlJKQ0KDQp6IDwtIGMoSSA9IDEsIElJID0gMiwgSUlJID0gMykNCnoNCiN0eXBlb2YoeiRJSUkpDQoNCmZ1bmtjamEudHJvamtyb3BlaygxLCBiPTE6MiwgYz0xOjMsIGQ9IjEiKQ0KDQp6IDwtIHVubmFtZSh6KQ0KDQp6JGNvbW1lbnQgPC0gImtvbWVudGFyeiINCnoNCg0KY2xhc3MoeikNCg0KdyA8LSBjKHggPSAxLCB5ID0gMiwgeiA9IDMpDQp3DQpjbGFzcyh3KSA8LSAiV2VrdG9yM0QiDQp3DQpwcmludCh3KQ0KDQpwcmludC5XZWt0b3IzRCA8LSBmdW5jdGlvbih2KQ0Kew0KICBzdG9waWZub3QobGVuZ3RoKHYpPT0zKQ0KICBjYXQoIlsiLCBhcy5jaGFyYWN0ZXIodlsxXSksICIsIiwgYXMuY2hhcmFjdGVyKHZbMl0pLCAiLCIsIGFzLmNoYXJhY3Rlcih2WzNdKSwgIl0iKQ0KfQ0KDQp3IDwtIHVuY2xhc3ModykNCnByaW50KHcpDQpgYGANCg0KDQo=