Serendib 1.0 is the first ever high altitude balloon launched by SEDS Sri Lanka. It was launched from D.S.Senanayaka College Dambulla on 26th December 2020 and the payload was recovered near Rideebendiella area on the same day.

library(leaflet)
leaflet() %>%
  addTiles() %>%
  setView(lng=80.47522, lat =7.802725,  zoom = 10)%>%
  addMarkers(lat=7.85772, lng=80.69006, 
             label = "Launch Site" ,
             popup = "Serendib 1.0 Launch Site",
             icon= icons(
               iconUrl = "balloon launch.png",
               iconWidth = 33, iconHeight = 76,
               iconAnchorX = 22, iconAnchorY = 94,))%>%
  addMarkers(lat=7.74773, lng=80.26038, 
             label= "Land Site", 
             popup = "Serendib 1.0 Payload Land Site", 
             icon= icons(
               iconUrl = "balloon land.png",
               iconWidth = 33, iconHeight = 76,
               iconAnchorX = 22, iconAnchorY = 94,) )

Four different types of atmospheric data were collected continuously during the whole flight period. They are the altitude, pressure, temperature and humidity. The following window shows how we collected a summary of data for analyzing the data we collected.

dataset <- read.csv("data.csv")
df<- data.frame(
  dataset$Time..Edited.,
  dataset$GPS.altitude..km.,
  dataset$iMet.pressure..mb.,
  dataset$iMet.air.temperature..corrected...deg.C.,
  dataset$iMet.humidity..RH...)

columns = list("Time","Altitude","Pressure","Temperature","Humidity")
for (i in 1:5) {
  names(df)[i] <- columns[i]
}
summary(df[,2:5])
    Altitude         Pressure       Temperature         Humidity     
 Min.   : 0.335   Min.   : 12.51   Min.   :-81.500   Min.   :  0.30  
 1st Qu.: 5.439   1st Qu.:186.25   1st Qu.:-49.810   1st Qu.:  4.10  
 Median : 8.034   Median :370.94   Median :-17.880   Median :  6.30  
 Mean   : 9.703   Mean   :370.17   Mean   :-24.888   Mean   : 20.70  
 3rd Qu.:12.550   3rd Qu.:521.68   3rd Qu.: -2.167   3rd Qu.: 33.75  
 Max.   :29.649   Max.   :987.02   Max.   : 23.020   Max.   :100.00  
 NA's   :216                                                         

It can be seen that the highest altitude achieved is 29.649 km and that was achieved approximately after 1 hour and 20 minutes. The total flight time is 1 hour and 48 minutes, but including the retrieval time, the total mission took approximately 3 hours.

It was planned to have an ascend rate of 5 ms-1 and a descend rate of 6 ms-1. Even though , the achieved ascend rate was 5.74ms-1 and a descend rate was 21.38 ms-1 as shown in the figure below.

alt_max_row<-which.max(df$Altitude)
ascend_rate<-(df[alt_max_row,"Altitude"]-df[1,"Altitude"])/(df[alt_max_row,"Time"]-df[1,"Time"])/18*5
descend_rate<-(df[alt_max_row,"Altitude"]-df[1175,"Altitude"])/(df[alt_max_row,"Time"]-df[1175,"Time"])/18*5
cat("Ascend rate of the balloon is",ascend_rate,"ms−1","\nDescend rate of the balloon is",-descend_rate,"ms−1")
Ascend rate of the balloon is 5.738204 ms-1 
Descend rate of the balloon is 21.38147 ms-1
library(ggplot2)
plot_A_vs_T<-ggplot(data=df,aes(x=Time,y=Altitude))+
  geom_point(na.rm = TRUE,aes(colour = factor(Time<1.420085)))+
  geom_quantile(method = "rqss",quantiles = c(0.5),color="#9573C9",alpha=0.8,size=1,na.rm = TRUE,lambda=5)+
  theme(
    plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
    axis.title.x = element_text(color="#343434",size=12,face="bold"),
    axis.title.y = element_text(color="#343434",size=12,face="bold"),
    plot.caption = element_text(color="#3A4D5C"),
    plot.caption.position = "plot",
    legend.position = "right")+
  labs(x="Time (h)",y="Altitude(km)",title ="Graph of Altitude vs Time",
       caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
  scale_colour_hue(name = "Legend",labels=c("Descend", "Ascend"))+
  annotate(geom = "text", x = 0.6, y = 18, label = "5.74"~ms^-1)+
  annotate(geom = "text", x = 1.725, y = 18, label = "21.38"~ms^-1)

plot_A_vs_T

According to the above chart, the balloon passed through three atmospheric layers during its fight time. troposphere (altitude < 11km) tropopause (11km<altitude<20km) :the lower boundary of stratosphere stratopause (20km<altitude<32km):upper boundary of stratosphere.

The International Standard Atmosphere(ISA) model has few equations to calculate the temperature and pressure change with altitude.

For the troposphere: \[T=T_0+L_{Trop.}h\] \[P=P_0\left(1+\frac{L_{Trop}.h}{T_0}\right)^{\frac{-gM}{RL_{Trop.}}}\]

For the tropopause: \[T=216.65\hspace{2pt}K\hspace{4pt}(-56.5^0C)\] \[P=22633.e^{\left(\frac{-gM(h-11000)}{216.65R}\right)}\]

For the stratopause: \[T=216.65+L_{Strat.}(h-20000)\] \[P=5475.2\left(\frac{216.65+L_{Strat.}h}{216.65+20000L_{Strat.}}\right)\] The following graph shows how the temperature varies with the altitude according to our dataset and ISA equations.

#Graph by dataset
plot_T_vs_A = ggplot(data = df,aes(x=Altitude,y=Temperature))+
  geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
  geom_quantile(method = "rqss",quantiles = c(0.5),color="#9573C9",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
  theme(
    plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
    axis.title.x = element_text(color="#343434",size=11,face="bold"),
    axis.title.y = element_text(color="#343434",size=11,face="bold"),
    plot.caption = element_text(color="#3A4D5C"),
    plot.caption.position = "plot",
    legend.position = "right")+
  labs(x="Altitude (km)",y="Temperature (°C)",title ="Graph of Temperature vs Altitude",
       caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
  scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))+
  annotate(geom = "text", x = 1, y = -30, label = "Graph\naccording\nto ISA eqations", hjust = 0)+
  annotate(geom = "text", x = 14, y = -5, label = "Graph according\nto dataset", hjust = 1)
 
#Graph by ISA Equations
T0=15+273.15
Ltrop= -0.0065
Lstat= 0.001
xts <- seq(0,11,by=0.001)
f1 <- function(xts) (T0+Ltrop*xts*1000)-273.15
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f1, colour="#3366FF",xlim = c(0,11),size=1)
xtp <- seq(11.001,20,by=0.001)
f2 <- function(xtp) -56.5
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f2, colour="#3366FF",xlim = c(11,20),size=1)
xsp <- seq(20.001,30,by=0.001)
f3 <- function(xsp) -56.5+Lstat*(xsp-20)*1000
plot_T_vs_A<-plot_T_vs_A+stat_function(fun=f3, colour="#3366FF",xlim = c(20,30),size=1)
plot_T_vs_A

The following graph shows how the pressure varies with the altitude according to our dataset and ISA equations.

#Graph by dataset
plot_P_vs_A = ggplot(data = df,aes(x=Altitude,y=Pressure))+
  geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
  geom_quantile(method = "rqss",quantiles = c(0.5),color="RED",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
  theme(
    plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
    axis.title.x = element_text(color="#343434",size=11,face="bold"),
    axis.title.y = element_text(color="#343434",size=11,face="bold"),
    plot.caption = element_text(color="#3A4D5C"),
    plot.caption.position = "plot",
    legend.position = "right")+
  labs(x="Altitude (km)",y="Pressure (mbar)",title ="Graph of Pressure vs Altitude",
       caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
  scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))+
  annotate(geom = "text", x = 11.5, y = 950, label = "Red line - Graph according to dataset", hjust = 0,size=3.5,color="#5F6062")+
  annotate(geom = "text", x = 11.5, y = 880, label = "Blue line - Graph according to ISA equations", hjust = 0,size=3.5,color="#5F6062")


#Graph by ISA Equations
P0=101325
R= 8.31432
g= 9.80665
M=0.0289644
Ltrop= -0.0065
Lstrat= 0.001
T0=273.15+15
xpts <- seq(0,11,by=0.001)
fp1 <- function(xpts) (P0*(1+Ltrop*xpts*1000/T0)^(-g*M/R/Ltrop))/100
pdat <- data.frame(x=xpts,y=(P0*(1+Ltrop*xpts*1000/T0)^(-g*M/R/Ltrop))/100)
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp1, colour="#3366FF",xlim = c(0,11),size=1)
xptp <- seq(11.001,20,by=0.001)
fp2 <- function(xptp) (22633*exp(-g*M*(xptp-11)*1000/216.65/R))/100
pdat <- rbind(pdat,data.frame(x=xptp,y=(22633*exp(-g*M*(xptp-11)*1000/216.65/R))/100))
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp2, colour="#3366FF",xlim = c(11,20),size=1)
xpsp <- seq(20.001,30,by=0.001)
fp3 <- function(xpsp) (5475.2*((216.65+Lstrat*xpsp*1000)/(216.65+20000*Lstrat)))/100
pdat <- rbind(pdat,data.frame(x=xpsp,y=(5475.2*((216.65+Lstrat*xpsp*1000)/(216.65+20000*Lstrat)))/100))
plot_P_vs_A<-plot_P_vs_A+stat_function(fun=fp3, colour="#3366FF",xlim = c(20,30),size=1)
plot_P_vs_A

The humidity data collected can be plotted as shown below.

plot_H_vs_A = ggplot(data = df,aes(x=Altitude,y=Humidity))+
  geom_point(na.rm = TRUE,aes(color=factor(Time<1.420085)),alpha=0.3)+
  geom_quantile(method = "rqss",quantiles = c(0.5),color="#663494",alpha=0.8,size=1,na.rm = TRUE,lambda = 5)+
  theme(
    plot.title = element_text(color="#276BB0",size=14,face="bold.italic",hjust = 0.5),
    axis.title.x = element_text(color="#343434",size=11,face="bold"),
    axis.title.y = element_text(color="#343434",size=11,face="bold"),
    plot.caption = element_text(color="#3A4D5C"),
    plot.caption.position = "plot",
    legend.position = "right")+
  labs(x="Altitude (km)",y="Humidity (%)",title ="Graph of Humidity vs Altitude",
       caption ="Serendib 1.0 Radiosonde data © SEDS Sri Lanka")+
  scale_colour_hue(name = "Data From\nRadiosond",labels=c("Descend", "Ascend"))
plot_H_vs_A

Discussion

The Overall launch was successful even though some of the results obtained varied from the expected results predicted before launch.

The slight variation of the actual ascend rate when compared with the predicted ascend rate may have been due to variation of wind directions and speeds after the launch. It may have also varied slightly due to the amount of gas filled inside the balloon varying slightly than the calculated value in simulations.

The large variation in the descent rate may have been a result of the blasted balloon falling on top of the parachute and the parachute not deploying the correct way which may have caused an increase of speed in the payload. The parachute may also have been pre tangled prior to deploying due to high winds which may have resulted in incorrect deployment of the parachute. Both rise and fall show linear graphs therefore both ascend and descend rates were constant throughout the journey.

The highest altitude achieved was nearly equal to the pre calculated highest altitude and therefore the amount of gas filled to the balloon has been almost exactly the pre calculated amount and the slight variation may have been due to the dew formation on the balloon prior to launch.

The temperature variations have been almost the same in both ascend and descent and have reached a minimum at the same altitude both when rising and falling. The rise in temperature after a certain altitude is due to the Ozone layer existing in that altitude.

Pressure variation is also seen to overlap in ascent as well and in descent. Few sudden variations in humidity can be seen due to the atmospheric conditions on that day of the launch.


A project by SEDS Sri Lanka

Project Managers

Amila Sandun Basnayaka·Thilan Harshana·Thashmila Araliya·Bhanuka Ranaweera·Thilangi Kasthuriarachchi

Organizing Committee

Dasuni Hewawasam·Tharika Dishani·Sharadha Samarakoon·Supeshi Wedagedara·Aseka Warnasooriya·Bhathiya Senevirathna·Matheesha Senanayaka·Michelle Fernando·Subhoda Rathnayaka·Ajan Eshwara

Technical Team

Madhushan Subash·Maneesh Yatiwala·Yasika Gunathilaka·Ushan Sakuntha·Charitha Weerasooriya·Tharindu Kavinda·Vanodya Warnasooriya·Anupa Kulathunga

Financial and Marketing Team

Rashane Pintoe·Pudbudika Wickramasinghe·Ravindu Balasooriya·Raveesha Illesinghe·Tharuni Priyangika·Malsha Rajapaksha


Developed by Anupa Kulathunga

Copyright © 2021 SEDS Sri Lanka. All rights reserved

LS0tDQp0aXRsZTogIlNlcmVuZGliIDEuMCINCmF1dGhvcjogIlNFRFMgU3JpIExhbmthIg0Kc3VidGl0bGU6IEhpZ2ggQWx0aXR1ZGUgQmFsbG9vbg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCg0KKipTZXJlbmRpYiAxLjAqKiBpcyB0aGUgZmlyc3QgZXZlciBoaWdoIGFsdGl0dWRlIGJhbGxvb24gbGF1bmNoZWQgYnkgU0VEUyBTcmkgTGFua2EuIEl0IHdhcyBsYXVuY2hlZCBmcm9tICpELlMuU2VuYW5heWFrYSBDb2xsZWdlIERhbWJ1bGxhKiBvbiAyNnRoIERlY2VtYmVyIDIwMjAgYW5kIHRoZSBwYXlsb2FkIHdhcyByZWNvdmVyZWQgbmVhciAqUmlkZWViZW5kaWVsbGEqIGFyZWEgb24gdGhlIHNhbWUgZGF5Lg0KDQpgYGB7cn0NCmxpYnJhcnkobGVhZmxldCkNCmxlYWZsZXQoKSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUNCiAgc2V0Vmlldyhsbmc9ODAuNDc1MjIsIGxhdCA9Ny44MDI3MjUsICB6b29tID0gMTApJT4lDQogIGFkZE1hcmtlcnMobGF0PTcuODU3NzIsIGxuZz04MC42OTAwNiwgDQogICAgICAgICAgICAgbGFiZWwgPSAiTGF1bmNoIFNpdGUiICwNCiAgICAgICAgICAgICBwb3B1cCA9ICJTZXJlbmRpYiAxLjAgTGF1bmNoIFNpdGUiLA0KICAgICAgICAgICAgIGljb249IGljb25zKA0KICAgICAgICAgICAgICAgaWNvblVybCA9ICJiYWxsb29uIGxhdW5jaC5wbmciLA0KICAgICAgICAgICAgICAgaWNvbldpZHRoID0gMzMsIGljb25IZWlnaHQgPSA3NiwNCiAgICAgICAgICAgICAgIGljb25BbmNob3JYID0gMjIsIGljb25BbmNob3JZID0gOTQsKSklPiUNCiAgYWRkTWFya2VycyhsYXQ9Ny43NDc3MywgbG5nPTgwLjI2MDM4LCANCiAgICAgICAgICAgICBsYWJlbD0gIkxhbmQgU2l0ZSIsIA0KICAgICAgICAgICAgIHBvcHVwID0gIlNlcmVuZGliIDEuMCBQYXlsb2FkIExhbmQgU2l0ZSIsIA0KICAgICAgICAgICAgIGljb249IGljb25zKA0KICAgICAgICAgICAgICAgaWNvblVybCA9ICJiYWxsb29uIGxhbmQucG5nIiwNCiAgICAgICAgICAgICAgIGljb25XaWR0aCA9IDMzLCBpY29uSGVpZ2h0ID0gNzYsDQogICAgICAgICAgICAgICBpY29uQW5jaG9yWCA9IDIyLCBpY29uQW5jaG9yWSA9IDk0LCkgKQ0KYGBgDQoNCkZvdXIgZGlmZmVyZW50IHR5cGVzIG9mIGF0bW9zcGhlcmljIGRhdGEgd2VyZSBjb2xsZWN0ZWQgY29udGludW91c2x5IGR1cmluZyB0aGUgd2hvbGUgZmxpZ2h0IHBlcmlvZC4gVGhleSBhcmUgdGhlIGFsdGl0dWRlLCBwcmVzc3VyZSwgdGVtcGVyYXR1cmUgYW5kIGh1bWlkaXR5LiBUaGUgZm9sbG93aW5nIHdpbmRvdyBzaG93cyBob3cgd2UgY29sbGVjdGVkIGEgc3VtbWFyeSBvZiBkYXRhIGZvciBhbmFseXppbmcgdGhlIGRhdGEgd2UgY29sbGVjdGVkLg0KYGBge3J9DQpkYXRhc2V0IDwtIHJlYWQuY3N2KCJkYXRhLmNzdiIpDQpkZjwtIGRhdGEuZnJhbWUoDQogIGRhdGFzZXQkVGltZS4uRWRpdGVkLiwNCiAgZGF0YXNldCRHUFMuYWx0aXR1ZGUuLmttLiwNCiAgZGF0YXNldCRpTWV0LnByZXNzdXJlLi5tYi4sDQogIGRhdGFzZXQkaU1ldC5haXIudGVtcGVyYXR1cmUuLmNvcnJlY3RlZC4uLmRlZy5DLiwNCiAgZGF0YXNldCRpTWV0Lmh1bWlkaXR5Li5SSC4uLikNCg0KY29sdW1ucyA9IGxpc3QoIlRpbWUiLCJBbHRpdHVkZSIsIlByZXNzdXJlIiwiVGVtcGVyYXR1cmUiLCJIdW1pZGl0eSIpDQpmb3IgKGkgaW4gMTo1KSB7DQogIG5hbWVzKGRmKVtpXSA8LSBjb2x1bW5zW2ldDQp9DQpzdW1tYXJ5KGRmWywyOjVdKQ0KYGBgDQoNCkl0IGNhbiBiZSBzZWVuIHRoYXQgdGhlIGhpZ2hlc3QgYWx0aXR1ZGUgYWNoaWV2ZWQgaXMgICoqMjkuNjQ5IGttKiogYW5kIHRoYXQgd2FzIGFjaGlldmVkIGFwcHJveGltYXRlbHkgYWZ0ZXIgKioxIGhvdXIgYW5kIDIwIG1pbnV0ZXMqKi4gVGhlIHRvdGFsIGZsaWdodCB0aW1lIGlzICoqMSBob3VyIGFuZCA0OCBtaW51dGVzKiosIGJ1dCBpbmNsdWRpbmcgdGhlIHJldHJpZXZhbCB0aW1lLCB0aGUgdG90YWwgbWlzc2lvbiB0b29rIGFwcHJveGltYXRlbHkgKiozIGhvdXJzKiouIA0KDQpJdCB3YXMgcGxhbm5lZCB0byBoYXZlIGFuIGFzY2VuZCByYXRlIG9mICoqNSBtc14tMV4qKiBhbmQgYSBkZXNjZW5kIHJhdGUgb2YgKio2IG1zXi0xXioqLiBFdmVuIHRob3VnaCAsIHRoZSBhY2hpZXZlZCBhc2NlbmQgcmF0ZSB3YXMgKio1Ljc0bXNeLTFeKiogYW5kIGEgZGVzY2VuZCByYXRlIHdhcyAqKjIxLjM4IG1zXi0xXioqIGFzIHNob3duIGluIHRoZSBmaWd1cmUgYmVsb3cuIA0KYGBge3J9DQphbHRfbWF4X3Jvdzwtd2hpY2gubWF4KGRmJEFsdGl0dWRlKQ0KYXNjZW5kX3JhdGU8LShkZlthbHRfbWF4X3JvdywiQWx0aXR1ZGUiXS1kZlsxLCJBbHRpdHVkZSJdKS8oZGZbYWx0X21heF9yb3csIlRpbWUiXS1kZlsxLCJUaW1lIl0pLzE4KjUNCmRlc2NlbmRfcmF0ZTwtKGRmW2FsdF9tYXhfcm93LCJBbHRpdHVkZSJdLWRmWzExNzUsIkFsdGl0dWRlIl0pLyhkZlthbHRfbWF4X3JvdywiVGltZSJdLWRmWzExNzUsIlRpbWUiXSkvMTgqNQ0KY2F0KCJBc2NlbmQgcmF0ZSBvZiB0aGUgYmFsbG9vbiBpcyIsYXNjZW5kX3JhdGUsIm1z4oiSMSIsIlxuRGVzY2VuZCByYXRlIG9mIHRoZSBiYWxsb29uIGlzIiwtZGVzY2VuZF9yYXRlLCJtc+KIkjEiKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KcGxvdF9BX3ZzX1Q8LWdncGxvdChkYXRhPWRmLGFlcyh4PVRpbWUseT1BbHRpdHVkZSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3VyID0gZmFjdG9yKFRpbWU8MS40MjAwODUpKSkrDQogIGdlb21fcXVhbnRpbGUobWV0aG9kID0gInJxc3MiLHF1YW50aWxlcyA9IGMoMC41KSxjb2xvcj0iIzk1NzNDOSIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhPTUpKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMjc2QkIwIixzaXplPTE0LGZhY2U9ImJvbGQuaXRhbGljIixoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMzQzNDM0IixzaXplPTEyLGZhY2U9ImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTIsZmFjZT0iYm9sZCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzNBNEQ1QyIpLA0KICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh4PSJUaW1lIChoKSIseT0iQWx0aXR1ZGUoa20pIix0aXRsZSA9IkdyYXBoIG9mIEFsdGl0dWRlIHZzIFRpbWUiLA0KICAgICAgIGNhcHRpb24gPSJTZXJlbmRpYiAxLjAgUmFkaW9zb25kZSBkYXRhIMKpIFNFRFMgU3JpIExhbmthIikrDQogIHNjYWxlX2NvbG91cl9odWUobmFtZSA9ICJMZWdlbmQiLGxhYmVscz1jKCJEZXNjZW5kIiwgIkFzY2VuZCIpKSsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDAuNiwgeSA9IDE4LCBsYWJlbCA9ICI1Ljc0In5tc14tMSkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxLjcyNSwgeSA9IDE4LCBsYWJlbCA9ICIyMS4zOCJ+bXNeLTEpDQoNCnBsb3RfQV92c19UDQpgYGANCg0KQWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjaGFydCwgdGhlIGJhbGxvb24gcGFzc2VkIHRocm91Z2ggdGhyZWUgYXRtb3NwaGVyaWMgbGF5ZXJzIGR1cmluZyBpdHMgZmlnaHQgdGltZS4gDQoqKnRyb3Bvc3BoZXJlKiogKihhbHRpdHVkZSA8IDExa20pKg0KKip0cm9wb3BhdXNlKiogKigxMWttPGFsdGl0dWRlPDIwa20pIDp0aGUgbG93ZXIgYm91bmRhcnkgb2Ygc3RyYXRvc3BoZXJlKg0KKipzdHJhdG9wYXVzZSoqICooMjBrbTxhbHRpdHVkZTwzMmttKTp1cHBlciBib3VuZGFyeSBvZiBzdHJhdG9zcGhlcmUuKg0KDQpUaGUgSW50ZXJuYXRpb25hbCBTdGFuZGFyZCBBdG1vc3BoZXJlKElTQSkgbW9kZWwgaGFzIGZldyBlcXVhdGlvbnMgdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSBhbmQgcHJlc3N1cmUgY2hhbmdlIHdpdGggYWx0aXR1ZGUuDQoNCkZvciB0aGUgdHJvcG9zcGhlcmU6DQokJFQ9VF8wK0xfe1Ryb3AufWgkJA0KJCRQPVBfMFxsZWZ0KDErXGZyYWN7TF97VHJvcH0uaH17VF8wfVxyaWdodClee1xmcmFjey1nTX17Ukxfe1Ryb3AufX19JCQNCg0KRm9yIHRoZSB0cm9wb3BhdXNlOg0KJCRUPTIxNi42NVxoc3BhY2V7MnB0fUtcaHNwYWNlezRwdH0oLTU2LjVeMEMpJCQNCiQkUD0yMjYzMy5lXntcbGVmdChcZnJhY3stZ00oaC0xMTAwMCl9ezIxNi42NVJ9XHJpZ2h0KX0kJA0KDQpGb3IgdGhlIHN0cmF0b3BhdXNlOg0KJCRUPTIxNi42NStMX3tTdHJhdC59KGgtMjAwMDApJCQNCiQkUD01NDc1LjJcbGVmdChcZnJhY3syMTYuNjUrTF97U3RyYXQufWh9ezIxNi42NSsyMDAwMExfe1N0cmF0Ln19XHJpZ2h0KSQkDQpUaGUgZm9sbG93aW5nIGdyYXBoIHNob3dzIGhvdyB0aGUgdGVtcGVyYXR1cmUgdmFyaWVzIHdpdGggdGhlIGFsdGl0dWRlIGFjY29yZGluZyB0byBvdXIgZGF0YXNldCBhbmQgSVNBIGVxdWF0aW9ucy4NCmBgYHtyfQ0KI0dyYXBoIGJ5IGRhdGFzZXQNCnBsb3RfVF92c19BID0gZ2dwbG90KGRhdGEgPSBkZixhZXMoeD1BbHRpdHVkZSx5PVRlbXBlcmF0dXJlKSkrDQogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLGFlcyhjb2xvcj1mYWN0b3IoVGltZTwxLjQyMDA4NSkpLGFscGhhPTAuMykrDQogIGdlb21fcXVhbnRpbGUobWV0aG9kID0gInJxc3MiLHF1YW50aWxlcyA9IGMoMC41KSxjb2xvcj0iIzk1NzNDOSIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhID0gNSkrDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9IiMyNzZCQjAiLHNpemU9MTQsZmFjZT0iYm9sZC5pdGFsaWMiLGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzM0MzQzNCIsc2l6ZT0xMSxmYWNlPSJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjM0E0RDVDIiksDQogICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHg9IkFsdGl0dWRlIChrbSkiLHk9IlRlbXBlcmF0dXJlICjCsEMpIix0aXRsZSA9IkdyYXBoIG9mIFRlbXBlcmF0dXJlIHZzIEFsdGl0dWRlIiwNCiAgICAgICBjYXB0aW9uID0iU2VyZW5kaWIgMS4wIFJhZGlvc29uZGUgZGF0YSDCqSBTRURTIFNyaSBMYW5rYSIpKw0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWUgPSAiRGF0YSBGcm9tXG5SYWRpb3NvbmQiLGxhYmVscz1jKCJEZXNjZW5kIiwgIkFzY2VuZCIpKSsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDEsIHkgPSAtMzAsIGxhYmVsID0gIkdyYXBoXG5hY2NvcmRpbmdcbnRvIElTQSBlcWF0aW9ucyIsIGhqdXN0ID0gMCkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxNCwgeSA9IC01LCBsYWJlbCA9ICJHcmFwaCBhY2NvcmRpbmdcbnRvIGRhdGFzZXQiLCBoanVzdCA9IDEpDQogDQojR3JhcGggYnkgSVNBIEVxdWF0aW9ucw0KVDA9MTUrMjczLjE1DQpMdHJvcD0gLTAuMDA2NQ0KTHN0YXQ9IDAuMDAxDQp4dHMgPC0gc2VxKDAsMTEsYnk9MC4wMDEpDQpmMSA8LSBmdW5jdGlvbih4dHMpIChUMCtMdHJvcCp4dHMqMTAwMCktMjczLjE1DQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjEsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMCwxMSksc2l6ZT0xKQ0KeHRwIDwtIHNlcSgxMS4wMDEsMjAsYnk9MC4wMDEpDQpmMiA8LSBmdW5jdGlvbih4dHApIC01Ni41DQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjIsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMTEsMjApLHNpemU9MSkNCnhzcCA8LSBzZXEoMjAuMDAxLDMwLGJ5PTAuMDAxKQ0KZjMgPC0gZnVuY3Rpb24oeHNwKSAtNTYuNStMc3RhdCooeHNwLTIwKSoxMDAwDQpwbG90X1RfdnNfQTwtcGxvdF9UX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZjMsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMjAsMzApLHNpemU9MSkNCnBsb3RfVF92c19BDQpgYGANCg0KVGhlIGZvbGxvd2luZyBncmFwaCBzaG93cyBob3cgdGhlIHByZXNzdXJlIHZhcmllcyB3aXRoIHRoZSBhbHRpdHVkZSBhY2NvcmRpbmcgdG8gb3VyIGRhdGFzZXQgYW5kIElTQSBlcXVhdGlvbnMuDQpgYGB7cn0NCiNHcmFwaCBieSBkYXRhc2V0DQpwbG90X1BfdnNfQSA9IGdncGxvdChkYXRhID0gZGYsYWVzKHg9QWx0aXR1ZGUseT1QcmVzc3VyZSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3I9ZmFjdG9yKFRpbWU8MS40MjAwODUpKSxhbHBoYT0wLjMpKw0KICBnZW9tX3F1YW50aWxlKG1ldGhvZCA9ICJycXNzIixxdWFudGlsZXMgPSBjKDAuNSksY29sb3I9IlJFRCIsYWxwaGE9MC44LHNpemU9MSxuYS5ybSA9IFRSVUUsbGFtYmRhID0gNSkrDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3I9IiMyNzZCQjAiLHNpemU9MTQsZmFjZT0iYm9sZC5pdGFsaWMiLGhqdXN0ID0gMC41KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzM0MzQzNCIsc2l6ZT0xMSxmYWNlPSJib2xkIiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjM0E0RDVDIiksDQogICAgcGxvdC5jYXB0aW9uLnBvc2l0aW9uID0gInBsb3QiLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHg9IkFsdGl0dWRlIChrbSkiLHk9IlByZXNzdXJlIChtYmFyKSIsdGl0bGUgPSJHcmFwaCBvZiBQcmVzc3VyZSB2cyBBbHRpdHVkZSIsDQogICAgICAgY2FwdGlvbiA9IlNlcmVuZGliIDEuMCBSYWRpb3NvbmRlIGRhdGEgwqkgU0VEUyBTcmkgTGFua2EiKSsNCiAgc2NhbGVfY29sb3VyX2h1ZShuYW1lID0gIkRhdGEgRnJvbVxuUmFkaW9zb25kIixsYWJlbHM9YygiRGVzY2VuZCIsICJBc2NlbmQiKSkrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxMS41LCB5ID0gOTUwLCBsYWJlbCA9ICJSZWQgbGluZSAtIEdyYXBoIGFjY29yZGluZyB0byBkYXRhc2V0IiwgaGp1c3QgPSAwLHNpemU9My41LGNvbG9yPSIjNUY2MDYyIikrDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAxMS41LCB5ID0gODgwLCBsYWJlbCA9ICJCbHVlIGxpbmUgLSBHcmFwaCBhY2NvcmRpbmcgdG8gSVNBIGVxdWF0aW9ucyIsIGhqdXN0ID0gMCxzaXplPTMuNSxjb2xvcj0iIzVGNjA2MiIpDQoNCg0KI0dyYXBoIGJ5IElTQSBFcXVhdGlvbnMNClAwPTEwMTMyNQ0KUj0gOC4zMTQzMg0KZz0gOS44MDY2NQ0KTT0wLjAyODk2NDQNCkx0cm9wPSAtMC4wMDY1DQpMc3RyYXQ9IDAuMDAxDQpUMD0yNzMuMTUrMTUNCnhwdHMgPC0gc2VxKDAsMTEsYnk9MC4wMDEpDQpmcDEgPC0gZnVuY3Rpb24oeHB0cykgKFAwKigxK0x0cm9wKnhwdHMqMTAwMC9UMCleKC1nKk0vUi9MdHJvcCkpLzEwMA0KcGRhdCA8LSBkYXRhLmZyYW1lKHg9eHB0cyx5PShQMCooMStMdHJvcCp4cHRzKjEwMDAvVDApXigtZypNL1IvTHRyb3ApKS8xMDApDQpwbG90X1BfdnNfQTwtcGxvdF9QX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZnAxLCBjb2xvdXI9IiMzMzY2RkYiLHhsaW0gPSBjKDAsMTEpLHNpemU9MSkNCnhwdHAgPC0gc2VxKDExLjAwMSwyMCxieT0wLjAwMSkNCmZwMiA8LSBmdW5jdGlvbih4cHRwKSAoMjI2MzMqZXhwKC1nKk0qKHhwdHAtMTEpKjEwMDAvMjE2LjY1L1IpKS8xMDANCnBkYXQgPC0gcmJpbmQocGRhdCxkYXRhLmZyYW1lKHg9eHB0cCx5PSgyMjYzMypleHAoLWcqTSooeHB0cC0xMSkqMTAwMC8yMTYuNjUvUikpLzEwMCkpDQpwbG90X1BfdnNfQTwtcGxvdF9QX3ZzX0Erc3RhdF9mdW5jdGlvbihmdW49ZnAyLCBjb2xvdXI9IiMzMzY2RkYiLHhsaW0gPSBjKDExLDIwKSxzaXplPTEpDQp4cHNwIDwtIHNlcSgyMC4wMDEsMzAsYnk9MC4wMDEpDQpmcDMgPC0gZnVuY3Rpb24oeHBzcCkgKDU0NzUuMiooKDIxNi42NStMc3RyYXQqeHBzcCoxMDAwKS8oMjE2LjY1KzIwMDAwKkxzdHJhdCkpKS8xMDANCnBkYXQgPC0gcmJpbmQocGRhdCxkYXRhLmZyYW1lKHg9eHBzcCx5PSg1NDc1LjIqKCgyMTYuNjUrTHN0cmF0Knhwc3AqMTAwMCkvKDIxNi42NSsyMDAwMCpMc3RyYXQpKSkvMTAwKSkNCnBsb3RfUF92c19BPC1wbG90X1BfdnNfQStzdGF0X2Z1bmN0aW9uKGZ1bj1mcDMsIGNvbG91cj0iIzMzNjZGRiIseGxpbSA9IGMoMjAsMzApLHNpemU9MSkNCnBsb3RfUF92c19BDQoNCmBgYA0KDQpUaGUgKipodW1pZGl0eSoqIGRhdGEgY29sbGVjdGVkIGNhbiBiZSBwbG90dGVkIGFzIHNob3duIGJlbG93Lg0KYGBge3J9DQpwbG90X0hfdnNfQSA9IGdncGxvdChkYXRhID0gZGYsYWVzKHg9QWx0aXR1ZGUseT1IdW1pZGl0eSkpKw0KICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxhZXMoY29sb3I9ZmFjdG9yKFRpbWU8MS40MjAwODUpKSxhbHBoYT0wLjMpKw0KICBnZW9tX3F1YW50aWxlKG1ldGhvZCA9ICJycXNzIixxdWFudGlsZXMgPSBjKDAuNSksY29sb3I9IiM2NjM0OTQiLGFscGhhPTAuOCxzaXplPTEsbmEucm0gPSBUUlVFLGxhbWJkYSA9IDUpKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMjc2QkIwIixzaXplPTE0LGZhY2U9ImJvbGQuaXRhbGljIixoanVzdCA9IDAuNSksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yPSIjMzQzNDM0IixzaXplPTExLGZhY2U9ImJvbGQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoY29sb3I9IiMzNDM0MzQiLHNpemU9MTEsZmFjZT0iYm9sZCIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvcj0iIzNBNEQ1QyIpLA0KICAgIHBsb3QuY2FwdGlvbi5wb3NpdGlvbiA9ICJwbG90IiwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSsNCiAgbGFicyh4PSJBbHRpdHVkZSAoa20pIix5PSJIdW1pZGl0eSAoJSkiLHRpdGxlID0iR3JhcGggb2YgSHVtaWRpdHkgdnMgQWx0aXR1ZGUiLA0KICAgICAgIGNhcHRpb24gPSJTZXJlbmRpYiAxLjAgUmFkaW9zb25kZSBkYXRhIMKpIFNFRFMgU3JpIExhbmthIikrDQogIHNjYWxlX2NvbG91cl9odWUobmFtZSA9ICJEYXRhIEZyb21cblJhZGlvc29uZCIsbGFiZWxzPWMoIkRlc2NlbmQiLCAiQXNjZW5kIikpDQpwbG90X0hfdnNfQQ0KYGBgDQoNCiMjIyBEaXNjdXNzaW9uDQoNClRoZSBPdmVyYWxsIGxhdW5jaCB3YXMgc3VjY2Vzc2Z1bCBldmVuIHRob3VnaCBzb21lIG9mIHRoZSByZXN1bHRzIG9idGFpbmVkIHZhcmllZCBmcm9tIHRoZSBleHBlY3RlZCByZXN1bHRzIHByZWRpY3RlZCBiZWZvcmUgbGF1bmNoLg0KDQpUaGUgc2xpZ2h0IHZhcmlhdGlvbiBvZiB0aGUgYWN0dWFsIGFzY2VuZCByYXRlIHdoZW4gY29tcGFyZWQgd2l0aCB0aGUgcHJlZGljdGVkIGFzY2VuZCByYXRlIG1heSBoYXZlIGJlZW4gZHVlIHRvIHZhcmlhdGlvbiBvZiB3aW5kIGRpcmVjdGlvbnMgYW5kIHNwZWVkcyBhZnRlciB0aGUgbGF1bmNoLiBJdCBtYXkgaGF2ZSBhbHNvIHZhcmllZCBzbGlnaHRseSBkdWUgdG8gdGhlIGFtb3VudCBvZiBnYXMgZmlsbGVkIGluc2lkZSB0aGUgYmFsbG9vbiB2YXJ5aW5nIHNsaWdodGx5IHRoYW4gdGhlIGNhbGN1bGF0ZWQgdmFsdWUgaW4gc2ltdWxhdGlvbnMuDQoNClRoZSBsYXJnZSB2YXJpYXRpb24gaW4gdGhlIGRlc2NlbnQgcmF0ZSBtYXkgaGF2ZSBiZWVuIGEgcmVzdWx0IG9mIHRoZSBibGFzdGVkIGJhbGxvb24gZmFsbGluZyBvbiB0b3Agb2YgdGhlIHBhcmFjaHV0ZSBhbmQgdGhlIHBhcmFjaHV0ZSBub3QgZGVwbG95aW5nIHRoZSBjb3JyZWN0IHdheSB3aGljaCBtYXkgaGF2ZSBjYXVzZWQgYW4gaW5jcmVhc2Ugb2Ygc3BlZWQgaW4gdGhlIHBheWxvYWQuIFRoZSBwYXJhY2h1dGUgbWF5IGFsc28gaGF2ZSBiZWVuIHByZSB0YW5nbGVkIHByaW9yIHRvIGRlcGxveWluZyBkdWUgdG8gaGlnaCB3aW5kcyB3aGljaCBtYXkgaGF2ZSByZXN1bHRlZCBpbiBpbmNvcnJlY3QgZGVwbG95bWVudCBvZiB0aGUgcGFyYWNodXRlLg0KQm90aCByaXNlIGFuZCBmYWxsIHNob3cgbGluZWFyIGdyYXBocyB0aGVyZWZvcmUgYm90aCBhc2NlbmQgYW5kIGRlc2NlbmQgcmF0ZXMgd2VyZSBjb25zdGFudCB0aHJvdWdob3V0IHRoZSBqb3VybmV5Lg0KDQpUaGUgaGlnaGVzdCBhbHRpdHVkZSBhY2hpZXZlZCB3YXMgbmVhcmx5IGVxdWFsIHRvIHRoZSBwcmUgY2FsY3VsYXRlZCBoaWdoZXN0IGFsdGl0dWRlIGFuZCB0aGVyZWZvcmUgdGhlIGFtb3VudCBvZiBnYXMgZmlsbGVkIHRvIHRoZSBiYWxsb29uIGhhcyBiZWVuIGFsbW9zdCBleGFjdGx5IHRoZSBwcmUgY2FsY3VsYXRlZCBhbW91bnQgYW5kIHRoZSBzbGlnaHQgdmFyaWF0aW9uIG1heSBoYXZlIGJlZW4gZHVlIHRvIHRoZSBkZXcgZm9ybWF0aW9uIG9uIHRoZSBiYWxsb29uIHByaW9yIHRvIGxhdW5jaC4NCg0KVGhlIHRlbXBlcmF0dXJlIHZhcmlhdGlvbnMgaGF2ZSBiZWVuIGFsbW9zdCB0aGUgc2FtZSBpbiBib3RoIGFzY2VuZCBhbmQgZGVzY2VudCBhbmQgaGF2ZSByZWFjaGVkIGEgbWluaW11bSBhdCB0aGUgc2FtZSBhbHRpdHVkZSBib3RoIHdoZW4gcmlzaW5nIGFuZCBmYWxsaW5nLiBUaGUgcmlzZSBpbiB0ZW1wZXJhdHVyZSBhZnRlciBhIGNlcnRhaW4gYWx0aXR1ZGUgaXMgZHVlIHRvIHRoZSBPem9uZSBsYXllciBleGlzdGluZyBpbiB0aGF0IGFsdGl0dWRlLg0KDQpQcmVzc3VyZSB2YXJpYXRpb24gaXMgYWxzbyBzZWVuIHRvIG92ZXJsYXAgaW4gYXNjZW50IGFzIHdlbGwgYW5kIGluIGRlc2NlbnQuIEZldyBzdWRkZW4gdmFyaWF0aW9ucyBpbiBodW1pZGl0eSBjYW4gYmUgc2VlbiBkdWUgdG8gdGhlIGF0bW9zcGhlcmljIGNvbmRpdGlvbnMgb24gdGhhdCBkYXkgb2YgdGhlIGxhdW5jaC4NCg0KKioqKioqDQo8Y2VudGVyPjxmb250IHNpemU9IjEiIGFsaWduPSJjZW50ZXIiPipBIHByb2plY3QgYnkgU0VEUyBTcmkgTGFua2EqDQoNCipQcm9qZWN0IE1hbmFnZXJzKg0KDQoqQW1pbGEgU2FuZHVuIEJhc25heWFrYcK3VGhpbGFuIEhhcnNoYW5hwrdUaGFzaG1pbGEgQXJhbGl5YcK3QmhhbnVrYSBSYW5hd2VlcmHCt1RoaWxhbmdpIEthc3RodXJpYXJhY2hjaGkqDQoNCipPcmdhbml6aW5nIENvbW1pdHRlZSoNCg0KKkRhc3VuaSBIZXdhd2FzYW3Ct1RoYXJpa2EgRGlzaGFuacK3U2hhcmFkaGEgU2FtYXJha29vbsK3U3VwZXNoaSBXZWRhZ2VkYXJhwrdBc2VrYSBXYXJuYXNvb3JpeWHCt0JoYXRoaXlhIFNlbmV2aXJhdGhuYcK3TWF0aGVlc2hhIFNlbmFuYXlha2HCt01pY2hlbGxlIEZlcm5hbmRvwrdTdWJob2RhIFJhdGhuYXlha2HCt0FqYW4gRXNod2FyYSoNCg0KKlRlY2huaWNhbCBUZWFtKg0KDQoqTWFkaHVzaGFuIFN1YmFzaMK3TWFuZWVzaCBZYXRpd2FsYcK3WWFzaWthIEd1bmF0aGlsYWthwrdVc2hhbiBTYWt1bnRoYcK3Q2hhcml0aGEgV2VlcmFzb29yaXlhwrdUaGFyaW5kdSBLYXZpbmRhwrdWYW5vZHlhIFdhcm5hc29vcml5YcK3QW51cGEgS3VsYXRodW5nYSoNCg0KKkZpbmFuY2lhbCBhbmQgTWFya2V0aW5nIFRlYW0qDQoNCipSYXNoYW5lIFBpbnRvZcK3UHVkYnVkaWthIFdpY2tyYW1hc2luZ2hlwrdSYXZpbmR1IEJhbGFzb29yaXlhwrdSYXZlZXNoYSBJbGxlc2luZ2hlwrdUaGFydW5pIFByaXlhbmdpa2HCt01hbHNoYSBSYWphcGFrc2hhKjwvZm9udD48L2NlbnRlcj4NCg0KLS0tLS0tDQoNCioqKioqKg0KPGNlbnRlcj48Zm9udCBzaXplPSIxIiBhbGlnbj0iY2VudGVyIj4qRGV2ZWxvcGVkIGJ5IEFudXBhIEt1bGF0aHVuZ2EqDQoNCipDb3B5cmlnaHQgwqkgMjAyMSBTRURTIFNyaSBMYW5rYS4gQWxsIHJpZ2h0cyByZXNlcnZlZCo8L2ZvbnQ+PC9jZW50ZXI+DQoNCi0tLS0tLQ0KDQoNCg0K