Goal: Assess the effect of different illuminators on reflectance readings of the Standard Reference Target

require(ggplot2)
require(plotly)
library(RColorBrewer)
require(prospectr)
library(soilspec)
#NOTE: there is also asdreader::get_spectra() (see EspCrater_FS3_nb.Rmd)

# > getwd()
# [1] "/media/alobo/DecepNTFS2/HSI_Lab/Testllum_20230717/Rtestllum_20230717"

dirRSpect <- "/home/alobo/owncloudRSpect/RSpect"
dirdat20230717 <- "../TestllumStdRef_20230717"

1. Reading data

#testllum_20230717_samples.csv created in datadoc_log.R
#edited to become "testllum_20230717_samples_v2.csv"

f <- read.csv(file.path(dirdat20230717,"testllum_20230717_samples_v2.csv"), stringsAsFactors = FALSE)
f$ID <- paste0(f$type,"_",f$replicate)
f <- na.omit(f)
#f <- f[f$target=="StdRef",]
certif <- read.csv(file.path(dirRSpect,"RefMCAA01.csv"), stringsAsFactors = FALSE)

2. Build data frame (long format)

d.lf <-  NULL
for (i in 1:nrow(f)) {
  r <- readASD(file.path(dirdat20230717,f$file[i]), out_format = 'list')[[1]]$radiance
  rf <- readASD(file.path(dirdat20230717,f$file[i]), out_format = 'list')[[1]]$reference
  s <- readASD(file.path(dirdat20230717,f$file[i]), out_format = 'list')[[1]]$reflectance
  w <- readASD(file.path(dirdat20230717,f$file[i]), out_format = 'list')[[1]]$wavelength
  #sc <- spliceCorrection(s,wav=w, splice = c(1000, 1800))
  d.lf <- rbind(d.lf,data.frame(f[i,],w,r,rf,s))
  #d <- cbind(d,)
}
head(d.lf,3)

3. Spectra acquired under each illumination type

dW.lf <- d.lf[d.lf$target=="W",]
dStdR.lf <- d.lf[d.lf$target=="StdRef",]

3.1 White Reference

gW <- ggplot(data=dW.lf) +
  geom_line(aes(x=w, y=r, color=type, group=file), linewidth=0.3) +
  #geom_point(aes(x=Wavelength, y=Reflectance,color=site, group=file)) +
  xlab("Wavelength") + ylab("Radiance") + 
  scale_color_brewer(palette = "Set1") +
  theme(legend.position="bottom")
ggplotly(gW + ggtitle("White Reference Target"))

g1 <- ggplot(data=d.lf) +
  geom_line(aes(x=w, y=r, color=type, linetype=target,group=file), linewidth=0.3) +
  xlab("Wavelength") + ylab("Radiance") + 
  scale_color_brewer(palette = "Set1") +
  ggtitle("White (W) and Standard (StdRef) Reference Target") +
  facet_wrap(~type,nrow=3)
print(g1)

Note that in some parts of the spectra acquired under PROLAMP illumination, the radiance of the Standard Reference is higher than that of the White Reference, which will imply some reflectance values > 1.

3.2 Standard Reference

a <- data.frame(file=NA, type="Certification", grade=NA, target="StdRef", replicate=NA, time=NA, ID="certif", w=certif$Wavelength, r=NA, rf=NA, s=certif$Reflectance)

micolor <- c(Certification="black", brewer.pal(3,"Set1") )
names(micolor) <- c("Certification", "KAISER", "PROLAMP", "VILALTA")
g2 <- ggplot(data=rbind(dStdR.lf,a)) +
  geom_line(aes(x=w, y=s, color=type, group=file), linewidth=0.3) +
  #geom_line(data=certif, aes(x=Wavelength, y=Reflectance), color="black")+
  #geom_point(aes(x=Wavelength, y=Reflectance,color=site, group=file)) +
  xlab("Wavelength") + ylab("Reflectance") + 
  scale_color_manual(values=micolor)  +
  theme(legend.position="bottom")
ggplotly(g2 + ggtitle("Standard Reference Target"))

We observe

4. Paired Comparison of illumination systems

TBD using the resampled certification spectra as the X axis

dK <- dStdR.lf[dStdR.lf$type=="KAISER", c(8,9,11)]
dV <- dStdR.lf[dStdR.lf$type=="VILALTA",c(8,9,11)]
dP <- dStdR.lf[dStdR.lf$type=="PROLAMP", c(8,9,11)]
#head(dK)
#head(dV)

dKVP <- cbind(dK,rV=dV$r, sV=dV$s, sP=dP$s)
#head(dKV)
names(dKVP)[2:3] <- c("rK", "sK", "sP")
dKVP$detector <- "1"
dKVP$detector[dKV$w>1000 & dKV$w<=1800] <- "2"
dKVP$detector[dKV$w>1800] <- "3"

g3a <- ggplot(data=dKVP) +
  geom_point(aes(x=sP,y=sV, color=detector),shape=21, size=0.5)+
  xlab("Prolamp") + ylab("Vilalta") +
  theme(aspect.ratio = 1) +
  ggtitle("Reflectance of Standard Target: Vilalta vs Prolamp illumination")
#print(g3a + facet_wrap(~detector, ncol=2, scales="free"))

g3b <- ggplot(data=dKVP) +
  geom_point(aes(x=sP,y=sK, color=detector),shape=21, size=0.5)+
  xlab("Prolamp") + ylab("Kaiser") +
  theme(aspect.ratio = 1) +
  ggtitle("Reflectance of Standard Target: Kaiser vs Prolamp illumination")
#print(g3b + facet_wrap(~detector, ncol=2, scales="free"))

g3c <- ggplot(data=dKVP) +
  geom_point(aes(x=sK,y=sV, color=detector),shape=21, size=0.5)+
  xlab("Kaiser") + ylab("Vilalta") +
  theme(aspect.ratio = 1) +
  ggtitle("Reflectance of Standard Target: Vilalta vs Kaiser bulbs")
#print(g3c + facet_wrap(~detector, ncol=2, scales="free"))
#(Note that we are not reading a uniform white target but a standard reference target with very different #reflectance values along wavelength).

5. Conclusions

  1. Consumer-grade illumination systems (VILLALTA and KAISER) cannot be used for reflectance readings after 1000 nm of wavelength, but can be used with the Specim IQ.
  2. Kaiser bulbs appear to be more powerful and slightly more stable than Vilalta bulbs.
LS0tCnRpdGxlOiAnUmFkaWFuY2UgYW5kIFJlZmxlY3RhbmNlIHNwZWN0cmEgb2YgU3RhbmRhcmQgUmVmZXJlbmNlIFRhcmdldCB1bmRlciBkaWZmZXJlbnQgbGFiIGlsbHVtaW5hdG9ycycKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogbm8KICAgIHRvY19mbG9hdDogbm8KLS0tCgoqIEFndXN0aW4uTG9ib0BnZW8zYmNuLmNzaWMuZXMKKiAyMDIzMDcxNwoKKipHb2FsKio6IEFzc2VzcyB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBpbGx1bWluYXRvcnMgb24gcmVmbGVjdGFuY2UgcmVhZGluZ3Mgb2YgdGhlIFN0YW5kYXJkIFJlZmVyZW5jZSBUYXJnZXQKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShwbG90bHkpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpyZXF1aXJlKHByb3NwZWN0cikKbGlicmFyeShzb2lsc3BlYykKI05PVEU6IHRoZXJlIGlzIGFsc28gYXNkcmVhZGVyOjpnZXRfc3BlY3RyYSgpIChzZWUgRXNwQ3JhdGVyX0ZTM19uYi5SbWQpCgojID4gZ2V0d2QoKQojIFsxXSAiL21lZGlhL2Fsb2JvL0RlY2VwTlRGUzIvSFNJX0xhYi9UZXN0bGx1bV8yMDIzMDcxNy9SdGVzdGxsdW1fMjAyMzA3MTciCgpkaXJSU3BlY3QgPC0gIi9ob21lL2Fsb2JvL293bmNsb3VkUlNwZWN0L1JTcGVjdCIKZGlyZGF0MjAyMzA3MTcgPC0gIi4uL1Rlc3RsbHVtU3RkUmVmXzIwMjMwNzE3IgoKYGBgCgojIyAxLiBSZWFkaW5nIGRhdGEKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI3Rlc3RsbHVtXzIwMjMwNzE3X3NhbXBsZXMuY3N2IGNyZWF0ZWQgaW4gZGF0YWRvY19sb2cuUgojZWRpdGVkIHRvIGJlY29tZSAidGVzdGxsdW1fMjAyMzA3MTdfc2FtcGxlc192Mi5jc3YiCgpmIDwtIHJlYWQuY3N2KGZpbGUucGF0aChkaXJkYXQyMDIzMDcxNywidGVzdGxsdW1fMjAyMzA3MTdfc2FtcGxlc192Mi5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpmJElEIDwtIHBhc3RlMChmJHR5cGUsIl8iLGYkcmVwbGljYXRlKQpmIDwtIG5hLm9taXQoZikKI2YgPC0gZltmJHRhcmdldD09IlN0ZFJlZiIsXQpgYGAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY2VydGlmIDwtIHJlYWQuY3N2KGZpbGUucGF0aChkaXJSU3BlY3QsIlJlZk1DQUEwMS5jc3YiKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCiMjIDIuIEJ1aWxkIGRhdGEgZnJhbWUgKGxvbmcgZm9ybWF0KQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkLmxmIDwtICBOVUxMCmZvciAoaSBpbiAxOm5yb3coZikpIHsKICByIDwtIHJlYWRBU0QoZmlsZS5wYXRoKGRpcmRhdDIwMjMwNzE3LGYkZmlsZVtpXSksIG91dF9mb3JtYXQgPSAnbGlzdCcpW1sxXV0kcmFkaWFuY2UKICByZiA8LSByZWFkQVNEKGZpbGUucGF0aChkaXJkYXQyMDIzMDcxNyxmJGZpbGVbaV0pLCBvdXRfZm9ybWF0ID0gJ2xpc3QnKVtbMV1dJHJlZmVyZW5jZQogIHMgPC0gcmVhZEFTRChmaWxlLnBhdGgoZGlyZGF0MjAyMzA3MTcsZiRmaWxlW2ldKSwgb3V0X2Zvcm1hdCA9ICdsaXN0JylbWzFdXSRyZWZsZWN0YW5jZQogIHcgPC0gcmVhZEFTRChmaWxlLnBhdGgoZGlyZGF0MjAyMzA3MTcsZiRmaWxlW2ldKSwgb3V0X2Zvcm1hdCA9ICdsaXN0JylbWzFdXSR3YXZlbGVuZ3RoCiAgI3NjIDwtIHNwbGljZUNvcnJlY3Rpb24ocyx3YXY9dywgc3BsaWNlID0gYygxMDAwLCAxODAwKSkKICBkLmxmIDwtIHJiaW5kKGQubGYsZGF0YS5mcmFtZShmW2ksXSx3LHIscmYscykpCiAgI2QgPC0gY2JpbmQoZCwpCn0KaGVhZChkLmxmLDMpCmBgYAojIyAzLiBTcGVjdHJhIGFjcXVpcmVkIHVuZGVyIGVhY2ggaWxsdW1pbmF0aW9uIHR5cGUKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZFcubGYgPC0gZC5sZltkLmxmJHRhcmdldD09IlciLF0KZFN0ZFIubGYgPC0gZC5sZltkLmxmJHRhcmdldD09IlN0ZFJlZiIsXQpgYGAKCiMjIDMuMSBXaGl0ZSBSZWZlcmVuY2UKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CmdXIDwtIGdncGxvdChkYXRhPWRXLmxmKSArCiAgZ2VvbV9saW5lKGFlcyh4PXcsIHk9ciwgY29sb3I9dHlwZSwgZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICAjZ2VvbV9wb2ludChhZXMoeD1XYXZlbGVuZ3RoLCB5PVJlZmxlY3RhbmNlLGNvbG9yPXNpdGUsIGdyb3VwPWZpbGUpKSArCiAgeGxhYigiV2F2ZWxlbmd0aCIpICsgeWxhYigiUmFkaWFuY2UiKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpnZ3Bsb3RseShnVyArIGdndGl0bGUoIldoaXRlIFJlZmVyZW5jZSBUYXJnZXQiKSkKCmcxIDwtIGdncGxvdChkYXRhPWQubGYpICsKICBnZW9tX2xpbmUoYWVzKHg9dywgeT1yLCBjb2xvcj10eXBlLCBsaW5ldHlwZT10YXJnZXQsZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICB4bGFiKCJXYXZlbGVuZ3RoIikgKyB5bGFiKCJSYWRpYW5jZSIpICsgCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsKICBnZ3RpdGxlKCJXaGl0ZSAoVykgYW5kIFN0YW5kYXJkIChTdGRSZWYpIFJlZmVyZW5jZSBUYXJnZXQiKSArCiAgZmFjZXRfd3JhcCh+dHlwZSxucm93PTMpCnByaW50KGcxKQpgYGAKTm90ZSB0aGF0IGluIHNvbWUgcGFydHMgb2YgdGhlIHNwZWN0cmEgYWNxdWlyZWQgdW5kZXIgUFJPTEFNUCBpbGx1bWluYXRpb24sIHRoZSByYWRpYW5jZSBvZiB0aGUgU3RhbmRhcmQgUmVmZXJlbmNlIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2YgdGhlIFdoaXRlIFJlZmVyZW5jZSwgd2hpY2ggd2lsbCBpbXBseSBzb21lIHJlZmxlY3RhbmNlIHZhbHVlcyA+IDEuCgoKIyMgMy4yIFN0YW5kYXJkIFJlZmVyZW5jZQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KYSA8LSBkYXRhLmZyYW1lKGZpbGU9TkEsIHR5cGU9IkNlcnRpZmljYXRpb24iLCBncmFkZT1OQSwgdGFyZ2V0PSJTdGRSZWYiLCByZXBsaWNhdGU9TkEsIHRpbWU9TkEsIElEPSJjZXJ0aWYiLCB3PWNlcnRpZiRXYXZlbGVuZ3RoLCByPU5BLCByZj1OQSwgcz1jZXJ0aWYkUmVmbGVjdGFuY2UpCgptaWNvbG9yIDwtIGMoQ2VydGlmaWNhdGlvbj0iYmxhY2siLCBicmV3ZXIucGFsKDMsIlNldDEiKSApCm5hbWVzKG1pY29sb3IpIDwtIGMoIkNlcnRpZmljYXRpb24iLCAiS0FJU0VSIiwgIlBST0xBTVAiLCAiVklMQUxUQSIpCmcyIDwtIGdncGxvdChkYXRhPXJiaW5kKGRTdGRSLmxmLGEpKSArCiAgZ2VvbV9saW5lKGFlcyh4PXcsIHk9cywgY29sb3I9dHlwZSwgZ3JvdXA9ZmlsZSksIGxpbmV3aWR0aD0wLjMpICsKICAjZ2VvbV9saW5lKGRhdGE9Y2VydGlmLCBhZXMoeD1XYXZlbGVuZ3RoLCB5PVJlZmxlY3RhbmNlKSwgY29sb3I9ImJsYWNrIikrCiAgI2dlb21fcG9pbnQoYWVzKHg9V2F2ZWxlbmd0aCwgeT1SZWZsZWN0YW5jZSxjb2xvcj1zaXRlLCBncm91cD1maWxlKSkgKwogIHhsYWIoIldhdmVsZW5ndGgiKSArIHlsYWIoIlJlZmxlY3RhbmNlIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPW1pY29sb3IpICArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpnZ3Bsb3RseShnMiArIGdndGl0bGUoIlN0YW5kYXJkIFJlZmVyZW5jZSBUYXJnZXQiKSkKYGBgCldlIG9ic2VydmUgCgoqIFRoZXJlIGlzIGEgbm90b3Jpb3VzIHZhcmlhYmlsaXR5IG9mIHJlZmxlY3RhbmNlIHJlYWRpbmdzIHdpdGggY29uc3VtZXItZ3JhZGUgaWxsdW1pbmF0aW9uIHN5c3RlbXMgKFZJTExBTFRBIGFuZCBLQUlTRVIpLCBpbiBwYXJ0aWN1bGFyIGFmdGVyIDEwMDAgbm0uIAoqIFJlZmxlY3RhbmNlIHJlYWRpbmdzIHVuZGVyIFZJTEFMVEEgaWxsdW1pbmF0aW9uIGFyZSBtb3JlIHZhcmlhYmxlIHRoYW4gdW5kZXIgS0FJU0VSIGlsbHVtaW5hdGlvbiAoYnV0IHdlIGRpZCBub3QgY29udHJvbCBmb3IgdGhlIHNhbWUgd2FybWluZyB1cCBvZiB0aGUgYnVsYnMpLgoqIFJlZmxlY3RhbmNlIHZhbHVlcyBhcmUgbG93ZXIgd2l0aCBjb25zdW1lci1ncmFkZSBpbGx1bWluYXRpb24gKFZJTExBTFRBIGFuZCBLQUlTRVIpLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgYm90aCBvcHRpbWl6YXRpb24gYW5kIHdoaXRlIHJlZmVyZW5jZSByZWFkaW5ncyB3ZXJlIHBlcmZvcm1lZCBmb3IgZWFjaCB0eXBlIG9mIGlsbHVtaW5hdGlvbiB0eXBlLgoKIyMgNC4gUGFpcmVkIENvbXBhcmlzb24gb2YgaWxsdW1pbmF0aW9uIHN5c3RlbXMKKlRCRCB1c2luZyB0aGUgcmVzYW1wbGVkIGNlcnRpZmljYXRpb24gc3BlY3RyYSBhcyB0aGUgWCBheGlzKgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KZEsgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IktBSVNFUiIsIGMoOCw5LDExKV0KZFYgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IlZJTEFMVEEiLGMoOCw5LDExKV0KZFAgPC0gZFN0ZFIubGZbZFN0ZFIubGYkdHlwZT09IlBST0xBTVAiLCBjKDgsOSwxMSldCiNoZWFkKGRLKQojaGVhZChkVikKCmRLVlAgPC0gY2JpbmQoZEssclY9ZFYkciwgc1Y9ZFYkcywgc1A9ZFAkcykKI2hlYWQoZEtWKQpuYW1lcyhkS1ZQKVsyOjNdIDwtIGMoInJLIiwgInNLIiwgInNQIikKZEtWUCRkZXRlY3RvciA8LSAiMSIKZEtWUCRkZXRlY3RvcltkS1Ykdz4xMDAwICYgZEtWJHc8PTE4MDBdIDwtICIyIgpkS1ZQJGRldGVjdG9yW2RLViR3PjE4MDBdIDwtICIzIgoKZzNhIDwtIGdncGxvdChkYXRhPWRLVlApICsKICBnZW9tX3BvaW50KGFlcyh4PXNQLHk9c1YsIGNvbG9yPWRldGVjdG9yKSxzaGFwZT0yMSwgc2l6ZT0wLjUpKwogIHhsYWIoIlByb2xhbXAiKSArIHlsYWIoIlZpbGFsdGEiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSkgKwogIGdndGl0bGUoIlJlZmxlY3RhbmNlIG9mIFN0YW5kYXJkIFRhcmdldDogVmlsYWx0YSB2cyBQcm9sYW1wIGlsbHVtaW5hdGlvbiIpCiNwcmludChnM2EgKyBmYWNldF93cmFwKH5kZXRlY3RvciwgbmNvbD0yLCBzY2FsZXM9ImZyZWUiKSkKCmczYiA8LSBnZ3Bsb3QoZGF0YT1kS1ZQKSArCiAgZ2VvbV9wb2ludChhZXMoeD1zUCx5PXNLLCBjb2xvcj1kZXRlY3Rvciksc2hhcGU9MjEsIHNpemU9MC41KSsKICB4bGFiKCJQcm9sYW1wIikgKyB5bGFiKCJLYWlzZXIiKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSkgKwogIGdndGl0bGUoIlJlZmxlY3RhbmNlIG9mIFN0YW5kYXJkIFRhcmdldDogS2Fpc2VyIHZzIFByb2xhbXAgaWxsdW1pbmF0aW9uIikKI3ByaW50KGczYiArIGZhY2V0X3dyYXAofmRldGVjdG9yLCBuY29sPTIsIHNjYWxlcz0iZnJlZSIpKQoKZzNjIDwtIGdncGxvdChkYXRhPWRLVlApICsKICBnZW9tX3BvaW50KGFlcyh4PXNLLHk9c1YsIGNvbG9yPWRldGVjdG9yKSxzaGFwZT0yMSwgc2l6ZT0wLjUpKwogIHhsYWIoIkthaXNlciIpICsgeWxhYigiVmlsYWx0YSIpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKSArCiAgZ2d0aXRsZSgiUmVmbGVjdGFuY2Ugb2YgU3RhbmRhcmQgVGFyZ2V0OiBWaWxhbHRhIHZzIEthaXNlciBidWxicyIpCiNwcmludChnM2MgKyBmYWNldF93cmFwKH5kZXRlY3RvciwgbmNvbD0yLCBzY2FsZXM9ImZyZWUiKSkKIyhOb3RlIHRoYXQgd2UgYXJlIG5vdCByZWFkaW5nIGEgdW5pZm9ybSB3aGl0ZSB0YXJnZXQgYnV0IGEgc3RhbmRhcmQgcmVmZXJlbmNlIHRhcmdldCB3aXRoIHZlcnkgZGlmZmVyZW50ICNyZWZsZWN0YW5jZSB2YWx1ZXMgYWxvbmcgd2F2ZWxlbmd0aCkuCmBgYAoKIyMgNS4gQ29uY2x1c2lvbnMKCjEuIENvbnN1bWVyLWdyYWRlIGlsbHVtaW5hdGlvbiBzeXN0ZW1zIChWSUxMQUxUQSBhbmQgS0FJU0VSKSBjYW5ub3QgYmUgdXNlZCBmb3IgcmVmbGVjdGFuY2UgcmVhZGluZ3MgYWZ0ZXIgMTAwMCBubSBvZiB3YXZlbGVuZ3RoLCBidXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgU3BlY2ltIElRLgoyLiBLYWlzZXIgYnVsYnMgYXBwZWFyIHRvIGJlIG1vcmUgcG93ZXJmdWwgYW5kIHNsaWdodGx5IG1vcmUgc3RhYmxlIHRoYW4gVmlsYWx0YSBidWxicy4KCiAK