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")
TD Arq Hpap Hpapsn
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")
F Hpap Hpapsn
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