Etapa 1
Espectro do PCSL não irradiado:
fileDSCNI<-"C:/Users/rodri_000/OneDrive/EPR/PCSL_NI_07julho2016_09h33.DSC"
fileDTANI<-"C:/Users/rodri_000/OneDrive/EPR/PCSL_NI_07julho2016_09h33.DTA"
#
dscNI <- readLines(fileDSCNI,encoding="UTF-8")
#
pontos<-grep("XPTS",dscNI,value=T);campos<-strsplit(pontos,'\t')[[1]];XPTS<-as.numeric(campos[2])
pontos<-grep("XMIN",dscNI,value=T);campos<-strsplit(pontos,'\t')[[1]];XMIN<-as.numeric(campos[2])
pontos<-grep("XWID",dscNI,value=T);campos<-strsplit(pontos,'\t')[[1]];XWID<-as.numeric(campos[2])
pontos<-grep("MWFQ",dscNI,value=T);campos<-strsplit(pontos,' ')[[1]];MF<-as.numeric(campos[2])/1e9#GHz
pontos<-grep("RCAG",dscNI,value=T);campos<-strsplit(pontos,' ')[[1]];RG<-as.numeric(campos[2])
pontos<-grep("SPTP",dscNI,value=T);campos<-strsplit(pontos,' ')[[1]];CT<-as.numeric(campos[2])*1000#ms
pontos<-grep("AVGS",dscNI,value=T);campos<-strsplit(pontos,' ')[[1]];SCAN<-as.numeric(campos[2])
pontos<-grep("MWPW",dscNI,value=T);campos<-strsplit(pontos,' ')[[1]];MWPW<-as.numeric(campos[2])*1000#mW
info<-grep("DATE", dscNI,value=T);campos<-strsplit(info,' ')[[1]];DATE<-(campos[2])
info<-grep("TIME", dscNI,value=T);campos<-strsplit(info,' ')[[1]];TIME<-(campos[2])
#infos$NOME[[i]]<-nome[1]
#
passo<-round(XWID/XPTS,1)
b<-seq(1:XPTS)
for(j in 1:XPTS){
b[j]<-XMIN+(passo*(j-1))
}
b<-data.frame(b)
g<-714.55*MF/b
s<-readBin(fileDTANI, double(), n = XPTS, size = 8, endian = "big");s<-data.frame(s);
#Data normalization - Bruker Manual cap.5.6
sn<-s/(CT*SCAN*20*10^(RG/20))
#
dados<-cbind(b,g,s,sn);colnames(dados)[2] <- "g";colnames(dados)[4] <- "sn"
#
plot(dados$b,dados$sn,type="n",xlab="Magnetic Field (G)",ylab="EPR Signal Normalized (a.u.)",ylim=c(-20,20))
lines(dados$b,dados$sn,col="black");grid(NULL,NULL)

Etapa 2
Irradiação em: 21/06/2016
Dose: 23,9 kGy
Leitura dos arquivos do diretório C:/Users/rodri_000/OneDrive/EPR/PCSL:
Geração da planilha com 25 arquivos.
Colunas:
b - Campo Magnético (G)
g - fator g calculado por: \[
gFactor=\frac{714.55*v(GHz)}{B(G)}
\] S - Intensidade do sinal de EPR (u.a.)
Sn - Intensidade do sinal de EPR normalizado utilizando a equação da Bruker:
\[
sn=\dfrac{s}{C_{T}(ms)*N_{SCAN}*20*10^{RG(dB)/20}}
\]
#
Etapa 3
Acompanhamento do decaimento do sinal e RPE ao longo de aproximadamente 180 dias.
library(baseline)
library(sqldf)
library(data.table)
library(knitr)
#versão 07 de 08-12-2016
#preparacao de uma tabela
#############################################
#carregando a lista de arquivos DSC do dir
# tratarei o zero em outro script
fileDSC<-list.files(pattern="*.DSC$")
fileDTA<-list.files(pattern="*.DTA$")
#num de arquivos
nn<-length(fileDSC)
#
espectros<-list()#carrego e armazeno todos os espectros: formato espectros[[i]]$(b,g,s,sn)
infos<-list("NOME"=1:nn,"XPTS"=1:nn,"RG"=1:nn,"DATE"=1:nn,"TIME"=1:nn,"MF"=1:nn,"CT"=1:nn,"SCAN"=1:nn,"MWPW"=1:nn,"Hpap"=1:nn,"Hpapsn"=1:nn)
#
for (i in 1:nn)
{
dsc <- readLines(fileDSC[i],encoding="UTF-8")
#
nome<-(strsplit(fileDSC[i],"\\."))[[1]]
#
fileDTA<-paste0(nome[1],".DTA")
pontos<-grep("XPTS",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];infos$XPTS[[i]]<-as.numeric(campos[2])
pontos<-grep("XMIN",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];XMIN<-as.numeric(campos[2])
pontos<-grep("XWID",dsc,value=T);campos<-strsplit(pontos,'\t')[[1]];XWID<-as.numeric(campos[2])
pontos<-grep("MWFQ",dsc,value=T);campos<-strsplit(pontos,' ')[[1]];infos$MF[[i]]<-as.numeric(campos[2])/1e9#GHz
pontos<-grep("RCAG",dsc,value=T);campos<-strsplit(pontos,' ')[[1]];infos$RG[[i]]<-as.numeric(campos[2])
pontos<-grep("SPTP",dsc,value=T);campos<-strsplit(pontos,' ')[[1]];infos$CT[[i]]<-as.numeric(campos[2])*1000#ms
pontos<-grep("AVGS",dsc,value=T);campos<-strsplit(pontos,' ')[[1]];infos$SCAN[[i]]<-as.numeric(campos[2])
pontos<-grep("MWPW",dsc,value=T);campos<-strsplit(pontos,' ')[[1]];infos$MWPW[[i]]<-as.numeric(campos[2])*1000#mW
info<-grep("DATE", dsc,value=T);campos<-strsplit(info,' ')[[1]];infos$DATE[[i]]<-(campos[2])
info<-grep("TIME", dsc,value=T);campos<-strsplit(info,' ')[[1]];infos$TIME[[i]]<-(campos[2])
infos$NOME[[i]]<-nome[1]
#
passo<-round(XWID/infos$XPTS[[i]],1)
b<-seq(1:infos$XPTS[[i]])
for(j in 1:infos$XPTS[[i]]){
b[j]<-XMIN+(passo*(j-1))
}
b<-data.frame(b)
g<-714.55*infos$MF[[i]]/b
s<-readBin(fileDTA, double(), n = infos$XPTS[[i]], size = 8, endian = "big");s<-data.frame(s);
#Data normalization - Bruker Manual cap.5.6
sn<-s/(infos$CT[[i]]*infos$SCAN[[i]]*20*10^(infos$RG[[i]]/20))
#
dados<-cbind(b,g,s,sn);colnames(dados)[2] <- "g";colnames(dados)[4] <- "sn"
#guardo os espectros
espectros[[i]]<-dados
#Hpap sn
infos$Hpapsn[i]<-max(dados[,4])-min(dados[,4])
#Hpap s
infos$Hpap[i]<-max(dados[,3])-min(dados[,3])
}
Exemplo do espectro do PCSL irradiado (medida em 2016-06-21 13:58:24):
#
plot(espectros[[21]]$b,espectros[[21]]$sn,type="n",xlab="Magnetic Field (G)",ylab="EPR Signal Normalized (a.u.)",xlim=c(3400,3600))
lines(espectros[[21]]$b,espectros[[21]]$sn,col="black");grid(NULL,NULL)

#
Arquivos analisados:
# até aqui carreguei os arquivos DSC em infos[[]] e DTA em dados[[]]
# calculei g e sn e estimei os HPaP e HPaPn
#criando um novo conjunto de dados
tmed<-list("TD"=1:nn,"Arq"=1:nn,"Hpap"=1:nn,"Hpapsn"=1:nn)
for (i in 1:nn)
{
tmed$TD[i]<-paste(infos$DATE[i],infos$TIME[i])
tmed$Arq[i]<-infos$NOME[i]
tmed$Hpap[i]<-infos$Hpap[i]
tmed$Hpapsn[i]<-infos$Hpapsn[i]
}
tmed$TD=as.POSIXct(tmed$TD,format="%m/%d/%y %H:%M:%S",tz="UTC")
#crio um data.frame
tmed<-data.frame(tmed)
# ordeno os indices pela data
ind<-order(tmed$TD,decreasing=F)
#tabela
kable(tmed[order(tmed$TD),],caption = "Dados")
| 21 |
2016-06-21 13:58:24 |
PCSL25kGy_21junho2016_13h57 |
14493110.2 |
10187.59351 |
| 22 |
2016-06-21 14:54:11 |
PCSL25kGy_21junho2016_14h54 |
13827080.5 |
9719.42348 |
| 19 |
2016-06-21 15:33:57 |
PCSL25kGy_21jun2016_15h33 |
13776301.4 |
9683.72945 |
| 20 |
2016-06-21 16:39:45 |
PCSL25kGy_21jun2016_16h40 |
13491199.7 |
9483.32392 |
| 23 |
2016-06-22 08:38:11 |
PCSL25kGy_22jun2016_08h38 |
10966520.8 |
7708.65977 |
| 24 |
2016-06-22 10:48:00 |
PCSL25kGy_22junho2016_10h38 |
10438072.2 |
7337.19919 |
| 9 |
2016-06-22 16:44:00 |
PCSL25kGy-22jun2016-16h42 |
9830958.8 |
6910.44301 |
| 10 |
2016-06-23 09:14:47 |
PCSL25kGy-23jun2016-09h15 |
8459219.8 |
5946.21109 |
| 11 |
2016-06-23 16:13:08 |
PCSL25kGy-23jun2016-16h13 |
8023780.0 |
5640.12888 |
| 12 |
2016-06-24 09:10:52 |
PCSL25kGy-24jun2016-09h10 |
6742392.5 |
4739.40741 |
| 13 |
2016-06-27 09:18:04 |
PCSL25kGy-27jun2016-09h17 |
4716107.8 |
3315.07791 |
| 25 |
2016-06-28 08:55:11 |
PCSL25kGy_28junho2016_0845 |
4247508.2 |
2985.68674 |
| 6 |
2016-06-29 10:06:53 |
PCSL25kG_29jun2016_10h07 |
3843868.2 |
2701.95743 |
| 14 |
2016-06-30 09:33:04 |
PCSL25kGy-30jun2016-09h33 |
3405401.4 |
2393.74745 |
| 7 |
2016-07-01 09:21:03 |
PCSL25kGy-01jul2016-09h21 |
3072432.9 |
2159.69500 |
| 8 |
2016-07-04 09:16:24 |
PCSL25kGy-04jul2016-09h16 |
2388973.6 |
1679.27324 |
| 15 |
2016-07-05 09:23:09 |
PCSL25kGy_05julho2016_09h13 |
2237723.9 |
1572.95578 |
| 16 |
2016-07-07 09:27:40 |
PCSL25kGy_07julho2016_09h18 |
1915544.2 |
1346.48708 |
| 17 |
2016-07-14 15:51:40 |
PCSL25kGy_14jul2016_15h52 |
1186932.5 |
834.32651 |
| 4 |
2016-07-28 13:47:55 |
PCSL-25kGy-28jul2016-13h48 |
684015.2 |
480.81253 |
| 1 |
2016-08-04 16:19:39 |
PCSL-25kGy-04ago2016-16h20 |
507293.9 |
356.59043 |
| 3 |
2016-09-13 10:01:38 |
PCSL-25kGy-13set2016-10h01 |
180753.4 |
127.05637 |
| 5 |
2016-09-30 09:14:40 |
PCSL-25kGy-30set2016-09h15 |
141788.2 |
99.66673 |
| 2 |
2016-10-04 09:53:12 |
PCSL-25kGy-04out2016-09h53 |
133777.3 |
94.03562 |
| 18 |
2016-12-16 14:11:20 |
PCSL25kGy_16dez2016_14h13 |
128264.7 |
50.70109 |
Observações:
* Hpap: valor pico-a-pico
* Hpapsn: valor pico-a-pico normalizado
#
Resultados para o cálculo do fading:
# calculo os tempos relativos a medida inicial (ind[1])
fading<-list("F"=1:nn,"Hpap"=1:nn,"Hpapsn"=1:nn)
fading$F[1]<-0
fading$Hpap[1]<-tmed$Hpap[ind[1]]
fading$Hpapsn[1]<-tmed$Hpapsn[ind[1]]
#
for (i in 2:nn)
{
#fading$F[i]<-difftime(tmed$TD[ind[i]],tmed$TD[ind[1]],units="hours")
fading$F[i]<-difftime(tmed$TD[ind[i]],tmed$TD[ind[1]],units="days")
fading$Hpap[i]<-tmed$Hpap[ind[i]]
fading$Hpapsn[i]<-tmed$Hpapsn[ind[i]]
}
df.fading<-data.frame(fading)
#tabela
kable(df.fading,caption = "Decaimento do sinal ao longo dos dias")
| 0.0000000 |
14493110.2 |
10187.59351 |
| 0.0387384 |
13827080.5 |
9719.42348 |
| 0.0663542 |
13776301.4 |
9683.72945 |
| 0.1120486 |
13491199.7 |
9483.32392 |
| 0.7776273 |
10966520.8 |
7708.65977 |
| 0.8677778 |
10438072.2 |
7337.19919 |
| 1.1150000 |
9830958.8 |
6910.44301 |
| 1.8030440 |
8459219.8 |
5946.21109 |
| 2.0935648 |
8023780.0 |
5640.12888 |
| 2.8003241 |
6742392.5 |
4739.40741 |
| 5.8053241 |
4716107.8 |
3315.07791 |
| 6.7894329 |
4247508.2 |
2985.68674 |
| 7.8392245 |
3843868.2 |
2701.95743 |
| 8.8157407 |
3405401.4 |
2393.74745 |
| 9.8073958 |
3072432.9 |
2159.69500 |
| 12.8041667 |
2388973.6 |
1679.27324 |
| 13.8088542 |
2237723.9 |
1572.95578 |
| 15.8119907 |
1915544.2 |
1346.48708 |
| 23.0786574 |
1186932.5 |
834.32651 |
| 36.9927199 |
684015.2 |
480.81253 |
| 44.0980903 |
507293.9 |
356.59043 |
| 83.8355787 |
180753.4 |
127.05637 |
| 100.8029630 |
141788.2 |
99.66673 |
| 104.8297222 |
133777.3 |
94.03562 |
| 178.0089815 |
128264.7 |
50.70109 |
Observação:
* F : intervalo de tempo em dias entre a irradiação e a medida.
#
Curva do decaimento do sinal (sem descontar o sinal NI):
#
plot(fading$F,fading$Hpapsn,xlab="Fading (d)",ylab="EPR Signal Normalized (a.u.)",xlim=c(0,200))
lines(fading$F,fading$Hpapsn,col="red");grid(NULL,NULL)

#
Orlando (dezembro/2016)
LS0tDQp0aXRsZTogIkVQUiBTcGVjdHJhIERhdGEgQW5hbHlzaXMgUENTTCBmYWRpbmcgc3R1ZHkgZGV6LzE2Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojIyNFdGFwYSAxDQoNCkVzcGVjdHJvIGRvIFBDU0wgbuNvIGlycmFkaWFkbzoNCmBgYHtyLGZpZy53aWR0aD05LGZpZy5oZWlnaHQ9N30NCmZpbGVEU0NOSTwtIkM6L1VzZXJzL3JvZHJpXzAwMC9PbmVEcml2ZS9FUFIvUENTTF9OSV8wN2p1bGhvMjAxNl8wOWgzMy5EU0MiDQpmaWxlRFRBTkk8LSJDOi9Vc2Vycy9yb2RyaV8wMDAvT25lRHJpdmUvRVBSL1BDU0xfTklfMDdqdWxobzIwMTZfMDloMzMuRFRBIg0KIw0KZHNjTkkgPC0gcmVhZExpbmVzKGZpbGVEU0NOSSxlbmNvZGluZz0iVVRGLTgiKQ0KIw0KcG9udG9zPC1ncmVwKCJYUFRTIixkc2NOSSx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnXHQnKVtbMV1dO1hQVFM8LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIlhNSU4iLGRzY05JLHZhbHVlPVQpO2NhbXBvczwtc3Ryc3BsaXQocG9udG9zLCdcdCcpW1sxXV07WE1JTjwtYXMubnVtZXJpYyhjYW1wb3NbMl0pDQogIHBvbnRvczwtZ3JlcCgiWFdJRCIsZHNjTkksdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJ1x0JylbWzFdXTtYV0lEPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgcG9udG9zPC1ncmVwKCJNV0ZRIixkc2NOSSx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07TUY8LWFzLm51bWVyaWMoY2FtcG9zWzJdKS8xZTkjR0h6DQogIHBvbnRvczwtZ3JlcCgiUkNBRyIsZHNjTkksdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJyAgICAnKVtbMV1dO1JHPC1hcy5udW1lcmljKGNhbXBvc1syXSkNCiAgcG9udG9zPC1ncmVwKCJTUFRQIixkc2NOSSx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07Q1Q8LWFzLm51bWVyaWMoY2FtcG9zWzJdKSoxMDAwI21zDQogIHBvbnRvczwtZ3JlcCgiQVZHUyIsZHNjTkksdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJyAgICAnKVtbMV1dO1NDQU48LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIk1XUFciLGRzY05JLHZhbHVlPVQpO2NhbXBvczwtc3Ryc3BsaXQocG9udG9zLCcgICAgJylbWzFdXTtNV1BXPC1hcy5udW1lcmljKGNhbXBvc1syXSkqMTAwMCNtVw0KICBpbmZvPC1ncmVwKCJEQVRFIiwgZHNjTkksdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChpbmZvLCcgICAgJylbWzFdXTtEQVRFPC0oY2FtcG9zWzJdKQ0KICBpbmZvPC1ncmVwKCJUSU1FIiwgZHNjTkksdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChpbmZvLCcgICAgJylbWzFdXTtUSU1FPC0oY2FtcG9zWzJdKQ0KICAjaW5mb3MkTk9NRVtbaV1dPC1ub21lWzFdDQogICMNCiAgcGFzc288LXJvdW5kKFhXSUQvWFBUUywxKQ0KICBiPC1zZXEoMTpYUFRTKQ0KICBmb3IoaiBpbiAxOlhQVFMpew0KICAgIGJbal08LVhNSU4rKHBhc3NvKihqLTEpKQ0KICB9DQogIGI8LWRhdGEuZnJhbWUoYikNCiAgZzwtNzE0LjU1Kk1GL2INCiAgczwtcmVhZEJpbihmaWxlRFRBTkksIGRvdWJsZSgpLCBuID0gWFBUUywgc2l6ZSA9IDgsIGVuZGlhbiA9ICJiaWciKTtzPC1kYXRhLmZyYW1lKHMpOw0KICNEYXRhIG5vcm1hbGl6YXRpb24gLSBCcnVrZXIgTWFudWFsIGNhcC41LjYNCiBzbjwtcy8oQ1QqU0NBTioyMCoxMF4oUkcvMjApKQ0KICMNCiBkYWRvczwtY2JpbmQoYixnLHMsc24pO2NvbG5hbWVzKGRhZG9zKVsyXSA8LSAiZyI7Y29sbmFtZXMoZGFkb3MpWzRdIDwtICJzbiINCiAjDQogcGxvdChkYWRvcyRiLGRhZG9zJHNuLHR5cGU9Im4iLHhsYWI9Ik1hZ25ldGljIEZpZWxkIChHKSIseWxhYj0iRVBSIFNpZ25hbCBOb3JtYWxpemVkIChhLnUuKSIseWxpbT1jKC0yMCwyMCkpDQogbGluZXMoZGFkb3MkYixkYWRvcyRzbixjb2w9ImJsYWNrIik7Z3JpZChOVUxMLE5VTEwpDQpgYGANCg0KIyMjRXRhcGEgMg0KDQpJcnJhZGlh5+NvIGVtOiAyMS8wNi8yMDE2DQoNCkRvc2U6IDIzLDkga0d5DQoNCkxlaXR1cmEgZG9zIGFycXVpdm9zIGRvIGRpcmV083JpbyAgYHIgZ2V0d2QoKWA6DQoNCkdlcmHn428gZGEgcGxhbmlsaGEgY29tIGByIGxlbmd0aChmaWxlRFNDKWAgYXJxdWl2b3MuDQoNCkNvbHVuYXM6ICANCmIgLSBDYW1wbyBNYWdu6XRpY28gKEcpICANCmcgLSBmYXRvciBnIGNhbGN1bGFkbyBwb3I6DQokJA0KZ0ZhY3Rvcj1cZnJhY3s3MTQuNTUqdihHSHopfXtCKEcpfQ0KJCQNClMgIC0gSW50ZW5zaWRhZGUgZG8gc2luYWwgZGUgRVBSICh1LmEuKSAgDQpTbiAtIEludGVuc2lkYWRlIGRvIHNpbmFsIGRlIEVQUiBub3JtYWxpemFkbyB1dGlsaXphbmRvIGEgZXF1YefjbyBkYSBCcnVrZXI6ICANCiQkDQpzbj1cZGZyYWN7c317Q197VH0obXMpKk5fe1NDQU59KjIwKjEwXntSRyhkQikvMjB9fQ0KJCQNCmBgYHtyfQ0KIw0KYGBgDQoNCg0KIyMjRXRhcGEgMw0KDQpBY29tcGFuaGFtZW50byBkbyBkZWNhaW1lbnRvIGRvIHNpbmFsIGUgUlBFIGFvIGxvbmdvIGRlIGFwcm94aW1hZGFtZW50ZSAxODAgZGlhcy4NCg0KDQpgYGB7cixmaWcud2lkdGg9OSxmaWcuaGVpZ2h0PTd9DQpsaWJyYXJ5KGJhc2VsaW5lKQ0KbGlicmFyeShzcWxkZikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoa25pdHIpDQojdmVyc+NvIDA3IGRlIDA4LTEyLTIwMTYNCiNwcmVwYXJhY2FvIGRlIHVtYSB0YWJlbGENCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI2NhcnJlZ2FuZG8gYSBsaXN0YSBkZSBhcnF1aXZvcyBEU0MgZG8gZGlyDQojIHRyYXRhcmVpIG8gemVybyBlbSBvdXRybyBzY3JpcHQNCmZpbGVEU0M8LWxpc3QuZmlsZXMocGF0dGVybj0iKi5EU0MkIikNCmZpbGVEVEE8LWxpc3QuZmlsZXMocGF0dGVybj0iKi5EVEEkIikNCiNudW0gZGUgYXJxdWl2b3MNCm5uPC1sZW5ndGgoZmlsZURTQykNCiMNCmVzcGVjdHJvczwtbGlzdCgpI2NhcnJlZ28gZSBhcm1hemVubyB0b2RvcyBvcyBlc3BlY3Ryb3M6IGZvcm1hdG8gZXNwZWN0cm9zW1tpXV0kKGIsZyxzLHNuKQ0KaW5mb3M8LWxpc3QoIk5PTUUiPTE6bm4sIlhQVFMiPTE6bm4sIlJHIj0xOm5uLCJEQVRFIj0xOm5uLCJUSU1FIj0xOm5uLCJNRiI9MTpubiwiQ1QiPTE6bm4sIlNDQU4iPTE6bm4sIk1XUFciPTE6bm4sIkhwYXAiPTE6bm4sIkhwYXBzbiI9MTpubikNCiMNCmZvciAoaSBpbiAxOm5uKQ0KICB7DQogIGRzYyA8LSByZWFkTGluZXMoZmlsZURTQ1tpXSxlbmNvZGluZz0iVVRGLTgiKQ0KICAjDQogIG5vbWU8LShzdHJzcGxpdChmaWxlRFNDW2ldLCJcXC4iKSlbWzFdXQ0KICAjDQogIGZpbGVEVEE8LXBhc3RlMChub21lWzFdLCIuRFRBIikNCiAgcG9udG9zPC1ncmVwKCJYUFRTIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJ1x0JylbWzFdXTtpbmZvcyRYUFRTW1tpXV08LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIlhNSU4iLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnXHQnKVtbMV1dO1hNSU48LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIlhXSUQiLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnXHQnKVtbMV1dO1hXSUQ8LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIk1XRlEiLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07aW5mb3MkTUZbW2ldXTwtYXMubnVtZXJpYyhjYW1wb3NbMl0pLzFlOSNHSHoNCiAgcG9udG9zPC1ncmVwKCJSQ0FHIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJyAgICAnKVtbMV1dO2luZm9zJFJHW1tpXV08LWFzLm51bWVyaWMoY2FtcG9zWzJdKQ0KICBwb250b3M8LWdyZXAoIlNQVFAiLGRzYyx2YWx1ZT1UKTtjYW1wb3M8LXN0cnNwbGl0KHBvbnRvcywnICAgICcpW1sxXV07aW5mb3MkQ1RbW2ldXTwtYXMubnVtZXJpYyhjYW1wb3NbMl0pKjEwMDAjbXMNCiAgcG9udG9zPC1ncmVwKCJBVkdTIixkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChwb250b3MsJyAgICAnKVtbMV1dO2luZm9zJFNDQU5bW2ldXTwtYXMubnVtZXJpYyhjYW1wb3NbMl0pDQogIHBvbnRvczwtZ3JlcCgiTVdQVyIsZHNjLHZhbHVlPVQpO2NhbXBvczwtc3Ryc3BsaXQocG9udG9zLCcgICAgJylbWzFdXTtpbmZvcyRNV1BXW1tpXV08LWFzLm51bWVyaWMoY2FtcG9zWzJdKSoxMDAwI21XDQogIGluZm88LWdyZXAoIkRBVEUiLCBkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChpbmZvLCcgICAgJylbWzFdXTtpbmZvcyREQVRFW1tpXV08LShjYW1wb3NbMl0pDQogIGluZm88LWdyZXAoIlRJTUUiLCBkc2MsdmFsdWU9VCk7Y2FtcG9zPC1zdHJzcGxpdChpbmZvLCcgICAgJylbWzFdXTtpbmZvcyRUSU1FW1tpXV08LShjYW1wb3NbMl0pDQogIGluZm9zJE5PTUVbW2ldXTwtbm9tZVsxXQ0KICAjDQogIHBhc3NvPC1yb3VuZChYV0lEL2luZm9zJFhQVFNbW2ldXSwxKQ0KICBiPC1zZXEoMTppbmZvcyRYUFRTW1tpXV0pDQogIGZvcihqIGluIDE6aW5mb3MkWFBUU1tbaV1dKXsNCiAgICBiW2pdPC1YTUlOKyhwYXNzbyooai0xKSkNCiAgfQ0KICBiPC1kYXRhLmZyYW1lKGIpDQogIGc8LTcxNC41NSppbmZvcyRNRltbaV1dL2INCiAgczwtcmVhZEJpbihmaWxlRFRBLCBkb3VibGUoKSwgbiA9IGluZm9zJFhQVFNbW2ldXSwgc2l6ZSA9IDgsIGVuZGlhbiA9ICJiaWciKTtzPC1kYXRhLmZyYW1lKHMpOw0KICAjRGF0YSBub3JtYWxpemF0aW9uIC0gQnJ1a2VyIE1hbnVhbCBjYXAuNS42DQogIHNuPC1zLyhpbmZvcyRDVFtbaV1dKmluZm9zJFNDQU5bW2ldXSoyMCoxMF4oaW5mb3MkUkdbW2ldXS8yMCkpDQogICMNCiAgZGFkb3M8LWNiaW5kKGIsZyxzLHNuKTtjb2xuYW1lcyhkYWRvcylbMl0gPC0gImciO2NvbG5hbWVzKGRhZG9zKVs0XSA8LSAic24iDQogICNndWFyZG8gb3MgZXNwZWN0cm9zDQogIGVzcGVjdHJvc1tbaV1dPC1kYWRvcw0KICAjSHBhcCBzbg0KICBpbmZvcyRIcGFwc25baV08LW1heChkYWRvc1ssNF0pLW1pbihkYWRvc1ssNF0pDQogICNIcGFwIHMNCiAgaW5mb3MkSHBhcFtpXTwtbWF4KGRhZG9zWywzXSktbWluKGRhZG9zWywzXSkNCiANCn0NCmBgYGANCg0KRXhlbXBsbyBkbyBlc3BlY3RybyBkbyBQQ1NMIGlycmFkaWFkbyAobWVkaWRhIGVtIGByIHRtZWQkVERbMjFdYCk6ICANCmBgYHtyLGZpZy53aWR0aD05LGZpZy5oZWlnaHQ9N30NCiMNCnBsb3QoZXNwZWN0cm9zW1syMV1dJGIsZXNwZWN0cm9zW1syMV1dJHNuLHR5cGU9Im4iLHhsYWI9Ik1hZ25ldGljIEZpZWxkIChHKSIseWxhYj0iRVBSIFNpZ25hbCBOb3JtYWxpemVkIChhLnUuKSIseGxpbT1jKDM0MDAsMzYwMCkpDQogbGluZXMoZXNwZWN0cm9zW1syMV1dJGIsZXNwZWN0cm9zW1syMV1dJHNuLGNvbD0iYmxhY2siKTtncmlkKE5VTEwsTlVMTCkNCiMNCmBgYA0KICAgDQoNCiMjIyNBcnF1aXZvcyBhbmFsaXNhZG9zOiAgDQpgYGB7cixmaWcud2lkdGg9OSxmaWcuaGVpZ2h0PTd9DQojIGF06SBhcXVpIGNhcnJlZ3VlaSBvcyBhcnF1aXZvcyBEU0MgZW0gaW5mb3NbW11dIGUgRFRBIGVtIGRhZG9zW1tdXQ0KIyBjYWxjdWxlaSBnIGUgc24gZSBlc3RpbWVpIG9zIEhQYVAgZSBIUGFQbiANCiNjcmlhbmRvIHVtIG5vdm8gY29uanVudG8gZGUgZGFkb3MNCg0KDQp0bWVkPC1saXN0KCJURCI9MTpubiwiQXJxIj0xOm5uLCJIcGFwIj0xOm5uLCJIcGFwc24iPTE6bm4pDQpmb3IgKGkgaW4gMTpubikNCnsNCiAgICB0bWVkJFREW2ldPC1wYXN0ZShpbmZvcyREQVRFW2ldLGluZm9zJFRJTUVbaV0pDQogICAgdG1lZCRBcnFbaV08LWluZm9zJE5PTUVbaV0NCiAgICB0bWVkJEhwYXBbaV08LWluZm9zJEhwYXBbaV0NCiAgICB0bWVkJEhwYXBzbltpXTwtaW5mb3MkSHBhcHNuW2ldDQp9DQp0bWVkJFREPWFzLlBPU0lYY3QodG1lZCRURCxmb3JtYXQ9IiVtLyVkLyV5ICVIOiVNOiVTIix0ej0iVVRDIikNCiNjcmlvIHVtIGRhdGEuZnJhbWUNCnRtZWQ8LWRhdGEuZnJhbWUodG1lZCkNCiMgb3JkZW5vIG9zIGluZGljZXMgcGVsYSBkYXRhIA0KaW5kPC1vcmRlcih0bWVkJFRELGRlY3JlYXNpbmc9RikNCiN0YWJlbGENCmthYmxlKHRtZWRbb3JkZXIodG1lZCRURCksXSxjYXB0aW9uID0gIkRhZG9zIikNCmBgYA0KKk9ic2VydmHn9WVzOiogIA0KKiBIcGFwOiB2YWxvciBwaWNvLWEtcGljbyAgIA0KKiBIcGFwc246IHZhbG9yIHBpY28tYS1waWNvIG5vcm1hbGl6YWRvICANCmBgYHtyfQ0KIw0KYGBgDQoNCg0KIyMjI1Jlc3VsdGFkb3MgcGFyYSBvIGPhbGN1bG8gZG8gZmFkaW5nOiAgDQpgYGB7cixmaWcud2lkdGg9OSxmaWcuaGVpZ2h0PTd9DQojIGNhbGN1bG8gb3MgdGVtcG9zIHJlbGF0aXZvcyBhIG1lZGlkYSBpbmljaWFsIChpbmRbMV0pDQpmYWRpbmc8LWxpc3QoIkYiPTE6bm4sIkhwYXAiPTE6bm4sIkhwYXBzbiI9MTpubikNCmZhZGluZyRGWzFdPC0wDQpmYWRpbmckSHBhcFsxXTwtdG1lZCRIcGFwW2luZFsxXV0NCmZhZGluZyRIcGFwc25bMV08LXRtZWQkSHBhcHNuW2luZFsxXV0NCiMNCiBmb3IgKGkgaW4gMjpubikNCiB7DQogICAgICNmYWRpbmckRltpXTwtZGlmZnRpbWUodG1lZCRURFtpbmRbaV1dLHRtZWQkVERbaW5kWzFdXSx1bml0cz0iaG91cnMiKQ0KICAgICBmYWRpbmckRltpXTwtZGlmZnRpbWUodG1lZCRURFtpbmRbaV1dLHRtZWQkVERbaW5kWzFdXSx1bml0cz0iZGF5cyIpDQogICAgIGZhZGluZyRIcGFwW2ldPC10bWVkJEhwYXBbaW5kW2ldXQ0KICAgICBmYWRpbmckSHBhcHNuW2ldPC10bWVkJEhwYXBzbltpbmRbaV1dDQogfQ0KZGYuZmFkaW5nPC1kYXRhLmZyYW1lKGZhZGluZykNCiN0YWJlbGENCmthYmxlKGRmLmZhZGluZyxjYXB0aW9uID0gIkRlY2FpbWVudG8gZG8gc2luYWwgYW8gbG9uZ28gZG9zIGRpYXMiKQ0KYGBgDQogICANCipPYnNlcnZh5+NvOiogICANCiogRiA6IGludGVydmFsbyBkZSB0ZW1wbyBlbSBkaWFzIGVudHJlIGEgaXJyYWRpYefjbyBlIGEgbWVkaWRhLg0KYGBge3J9DQojDQpgYGANCg0KIyMjI0N1cnZhIGRvIGRlY2FpbWVudG8gZG8gc2luYWwgKHNlbSBkZXNjb250YXIgbyBzaW5hbCBOSSk6ICAgDQpgYGB7cixmaWcud2lkdGg9OSxmaWcuaGVpZ2h0PTd9DQojDQpwbG90KGZhZGluZyRGLGZhZGluZyRIcGFwc24seGxhYj0iRmFkaW5nIChkKSIseWxhYj0iRVBSIFNpZ25hbCBOb3JtYWxpemVkIChhLnUuKSIseGxpbT1jKDAsMjAwKSkNCmxpbmVzKGZhZGluZyRGLGZhZGluZyRIcGFwc24sY29sPSJyZWQiKTtncmlkKE5VTEwsTlVMTCkNCiMNCg0KYGBgDQoNCg0KICAgICAgIA0KDQpPcmxhbmRvIChkZXplbWJyby8yMDE2KQ0KDQoNCg0K