Description

On 2020-11-12 BBL and I looked over the experiment 1 results but have some concerns about the treatments. Here we let’s look at different harvest event set ups

  • the original treatment only harvest the storage C
  • uniform harvest acccross all four C pools
  • apply harvest to the storage C and read in 0s for all three C pools

Set Up

Results Discussed on 2020-11-16

AGB

The above ground biomass from the xml files I used in experiment 1 a few weeks a go. Our big concern was that the different treatment groups all decreased in biomass by baout 90%

object$ABG[grepl('original|baseline', scn), ] %>% 
  .[, value := sum(value), by = list(datetime, variable, description, unit, scn)] %>% 
  .[, list(datetime, value, scn, variable, unit)] %>%  
  ggplot() + 
  geom_line(aes(datetime, value, color = scn)) + 
  THEME + 
  labs(title = 'ABG for the Harvest XML files used for 2020-11-11 results', y = "kgC/m2")


Now let’s apply the harvests uniformly to all of the tree carbon storage pools (above ground biomass, below ground biomass, folliage, and storage)

object$ABG[grepl('uniform', scn), ] %>% 
  .[, value := sum(value), by = list(datetime, variable, description, unit, scn)] %>% 
  .[, list(datetime, value, scn, variable, unit)] %>%  
  ggplot() + 
  geom_line(aes(datetime, value, color = scn)) + 
  THEME + 
  labs(title = 'ABG for the Uniform Harvest', y = "kgC/m2")

This is more along the lines of what we would expect to see!


Now let us apply the harvest to only the storage C pool.

data <- object$ABG
data <- cbind(data, 'year' = year(data$datetime))
data[grepl(pattern = 'other|baseline', x = scn), ] %>% 
  .[, value := sum(value), by = list(datetime, variable, description, unit, scn, year)] %>% 
  .[, list(datetime, value, scn, variable, unit, year)] %>%  
  unique %>% 
  .[year %in% 2019:2022, ] %>% 
  ggplot() + 
  geom_line(aes(datetime, value, color = scn)) + 
  THEME + 
  labs(title = 'ABG C Storage Harvest Treatment Only', y = "kgC/m2")

While yes the pattern is along the lines of what we would expect but the differences are pretty small, which begs the question is the difference meandingful or trivial?

cbind(object$ABG, year = date(object$ABG$datetime)) %>% 
  .[grepl(pattern = 'other|baseline', x = scn), ] %>% 
  .[, list(datetime, value, scn, variable, unit, year)] %>%  
  .[, value := sum(value), by = list(datetime, variable, unit, scn, year)] %>% 
  unique %>% 
  .[year %in% 2019:2022, ] %>% 
  dcast(year + datetime + variable + unit ~ scn, value.war = 'value') %>% 
  melt(id.vars = c("year", "datetime", "variable","unit","baseline"), variable.name = 'treatment') %>% 
  .[ , diff := baseline - value] %>%  
    ggplot() + 
  geom_line(aes(datetime, value, color = treatment)) + 
  THEME + 
  labs(title = 'Difference in ABG C Storage Harvest Treatment Only', y = "Baseline - Treatment (kgC/m2)")

Or perhaps AGB is not the right variable to look at, since we are not havesting the AGB it is not surprising that the treatments have a minimal impact on this output variable.

NPP

Start by checking out the annual values.

object$NPP %>% 
  .[grepl(pattern = 'other|baseline', x = scn), ] %>% 
  .[ , scn := gsub(pattern = ' other 0 ', replacement = '', x = scn)] %>% 
  .[ , treat := 'C only'] -> 
  annual_NPP_other
  
object$NPP %>% 
  .[grepl(pattern = 'uniform|baseline', x = scn), ] %>% 
  .[ , scn := gsub(pattern = ' uniform', replacement = '', x = scn)] %>% 
  .[ , treat := 'uniform'] -> 
  annual_NPP_uniform
rbind(annual_NPP_other, annual_NPP_uniform) %>%  
  .[, value := sum(value), by = list(year, scn, year, description, unit, treat)] %>%
  unique %>% 
  ggplot(aes(year, value, color = scn)) + 
  geom_line() + 
  THEME + 
  facet_wrap('treat')

Import & format the uniform disturbance treatments.

h0 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_0_uniform.rds'))
h45 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_45_uniform.rds'))
h65 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_65_uniform.rds'))
h85 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_85_uniform.rds'))
h0 <- as.data.table(h0$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h45 <- as.data.table(h45$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h65 <- as.data.table(h65$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h85 <- as.data.table(h85$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h0$scn  <- 'baseline'
h45$scn <- 'harvest_45'
h65$scn <- 'harvest_65'
h85$scn <- 'harvest_85'
h0$treat <- 'Uniform Harvest'
h45$treat <- 'Uniform Harvest'
h65$treat <- 'Uniform Harvest'
h85$treat <- 'Uniform Harvest'
NPP <- rbind(h0, h45, h65, h85)
# Convert the NPP units from per plant to unit area
NPP$value <- NPP$MMEAN_NPP_CO * NPP$NPLANT
NPP <- NPP[, c("datetime", "PFT", "scn", "value", "treat")]
NPP$year <- lubridate::year(NPP$datetime)
NPP$datetime <- date(NPP$datetime)
NPP_uniform <- NPP 

Import & format the storage specific treatments

h45 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_45_other0.rds'))
h65 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_65_other0.rds'))
h85 <- readRDS(file.path(ED_OUTPUT_DIR, 'disturbence-treatments', 'harvest_85_other0.rds'))
h45 <- as.data.table(h45$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h65 <- as.data.table(h65$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h85 <- as.data.table(h85$df_cohort[[1]])[  ,list(datetime, MMEAN_NPP_CO, PFT, DBH, NPLANT)]
h0$scn <- 'baseline'
h45$scn <- 'harvest_45'
h65$scn <- 'harvest_65'
h85$scn <- 'harvest_85'
h0$treat <- 'C Storage Harvest'
h45$treat <- 'C Storage Harvest'
h65$treat <- 'C Storage Harvest'
h85$treat <- 'C Storage Harvest'
NPP <- rbind(h0, h45, h65, h85)
# Convert the NPP units from per plant to unit area
NPP$value <- NPP$MMEAN_NPP_CO * NPP$NPLANT
NPP <- NPP[, c("datetime", "PFT", "scn", "value", "treat")]
NPP$year <- lubridate::year(NPP$datetime)
NPP$datetime <- date(NPP$datetime)
NPP_other0 <- NPP 
rbind(NPP_uniform, NPP_other0) %>% 
  .[year %in% 2019:2022] %>% 
  .[, value := sum(value), by = list(datetime, scn, year, treat)] %>%
  unique -> 
  NPP_to_plot 
NPP_to_plot %>%  
  ggplot(aes(datetime, value, color = scn)) + 
  geom_line() +
  facet_wrap('treat') + 
  THEME + 
  labs(y = 'NPP kgC/m2/yr per month')

NPP_to_plot %>%  
  ggplot(aes(datetime, value, color = treat, linetype = treat)) + 
  geom_line() +
  facet_wrap('scn') + 
  THEME + 
  labs(y = 'NPP kgC/m2/yr per month')

Conclusion

  • Turns out that reading the version of ED’s fortran code that if a carbon disturbance is not specific then ED assigns the disturbance of 1 (complete disturbance) which is explains the large decline in AGB we saw in the results from last week.
  • Now we have runs that are more realistic where we apply the same disturbance treatment to all of the different plant carbon pools and runs that only apply the disturbance to the C storage as per Jackie’s suggestion. However the difference in AGB and carbon fluexes (implied by NPP) are smaller between the C storage treatments than I was expecting. It is unclear if this is a problem or not. Looking at the Pest ED paper applything phlome disturbances of varying degrees had a substantial impact on carbon fluxes (NEE) which is what makes the ED results seem a tad suspect

Ideas for next steps

  • BBL which one seems better/more realistic? My concern is that the C only disturbances are too small but perhaps that is realistic.
  • Run the complete runs with the two different harvests, does it matter how mature the forest is?
  • Followup with Jackie and Alexey about the results

January Disturbance

So it looks like starting in before the growing season does not have the intended impact.

Above Ground Biomass Disturbance

object$ABG[grepl('above', scn), ] %>% 
  .[, value := sum(value), by = list(datetime, variable, description, unit, scn)] %>% 
  .[, list(datetime, value, scn, variable, unit)] %>%  
  ggplot() + 
  geom_line(aes(datetime, value, color = scn, linetype = scn)) + 
  THEME + 
  labs(title = 'ABG Above Ground Biomass', y = "kgC/m2")


sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ed4forte_0.0.0.9000 tidyselect_1.1.0    purrr_0.3.4         cowplot_1.0.0       magrittr_1.5       
 [6] ggplot2_3.3.2       assertthat_0.2.1    lubridate_1.7.8     data.table_1.12.8   tibble_3.0.1       
[11] drake_7.9.0        

loaded via a namespace (and not attached):
 [1] storr_1.2.1      xfun_0.14        reshape2_1.4.3   lattice_0.20-41  testthat_2.3.2   colorspace_1.4-1
 [7] vctrs_0.3.1      generics_0.0.2   htmltools_0.5.0  yaml_2.2.1       base64enc_0.1-3  utf8_1.1.4      
[13] rlang_0.4.6      pillar_1.4.4     txtq_0.2.0       glue_1.4.1       withr_2.2.0      sp_1.4-4        
[19] plyr_1.8.6       lifecycle_0.2.0  stringr_1.4.0    munsell_0.5.0    gtable_0.3.0     evaluate_0.14   
[25] labeling_0.3     knitr_1.28       parallel_3.6.3   fansi_0.4.1      Rcpp_1.0.5       readr_1.3.1     
[31] scales_1.1.1     backports_1.1.8  filelock_1.0.2   desc_1.2.0       pkgload_1.1.0    jsonlite_1.6.1  
[37] farver_2.0.3     hms_0.5.3        digest_0.6.25    stringi_1.4.6    dplyr_1.0.0      grid_3.6.3      
[43] rprojroot_1.3-2  here_0.1         rgdal_1.4-8      cli_2.0.2        tools_3.6.3      base64url_1.4   
[49] tidyr_1.1.0      crayon_1.3.4     pkgconfig_2.0.3  ellipsis_0.3.1   rmarkdown_2.3.1  rstudioapi_0.11 
[55] R6_2.4.1         igraph_1.2.4.2   compiler_3.6.3  
LS0tCnRpdGxlOiAiRGlzdHVyYmFuY2UgVHJlYXRtZW50cyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoKIyBEZXNjcmlwdGlvbiAKCk9uIDIwMjAtMTEtMTIgQkJMIGFuZCBJIGxvb2tlZCBvdmVyIHRoZSBleHBlcmltZW50IDEgcmVzdWx0cyBidXQgaGF2ZSBzb21lIGNvbmNlcm5zIGFib3V0IHRoZSB0cmVhdG1lbnRzLiBIZXJlIHdlIGxldCdzIGxvb2sgYXQgZGlmZmVyZW50IGhhcnZlc3QgZXZlbnQgc2V0IHVwcyAKCiogdGhlIG9yaWdpbmFsIHRyZWF0bWVudCBvbmx5IGhhcnZlc3QgdGhlIHN0b3JhZ2UgQyAKKiB1bmlmb3JtIGhhcnZlc3QgYWNjY3Jvc3MgYWxsIGZvdXIgQyBwb29scyAKKiBhcHBseSBoYXJ2ZXN0IHRvIHRoZSBzdG9yYWdlIEMgYW5kIHJlYWQgaW4gMHMgZm9yIGFsbCB0aHJlZSBDIHBvb2xzCgoKIyMjIFNldCBVcCAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFRoZSBkZWZhdWx0cyBmb3IgdGhlIGNodW5rcwprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy53aWR0aCA9IDUsIGZpZy5oZWlnaHQgPSAzKQoKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocHVycnIpCgpCQVNFX0RJUiA8LSBoZXJlOjpoZXJlKCkKVEhFTUUgICAgPC0gdGhlbWVfYncoYmFzZV9zaXplID0gMTUpCkVEX09VVFBVVF9ESVIgPC0gZmlsZS5wYXRoKEJBU0VfRElSLCAiRUQtb3V0cHV0cyIpCgojIFJlYWQgaW4gdGhlIGRhdGEgb2JqZWN0IApvYmplY3QgPC0gcmVhZFJEUyhmaWxlLnBhdGgoQkFTRV9ESVIsICJFRC1vdXRwdXRzIiwgImRpc3R1cmJhbmNlLXRyZWF0bWVudHMucmRzIikpCm1hcChvYmplY3QsIGZ1bmN0aW9uKHgpewogIAogICB4JHNjbiA8LSBpZmVsc2UoeCRzY24gPT0gImhhcnZlc3QgMCB1bmlmb3JtIiwgJ2Jhc2VsaW5lJywgeCRzY24pCiAgIHggPC0geFtzY24gJWluJSBjKCJiYXNlbGluZSIsICJoYXJ2ZXN0IDQ1IG9yaWdpbmFsIiwgImhhcnZlc3QgNDUgb3RoZXIgMCAiLCAiaGFydmVzdCA0NSB1bmlmb3JtIiwgCiAgICAgICAgICAgICAgICAiaGFydmVzdCA2NSBvcmlnaW5hbCIsICJoYXJ2ZXN0IDY1IG90aGVyIDAgIiwgImhhcnZlc3QgNjUgdW5pZm9ybSIsCiAgICAgICAgICAgICAgICAiaGFydmVzdCA4NSBvcmlnaW5hbCIsICJoYXJ2ZXN0IDg1IG90aGVyIDAgIiwgImhhcnZlc3QgODUgdW5pZm9ybSIsCiAgICAgICAgICAgICAgICAiaGFydmVzdCAwIGphbiIsICJoYXJ2ZXN0IDQ1IGphbiIsICJoYXJ2ZXN0IDY1IGphbiIsICJoYXJ2ZXN0IDg1IGphbiIsIAogICAgICAgICAgICAgICAgImhhcnZlc3QgMCBhYm92ZSIsICJoYXJ2ZXN0IDQ1IGFib3ZlIiwgImhhcnZlc3QgNjUgYWJvdmUiLCAiaGFydmVzdCA4NSBhYm92ZSIpLCBdCiAgIHgKfSkgLT4gCiAgb2JqZWN0CmBgYAoKIyBSZXN1bHRzIERpc2N1c3NlZCBvbiAyMDIwLTExLTE2CgojIyBBR0IKClRoZSBhYm92ZSBncm91bmQgYmlvbWFzcyBmcm9tIHRoZSB4bWwgZmlsZXMgSSB1c2VkIGluIGV4cGVyaW1lbnQgMSBhIGZldyB3ZWVrcyBhIGdvLiBPdXIgYmlnIGNvbmNlcm4gd2FzIHRoYXQgdGhlIGRpZmZlcmVudCB0cmVhdG1lbnQgZ3JvdXBzIGFsbCBkZWNyZWFzZWQgaW4gYmlvbWFzcyBieSBiYW91dCA5MCUgCgpgYGB7cn0Kb2JqZWN0JEFCR1tncmVwbCgnb3JpZ2luYWx8YmFzZWxpbmUnLCBzY24pLCBdICU+JSAKICAuWywgdmFsdWUgOj0gc3VtKHZhbHVlKSwgYnkgPSBsaXN0KGRhdGV0aW1lLCB2YXJpYWJsZSwgZGVzY3JpcHRpb24sIHVuaXQsIHNjbildICU+JSAKICAuWywgbGlzdChkYXRldGltZSwgdmFsdWUsIHNjbiwgdmFyaWFibGUsIHVuaXQpXSAlPiUgIAogIGdncGxvdCgpICsgCiAgZ2VvbV9saW5lKGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gc2NuKSkgKyAKICBUSEVNRSArIAogIGxhYnModGl0bGUgPSAnQUJHIGZvciB0aGUgSGFydmVzdCBYTUwgZmlsZXMgdXNlZCBmb3IgMjAyMC0xMS0xMSByZXN1bHRzJywgeSA9ICJrZ0MvbTIiKQpgYGAKCgo8YnI+CgpOb3cgbGV0J3MgYXBwbHkgdGhlIGhhcnZlc3RzIHVuaWZvcm1seSB0byBhbGwgb2YgdGhlIHRyZWUgY2FyYm9uIHN0b3JhZ2UgcG9vbHMgKGFib3ZlIGdyb3VuZCBiaW9tYXNzLCBiZWxvdyBncm91bmQgYmlvbWFzcywgZm9sbGlhZ2UsIGFuZCBzdG9yYWdlKQoKYGBge3J9Cm9iamVjdCRBQkdbZ3JlcGwoJ3VuaWZvcm0nLCBzY24pLCBdICU+JSAKICAuWywgdmFsdWUgOj0gc3VtKHZhbHVlKSwgYnkgPSBsaXN0KGRhdGV0aW1lLCB2YXJpYWJsZSwgZGVzY3JpcHRpb24sIHVuaXQsIHNjbildICU+JSAKICAuWywgbGlzdChkYXRldGltZSwgdmFsdWUsIHNjbiwgdmFyaWFibGUsIHVuaXQpXSAlPiUgIAogIGdncGxvdCgpICsgCiAgZ2VvbV9saW5lKGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gc2NuKSkgKyAKICBUSEVNRSArIAogIGxhYnModGl0bGUgPSAnQUJHIGZvciB0aGUgVW5pZm9ybSBIYXJ2ZXN0JywgeSA9ICJrZ0MvbTIiKQpgYGAKCgpUaGlzIGlzIG1vcmUgYWxvbmcgdGhlIGxpbmVzIG9mIHdoYXQgd2Ugd291bGQgZXhwZWN0IHRvIHNlZSEgCgo8YnI+CgpOb3cgbGV0IHVzIGFwcGx5IHRoZSBoYXJ2ZXN0IHRvIG9ubHkgdGhlIHN0b3JhZ2UgQyBwb29sLgoKCmBgYHtyfQpkYXRhIDwtIG9iamVjdCRBQkcKZGF0YSA8LSBjYmluZChkYXRhLCAneWVhcicgPSB5ZWFyKGRhdGEkZGF0ZXRpbWUpKQoKZGF0YVtncmVwbChwYXR0ZXJuID0gJ290aGVyfGJhc2VsaW5lJywgeCA9IHNjbiksIF0gJT4lIAogIC5bLCB2YWx1ZSA6PSBzdW0odmFsdWUpLCBieSA9IGxpc3QoZGF0ZXRpbWUsIHZhcmlhYmxlLCBkZXNjcmlwdGlvbiwgdW5pdCwgc2NuLCB5ZWFyKV0gJT4lIAogIC5bLCBsaXN0KGRhdGV0aW1lLCB2YWx1ZSwgc2NuLCB2YXJpYWJsZSwgdW5pdCwgeWVhcildICU+JSAgCiAgdW5pcXVlICU+JSAKICAuW3llYXIgJWluJSAyMDE5OjIwMjIsIF0gJT4lIAogIGdncGxvdCgpICsgCiAgZ2VvbV9saW5lKGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gc2NuKSkgKyAKICBUSEVNRSArIAogIGxhYnModGl0bGUgPSAnQUJHIEMgU3RvcmFnZSBIYXJ2ZXN0IFRyZWF0bWVudCBPbmx5JywgeSA9ICJrZ0MvbTIiKQpgYGAKCldoaWxlIHllcyB0aGUgcGF0dGVybiBpcyBhbG9uZyB0aGUgbGluZXMgb2Ygd2hhdCB3ZSB3b3VsZCBleHBlY3QgYnV0IHRoZSBkaWZmZXJlbmNlcyBhcmUgcHJldHR5IHNtYWxsLCB3aGljaCBiZWdzIHRoZSAgcXVlc3Rpb24gaXMgdGhlIGRpZmZlcmVuY2UgbWVhbmRpbmdmdWwgb3IgdHJpdmlhbD8gCgoKYGBge3J9CmNiaW5kKG9iamVjdCRBQkcsIHllYXIgPSBkYXRlKG9iamVjdCRBQkckZGF0ZXRpbWUpKSAlPiUgCiAgLltncmVwbChwYXR0ZXJuID0gJ290aGVyfGJhc2VsaW5lJywgeCA9IHNjbiksIF0gJT4lIAogIC5bLCBsaXN0KGRhdGV0aW1lLCB2YWx1ZSwgc2NuLCB2YXJpYWJsZSwgdW5pdCwgeWVhcildICU+JSAgCiAgLlssIHZhbHVlIDo9IHN1bSh2YWx1ZSksIGJ5ID0gbGlzdChkYXRldGltZSwgdmFyaWFibGUsIHVuaXQsIHNjbiwgeWVhcildICU+JSAKICB1bmlxdWUgJT4lIAogIC5beWVhciAlaW4lIDIwMTk6MjAyMiwgXSAlPiUgCiAgZGNhc3QoeWVhciArIGRhdGV0aW1lICsgdmFyaWFibGUgKyB1bml0IH4gc2NuLCB2YWx1ZS53YXIgPSAndmFsdWUnKSAlPiUgCiAgbWVsdChpZC52YXJzID0gYygieWVhciIsICJkYXRldGltZSIsICJ2YXJpYWJsZSIsInVuaXQiLCJiYXNlbGluZSIpLCB2YXJpYWJsZS5uYW1lID0gJ3RyZWF0bWVudCcpICU+JSAKICAuWyAsIGRpZmYgOj0gYmFzZWxpbmUgLSB2YWx1ZV0gJT4lICAKICAgIGdncGxvdCgpICsgCiAgZ2VvbV9saW5lKGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gdHJlYXRtZW50KSkgKyAKICBUSEVNRSArIAogIGxhYnModGl0bGUgPSAnRGlmZmVyZW5jZSBpbiBBQkcgQyBTdG9yYWdlIEhhcnZlc3QgVHJlYXRtZW50IE9ubHknLCB5ID0gIkJhc2VsaW5lIC0gVHJlYXRtZW50IChrZ0MvbTIpIikKYGBgCgpPciBwZXJoYXBzIEFHQiBpcyBub3QgdGhlIHJpZ2h0IHZhcmlhYmxlIHRvIGxvb2sgYXQsIHNpbmNlIHdlIGFyZSBub3QgaGF2ZXN0aW5nIHRoZSBBR0IgaXQgaXMgbm90IHN1cnByaXNpbmcgdGhhdCB0aGUgdHJlYXRtZW50cyBoYXZlIGEgbWluaW1hbCBpbXBhY3Qgb24gdGhpcyBvdXRwdXQgdmFyaWFibGUuIAoKCgojIyBOUFAgCgoKU3RhcnQgYnkgY2hlY2tpbmcgb3V0IHRoZSBhbm51YWwgdmFsdWVzLiAKCmBgYHtyfQoKCm9iamVjdCROUFAgJT4lIAogIC5bZ3JlcGwocGF0dGVybiA9ICdvdGhlcnxiYXNlbGluZScsIHggPSBzY24pLCBdICU+JSAKICAuWyAsIHNjbiA6PSBnc3ViKHBhdHRlcm4gPSAnIG90aGVyIDAgJywgcmVwbGFjZW1lbnQgPSAnJywgeCA9IHNjbildICU+JSAKICAuWyAsIHRyZWF0IDo9ICdDIG9ubHknXSAtPiAKICBhbm51YWxfTlBQX290aGVyCiAgCm9iamVjdCROUFAgJT4lIAogIC5bZ3JlcGwocGF0dGVybiA9ICd1bmlmb3JtfGJhc2VsaW5lJywgeCA9IHNjbiksIF0gJT4lIAogIC5bICwgc2NuIDo9IGdzdWIocGF0dGVybiA9ICcgdW5pZm9ybScsIHJlcGxhY2VtZW50ID0gJycsIHggPSBzY24pXSAlPiUgCiAgLlsgLCB0cmVhdCA6PSAndW5pZm9ybSddIC0+IAogIGFubnVhbF9OUFBfdW5pZm9ybQoKCnJiaW5kKGFubnVhbF9OUFBfb3RoZXIsIGFubnVhbF9OUFBfdW5pZm9ybSkgJT4lICAKICAuWywgdmFsdWUgOj0gc3VtKHZhbHVlKSwgYnkgPSBsaXN0KHllYXIsIHNjbiwgeWVhciwgZGVzY3JpcHRpb24sIHVuaXQsIHRyZWF0KV0gJT4lCiAgdW5pcXVlICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2xvciA9IHNjbikpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBUSEVNRSArIAogIGZhY2V0X3dyYXAoJ3RyZWF0JykKYGBgCgoKSW1wb3J0ICYgZm9ybWF0IHRoZSB1bmlmb3JtIGRpc3R1cmJhbmNlIHRyZWF0bWVudHMuIAoKYGBge3J9CmgwIDwtIHJlYWRSRFMoZmlsZS5wYXRoKEVEX09VVFBVVF9ESVIsICdkaXN0dXJiZW5jZS10cmVhdG1lbnRzJywgJ2hhcnZlc3RfMF91bmlmb3JtLnJkcycpKQpoNDUgPC0gcmVhZFJEUyhmaWxlLnBhdGgoRURfT1VUUFVUX0RJUiwgJ2Rpc3R1cmJlbmNlLXRyZWF0bWVudHMnLCAnaGFydmVzdF80NV91bmlmb3JtLnJkcycpKQpoNjUgPC0gcmVhZFJEUyhmaWxlLnBhdGgoRURfT1VUUFVUX0RJUiwgJ2Rpc3R1cmJlbmNlLXRyZWF0bWVudHMnLCAnaGFydmVzdF82NV91bmlmb3JtLnJkcycpKQpoODUgPC0gcmVhZFJEUyhmaWxlLnBhdGgoRURfT1VUUFVUX0RJUiwgJ2Rpc3R1cmJlbmNlLXRyZWF0bWVudHMnLCAnaGFydmVzdF84NV91bmlmb3JtLnJkcycpKQoKaDAgPC0gYXMuZGF0YS50YWJsZShoMCRkZl9jb2hvcnRbWzFdXSlbICAsbGlzdChkYXRldGltZSwgTU1FQU5fTlBQX0NPLCBQRlQsIERCSCwgTlBMQU5UKV0KaDQ1IDwtIGFzLmRhdGEudGFibGUoaDQ1JGRmX2NvaG9ydFtbMV1dKVsgICxsaXN0KGRhdGV0aW1lLCBNTUVBTl9OUFBfQ08sIFBGVCwgREJILCBOUExBTlQpXQpoNjUgPC0gYXMuZGF0YS50YWJsZShoNjUkZGZfY29ob3J0W1sxXV0pWyAgLGxpc3QoZGF0ZXRpbWUsIE1NRUFOX05QUF9DTywgUEZULCBEQkgsIE5QTEFOVCldCmg4NSA8LSBhcy5kYXRhLnRhYmxlKGg4NSRkZl9jb2hvcnRbWzFdXSlbICAsbGlzdChkYXRldGltZSwgTU1FQU5fTlBQX0NPLCBQRlQsIERCSCwgTlBMQU5UKV0KCmgwJHNjbiAgPC0gJ2Jhc2VsaW5lJwpoNDUkc2NuIDwtICdoYXJ2ZXN0XzQ1JwpoNjUkc2NuIDwtICdoYXJ2ZXN0XzY1JwpoODUkc2NuIDwtICdoYXJ2ZXN0Xzg1JwoKaDAkdHJlYXQgPC0gJ1VuaWZvcm0gSGFydmVzdCcKaDQ1JHRyZWF0IDwtICdVbmlmb3JtIEhhcnZlc3QnCmg2NSR0cmVhdCA8LSAnVW5pZm9ybSBIYXJ2ZXN0JwpoODUkdHJlYXQgPC0gJ1VuaWZvcm0gSGFydmVzdCcKCgpOUFAgPC0gcmJpbmQoaDAsIGg0NSwgaDY1LCBoODUpCiMgQ29udmVydCB0aGUgTlBQIHVuaXRzIGZyb20gcGVyIHBsYW50IHRvIHVuaXQgYXJlYQpOUFAkdmFsdWUgPC0gTlBQJE1NRUFOX05QUF9DTyAqIE5QUCROUExBTlQKTlBQIDwtIE5QUFssIGMoImRhdGV0aW1lIiwgIlBGVCIsICJzY24iLCAidmFsdWUiLCAidHJlYXQiKV0KTlBQJHllYXIgPC0gbHVicmlkYXRlOjp5ZWFyKE5QUCRkYXRldGltZSkKTlBQJGRhdGV0aW1lIDwtIGRhdGUoTlBQJGRhdGV0aW1lKQpOUFBfdW5pZm9ybSA8LSBOUFAgCmBgYAoKCkltcG9ydCAmIGZvcm1hdCB0aGUgc3RvcmFnZSBzcGVjaWZpYyB0cmVhdG1lbnRzCgpgYGB7cn0KaDQ1IDwtIHJlYWRSRFMoZmlsZS5wYXRoKEVEX09VVFBVVF9ESVIsICdkaXN0dXJiZW5jZS10cmVhdG1lbnRzJywgJ2hhcnZlc3RfNDVfb3RoZXIwLnJkcycpKQpoNjUgPC0gcmVhZFJEUyhmaWxlLnBhdGgoRURfT1VUUFVUX0RJUiwgJ2Rpc3R1cmJlbmNlLXRyZWF0bWVudHMnLCAnaGFydmVzdF82NV9vdGhlcjAucmRzJykpCmg4NSA8LSByZWFkUkRTKGZpbGUucGF0aChFRF9PVVRQVVRfRElSLCAnZGlzdHVyYmVuY2UtdHJlYXRtZW50cycsICdoYXJ2ZXN0Xzg1X290aGVyMC5yZHMnKSkKCmg0NSA8LSBhcy5kYXRhLnRhYmxlKGg0NSRkZl9jb2hvcnRbWzFdXSlbICAsbGlzdChkYXRldGltZSwgTU1FQU5fTlBQX0NPLCBQRlQsIERCSCwgTlBMQU5UKV0KaDY1IDwtIGFzLmRhdGEudGFibGUoaDY1JGRmX2NvaG9ydFtbMV1dKVsgICxsaXN0KGRhdGV0aW1lLCBNTUVBTl9OUFBfQ08sIFBGVCwgREJILCBOUExBTlQpXQpoODUgPC0gYXMuZGF0YS50YWJsZShoODUkZGZfY29ob3J0W1sxXV0pWyAgLGxpc3QoZGF0ZXRpbWUsIE1NRUFOX05QUF9DTywgUEZULCBEQkgsIE5QTEFOVCldCgpoMCRzY24gPC0gJ2Jhc2VsaW5lJwpoNDUkc2NuIDwtICdoYXJ2ZXN0XzQ1JwpoNjUkc2NuIDwtICdoYXJ2ZXN0XzY1JwpoODUkc2NuIDwtICdoYXJ2ZXN0Xzg1JwoKaDAkdHJlYXQgPC0gJ0MgU3RvcmFnZSBIYXJ2ZXN0JwpoNDUkdHJlYXQgPC0gJ0MgU3RvcmFnZSBIYXJ2ZXN0JwpoNjUkdHJlYXQgPC0gJ0MgU3RvcmFnZSBIYXJ2ZXN0JwpoODUkdHJlYXQgPC0gJ0MgU3RvcmFnZSBIYXJ2ZXN0JwoKTlBQIDwtIHJiaW5kKGgwLCBoNDUsIGg2NSwgaDg1KQojIENvbnZlcnQgdGhlIE5QUCB1bml0cyBmcm9tIHBlciBwbGFudCB0byB1bml0IGFyZWEKTlBQJHZhbHVlIDwtIE5QUCRNTUVBTl9OUFBfQ08gKiBOUFAkTlBMQU5UCk5QUCA8LSBOUFBbLCBjKCJkYXRldGltZSIsICJQRlQiLCAic2NuIiwgInZhbHVlIiwgInRyZWF0IildCk5QUCR5ZWFyIDwtIGx1YnJpZGF0ZTo6eWVhcihOUFAkZGF0ZXRpbWUpCk5QUCRkYXRldGltZSA8LSBkYXRlKE5QUCRkYXRldGltZSkKTlBQX290aGVyMCA8LSBOUFAgCmBgYAoKCmBgYHtyfQpyYmluZChOUFBfdW5pZm9ybSwgTlBQX290aGVyMCkgJT4lIAogIC5beWVhciAlaW4lIDIwMTk6MjAyMl0gJT4lIAogIC5bLCB2YWx1ZSA6PSBzdW0odmFsdWUpLCBieSA9IGxpc3QoZGF0ZXRpbWUsIHNjbiwgeWVhciwgdHJlYXQpXSAlPiUKICB1bmlxdWUgLT4gCiAgTlBQX3RvX3Bsb3QgCgpOUFBfdG9fcGxvdCAlPiUgIAogIGdncGxvdChhZXMoZGF0ZXRpbWUsIHZhbHVlLCBjb2xvciA9IHNjbikpICsgCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X3dyYXAoJ3RyZWF0JykgKyAKICBUSEVNRSArIAogIGxhYnMoeSA9ICdOUFAga2dDL20yL3lyIHBlciBtb250aCcpCmBgYAoKYGBge3J9Ck5QUF90b19wbG90ICU+JSAgCiAgZ2dwbG90KGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gdHJlYXQsIGxpbmV0eXBlID0gdHJlYXQpKSArIAogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKCdzY24nKSArIAogIFRIRU1FICsgCiAgbGFicyh5ID0gJ05QUCBrZ0MvbTIveXIgcGVyIG1vbnRoJykKYGBgCgojIyMgQ29uY2x1c2lvbiAKCiogVHVybnMgb3V0IHRoYXQgcmVhZGluZyB0aGUgdmVyc2lvbiBvZiBFRCdzIGZvcnRyYW4gY29kZSB0aGF0IGlmIGEgY2FyYm9uIGRpc3R1cmJhbmNlIGlzIG5vdCBzcGVjaWZpYyB0aGVuIEVEIGFzc2lnbnMgdGhlIGRpc3R1cmJhbmNlIG9mIDEgKGNvbXBsZXRlIGRpc3R1cmJhbmNlKSB3aGljaCBpcyBleHBsYWlucyB0aGUgbGFyZ2UgZGVjbGluZSBpbiBBR0Igd2Ugc2F3IGluIHRoZSByZXN1bHRzIGZyb20gbGFzdCB3ZWVrLiAKKiBOb3cgd2UgaGF2ZSBydW5zIHRoYXQgYXJlIG1vcmUgcmVhbGlzdGljIHdoZXJlIHdlIGFwcGx5IHRoZSBzYW1lIGRpc3R1cmJhbmNlIHRyZWF0bWVudCB0byBhbGwgb2YgdGhlIGRpZmZlcmVudCBwbGFudCBjYXJib24gcG9vbHMgYW5kIHJ1bnMgdGhhdCBvbmx5IGFwcGx5IHRoZSBkaXN0dXJiYW5jZSB0byB0aGUgQyBzdG9yYWdlIGFzIHBlciBKYWNraWUncyBzdWdnZXN0aW9uLiBIb3dldmVyIHRoZSBkaWZmZXJlbmNlIGluIEFHQiBhbmQgY2FyYm9uIGZsdWV4ZXMgKGltcGxpZWQgYnkgTlBQKSBhcmUgc21hbGxlciBiZXR3ZWVuIHRoZSBDIHN0b3JhZ2UgdHJlYXRtZW50cyB0aGFuIEkgd2FzIGV4cGVjdGluZy4gSXQgaXMgdW5jbGVhciBpZiB0aGlzIGlzIGEgcHJvYmxlbSBvciBub3QuIExvb2tpbmcgYXQgdGhlIFBlc3QgRUQgcGFwZXIgYXBwbHl0aGluZyBwaGxvbWUgZGlzdHVyYmFuY2VzIG9mIHZhcnlpbmcgZGVncmVlcyBoYWQgYSBzdWJzdGFudGlhbCBpbXBhY3Qgb24gY2FyYm9uIGZsdXhlcyAoTkVFKSB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBFRCByZXN1bHRzIHNlZW0gYSB0YWQgc3VzcGVjdAoKSWRlYXMgZm9yIG5leHQgc3RlcHMgCgoqIEJCTCB3aGljaCBvbmUgc2VlbXMgYmV0dGVyL21vcmUgcmVhbGlzdGljPyBNeSBjb25jZXJuIGlzIHRoYXQgdGhlIEMgb25seSBkaXN0dXJiYW5jZXMgYXJlIHRvbyBzbWFsbCBidXQgcGVyaGFwcyB0aGF0IGlzIHJlYWxpc3RpYy4gCiogUnVuIHRoZSBjb21wbGV0ZSBydW5zIHdpdGggdGhlIHR3byBkaWZmZXJlbnQgaGFydmVzdHMsIGRvZXMgaXQgbWF0dGVyIGhvdyBtYXR1cmUgdGhlIGZvcmVzdCBpcz8gCiogRm9sbG93dXAgd2l0aCBKYWNraWUgYW5kIEFsZXhleSBhYm91dCB0aGUgcmVzdWx0cyAKCiMgSmFudWFyeSBEaXN0dXJiYW5jZSAKCmBgYHtyfQpvYmplY3QkQUJHW2dyZXBsKCdqYW58YmFzZWxpbmUnLCBzY24pLCBdICU+JSAKICAuWywgdmFsdWUgOj0gc3VtKHZhbHVlKSwgYnkgPSBsaXN0KGRhdGV0aW1lLCB2YXJpYWJsZSwgZGVzY3JpcHRpb24sIHVuaXQsIHNjbildICU+JSAKICAuWywgbGlzdChkYXRldGltZSwgdmFsdWUsIHNjbiwgdmFyaWFibGUsIHVuaXQpXSAlPiUgIAogIGdncGxvdCgpICsgCiAgZ2VvbV9saW5lKGFlcyhkYXRldGltZSwgdmFsdWUsIGNvbG9yID0gc2NuLCBsaW5ldHlwZSA9IHNjbikpICsgCiAgVEhFTUUgKyAKICBsYWJzKHRpdGxlID0gJ0FCRyBKYW51YXJ5IEhhcnZlc3QnLCB5ID0gImtnQy9tMiIpCmBgYAoKU28gaXQgbG9va3MgbGlrZSBzdGFydGluZyBpbiBiZWZvcmUgdGhlIGdyb3dpbmcgc2Vhc29uIGRvZXMgbm90IGhhdmUgdGhlIGludGVuZGVkIGltcGFjdC4gCgojIEFib3ZlIEdyb3VuZCBCaW9tYXNzIERpc3R1cmJhbmNlIAoKYGBge3J9Cm9iamVjdCRBQkdbZ3JlcGwoJ2Fib3ZlJywgc2NuKSwgXSAlPiUgCiAgLlssIHZhbHVlIDo9IHN1bSh2YWx1ZSksIGJ5ID0gbGlzdChkYXRldGltZSwgdmFyaWFibGUsIGRlc2NyaXB0aW9uLCB1bml0LCBzY24pXSAlPiUgCiAgLlssIGxpc3QoZGF0ZXRpbWUsIHZhbHVlLCBzY24sIHZhcmlhYmxlLCB1bml0KV0gJT4lICAKICBnZ3Bsb3QoKSArIAogIGdlb21fbGluZShhZXMoZGF0ZXRpbWUsIHZhbHVlLCBjb2xvciA9IHNjbiwgbGluZXR5cGUgPSBzY24pKSArIAogIFRIRU1FICsgCiAgbGFicyh0aXRsZSA9ICdBQkcgQWJvdmUgR3JvdW5kIEJpb21hc3MnLCB5ID0gImtnQy9tMiIpCmBgYAoKCgoqKioqIAoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBg