Data

source("0_helpers.R")
library(modelr)
library(tidybayes)

load("data/cleaned_selected_wrangled.rdata")

Sexual Frequency (Penetrative Intercourse)

Uncontrolled Model

m_hc_sexfreqpen = brm(diary_sex_active_sex_sum ~
                        offset(log(number_of_days)) +
                        contraception_hormonal,
                data = data, family = poisson(),
                file = "m_hc_sexfreqpen")

Data Grid

grid = data %>%
  data_grid(number_of_days = 1,
            contraception_hormonal)

Add Predicted Values

data_pred = add_epred_draws(grid, m_hc_sexfreqpen,
                   value = "E[y|A,B]",
                   ndraws = 1000)

Average Marginal Effect

ame = data_pred %>%
  group_by(contraception_hormonal, .draw) %>%  # group by predictors to keep
  summarise(`E[y|A]` = mean(`E[y|A,B]`, na.rm = T)) %>%
  compare_levels(`E[y|A]`, by = contraception_hormonal) %>%  
  rename(`mean difference` = `E[y|A]`) %>%
  mean_qi(`mean difference`, .width = .90)
## `summarise()` has grouped output by 'contraception_hormonal'. You can override using the `.groups` argument.
ame
## # A tibble: 1 x 7
##   contraception_hormonal `mean difference` .lower .upper .width .point .interval
##   <chr>                              <dbl>  <dbl>  <dbl>  <dbl> <chr>  <chr>    
## 1 yes - no                          0.0350 0.0288 0.0410    0.9 mean   qi

Compare Means

means = data_pred %>%
  group_by(contraception_hormonal) %>%
  summarise(mean_fit = mean(`E[y|A,B]`, na.rm = T))
print(data.frame(means), digits = 4)
##   contraception_hormonal mean_fit
## 1                     no    0.124
## 2                    yes    0.159

Controlled Model

m_hc_sexfreqpen_controlled = brm(diary_sex_active_sex_sum ~
                        offset(log(number_of_days)) +
                        contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                data = data, family = poisson(),
                file = "m_hc_sexfreqpen_controlled")

Data Grid

grid = data %>%
  data_grid(number_of_days = 1,
            contraception_hormonal,
            age = seq_range(age, n = 5), # measured in full years
            net_income,
            relationship_duration_factor,
            education_years = seq_range(education_years, n = 5), # measured in full years
            bfi_extra = mean(data$bfi_extra),
            bfi_neuro = mean(data$bfi_neuro), 
            bfi_agree = mean(data$bfi_agree), 
            bfi_consc = mean(data$bfi_consc), 
            bfi_open = mean(data$bfi_open),
            religiosity = mean(data$religiosity)
  )

Add Predicted Values

data_pred = add_epred_draws(grid, m_hc_sexfreqpen_controlled,
                   value = "E[y|A,B]",
                   ndraws = 1000)

Average Marginal Effect

ame = data_pred %>%
  group_by(contraception_hormonal, .draw) %>%  # group by predictors to keep
  summarise(`E[y|A]` = mean(`E[y|A,B]`, na.rm = T)) %>%
  compare_levels(`E[y|A]`, by = contraception_hormonal) %>%  
  rename(`mean difference` = `E[y|A]`) %>%
  mean_qi(`mean difference`, .width = .90)
## `summarise()` has grouped output by 'contraception_hormonal'. You can override using the `.groups` argument.
ame
## # A tibble: 1 x 7
##   contraception_hormonal `mean difference` .lower .upper .width .point .interval
##   <chr>                              <dbl>  <dbl>  <dbl>  <dbl> <chr>  <chr>    
## 1 yes - no                          0.0272 0.0194 0.0348    0.9 mean   qi

Compare Means

means = data_pred %>%
  group_by(contraception_hormonal) %>%
  summarise(mean_fit = mean(`E[y|A,B]`, na.rm = T))
print(as.data.frame(means), digits = 4)
##   contraception_hormonal mean_fit
## 1                     no   0.1525
## 2                    yes   0.1797

Masturbation Frequency

Uncontrolled Model

m_hc_masfreq = brm(diary_masturbation_sum ~ offset(log(number_of_days)) +
                     contraception_hormonal,
                data = data, family = poisson(),
                file = "m_hc_masfreq")

Data Grid

grid = data %>%
  data_grid(number_of_days = 1,
            contraception_hormonal)

Add Predicted Values

data_pred = add_epred_draws(grid, m_hc_masfreq,
                   value = "E[y|A,B]",
                   ndraws = 1000)

Average Marginal Effect

ame = data_pred %>%
  group_by(contraception_hormonal, .draw) %>%  # group by predictors to keep
  summarise(`E[y|A]` = mean(`E[y|A,B]`, na.rm = T)) %>%
  compare_levels(`E[y|A]`, by = contraception_hormonal) %>%  
  rename(`mean difference` = `E[y|A]`) %>%
  mean_qi(`mean difference`, .width = .90)
## `summarise()` has grouped output by 'contraception_hormonal'. You can override using the `.groups` argument.
ame
## # A tibble: 1 x 7
##   contraception_hormonal `mean difference`  .lower  .upper .width .point .interval
##   <chr>                              <dbl>   <dbl>   <dbl>  <dbl> <chr>  <chr>    
## 1 yes - no                         -0.0502 -0.0556 -0.0450    0.9 mean   qi

Compare Means

means = data_pred %>%
  group_by(contraception_hormonal) %>%
  summarise(mean_fit = mean(`E[y|A,B]`, na.rm = T))
print(as.data.frame(means), digits = 4)
##   contraception_hormonal mean_fit
## 1                     no   0.1531
## 2                    yes   0.1029

Controlled Model

m_hc_masfreq_controlled = brm(diary_masturbation_sum ~
                        offset(log(number_of_days)) +
                        contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                data = data, family = poisson(),
                file = "m_hc_masfreq_controlled")

Data Grid

grid = data %>%
  data_grid(number_of_days = 1,
            contraception_hormonal,
            age = seq_range(age, n = 5), # measured in full years
            net_income,
            relationship_duration_factor,
            education_years = seq_range(education_years, n = 5), # measured in full years
            bfi_extra = mean(data$bfi_extra),
            bfi_neuro = mean(data$bfi_neuro), 
            bfi_agree = mean(data$bfi_agree), 
            bfi_consc = mean(data$bfi_consc), 
            bfi_open = mean(data$bfi_open),
            religiosity = mean(data$religiosity)
  )

Add Predicted Values

data_pred = add_epred_draws(grid, m_hc_masfreq_controlled,
                   value = "E[y|A,B]",
                   ndraws = 1000)

Average Marginal Effect

ame = data_pred %>%
  group_by(contraception_hormonal, .draw) %>%  # group by predictors to keep
  summarise(`E[y|A]` = mean(`E[y|A,B]`, na.rm = T)) %>%
  compare_levels(`E[y|A]`, by = contraception_hormonal) %>%  
  rename(`mean difference` = `E[y|A]`) %>%
  mean_qi(`mean difference`, .width = .90)
## `summarise()` has grouped output by 'contraception_hormonal'. You can override using the `.groups` argument.
ame
## # A tibble: 1 x 7
##   contraception_hormonal `mean difference`  .lower  .upper .width .point .interval
##   <chr>                              <dbl>   <dbl>   <dbl>  <dbl> <chr>  <chr>    
## 1 yes - no                         -0.0311 -0.0358 -0.0266    0.9 mean   qi

Compare Means

means = data_pred %>%
  group_by(contraception_hormonal) %>%
  summarise(mean_fit = mean(`E[y|A,B]`, na.rm = T))
print(as.data.frame(means), digits = 4)
##   contraception_hormonal mean_fit
## 1                     no  0.12145
## 2                    yes  0.09033
LS0tDQp0aXRsZTogIk1hcmdpbmFsIEVmZmVjdHMgaW4gQ29udHJvbGxlZCBNb2RlbHMiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAnc2hvdycNCiAgICBzZWxmX2NvbnRhaW5lZDogZmFsc2UNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KICANCiAgDQojIyBEYXRhIA0KYGBge3IgcmVzdWx0cz0naGlkZScsbWVzc2FnZT1GLHdhcm5pbmc9Rn0NCnNvdXJjZSgiMF9oZWxwZXJzLlIiKQ0KbGlicmFyeShtb2RlbHIpDQpsaWJyYXJ5KHRpZHliYXllcykNCg0KbG9hZCgiZGF0YS9jbGVhbmVkX3NlbGVjdGVkX3dyYW5nbGVkLnJkYXRhIikNCmBgYA0KDQoNCiMjIFNleHVhbCBGcmVxdWVuY3kgKFBlbmV0cmF0aXZlIEludGVyY291cnNlKSB7LnRhYnNldH0NCiMjIyBVbmNvbnRyb2xsZWQgTW9kZWwNCmBgYHtyfQ0KbV9oY19zZXhmcmVxcGVuID0gYnJtKGRpYXJ5X3NleF9hY3RpdmVfc2V4X3N1bSB+DQogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQobG9nKG51bWJlcl9vZl9kYXlzKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY2VwdGlvbl9ob3Jtb25hbCwNCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwgZmFtaWx5ID0gcG9pc3NvbigpLA0KICAgICAgICAgICAgICAgIGZpbGUgPSAibV9oY19zZXhmcmVxcGVuIikNCmBgYA0KDQojIyMjIERhdGEgR3JpZA0KYGBge3J9DQpncmlkID0gZGF0YSAlPiUNCiAgZGF0YV9ncmlkKG51bWJlcl9vZl9kYXlzID0gMSwNCiAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwpDQoNCmBgYA0KDQojIyMjIEFkZCBQcmVkaWN0ZWQgVmFsdWVzDQpgYGB7cn0NCmRhdGFfcHJlZCA9IGFkZF9lcHJlZF9kcmF3cyhncmlkLCBtX2hjX3NleGZyZXFwZW4sDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiRVt5fEEsQl0iLA0KICAgICAgICAgICAgICAgICAgIG5kcmF3cyA9IDEwMDApDQpgYGANCg0KIyMjIyBBdmVyYWdlIE1hcmdpbmFsIEVmZmVjdA0KYGBge3J9DQphbWUgPSBkYXRhX3ByZWQgJT4lDQogIGdyb3VwX2J5KGNvbnRyYWNlcHRpb25faG9ybW9uYWwsIC5kcmF3KSAlPiUgICMgZ3JvdXAgYnkgcHJlZGljdG9ycyB0byBrZWVwDQogIHN1bW1hcmlzZShgRVt5fEFdYCA9IG1lYW4oYEVbeXxBLEJdYCwgbmEucm0gPSBUKSkgJT4lDQogIGNvbXBhcmVfbGV2ZWxzKGBFW3l8QV1gLCBieSA9IGNvbnRyYWNlcHRpb25faG9ybW9uYWwpICU+JSAgDQogIHJlbmFtZShgbWVhbiBkaWZmZXJlbmNlYCA9IGBFW3l8QV1gKSAlPiUNCiAgbWVhbl9xaShgbWVhbiBkaWZmZXJlbmNlYCwgLndpZHRoID0gLjkwKQ0KYW1lDQpgYGANCg0KIyMjIyBDb21wYXJlIE1lYW5zDQpgYGB7cn0NCm1lYW5zID0gZGF0YV9wcmVkICU+JQ0KICBncm91cF9ieShjb250cmFjZXB0aW9uX2hvcm1vbmFsKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fZml0ID0gbWVhbihgRVt5fEEsQl1gLCBuYS5ybSA9IFQpKQ0KcHJpbnQoZGF0YS5mcmFtZShtZWFucyksIGRpZ2l0cyA9IDQpDQpgYGANCg0KDQojIyMgQ29udHJvbGxlZCBNb2RlbA0KYGBge3J9DQptX2hjX3NleGZyZXFwZW5fY29udHJvbGxlZCA9IGJybShkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0gfg0KICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KGxvZyhudW1iZXJfb2ZfZGF5cykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKw0KICAgICAgICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBwb2lzc29uKCksDQogICAgICAgICAgICAgICAgZmlsZSA9ICJtX2hjX3NleGZyZXFwZW5fY29udHJvbGxlZCIpDQpgYGANCg0KDQojIyMjIERhdGEgR3JpZA0KYGBge3J9DQpncmlkID0gZGF0YSAlPiUNCiAgZGF0YV9ncmlkKG51bWJlcl9vZl9kYXlzID0gMSwNCiAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwsDQogICAgICAgICAgICBhZ2UgPSBzZXFfcmFuZ2UoYWdlLCBuID0gNSksICMgbWVhc3VyZWQgaW4gZnVsbCB5ZWFycw0KICAgICAgICAgICAgbmV0X2luY29tZSwNCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IsDQogICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgPSBzZXFfcmFuZ2UoZWR1Y2F0aW9uX3llYXJzLCBuID0gNSksICMgbWVhc3VyZWQgaW4gZnVsbCB5ZWFycw0KICAgICAgICAgICAgYmZpX2V4dHJhID0gbWVhbihkYXRhJGJmaV9leHRyYSksDQogICAgICAgICAgICBiZmlfbmV1cm8gPSBtZWFuKGRhdGEkYmZpX25ldXJvKSwgDQogICAgICAgICAgICBiZmlfYWdyZWUgPSBtZWFuKGRhdGEkYmZpX2FncmVlKSwgDQogICAgICAgICAgICBiZmlfY29uc2MgPSBtZWFuKGRhdGEkYmZpX2NvbnNjKSwgDQogICAgICAgICAgICBiZmlfb3BlbiA9IG1lYW4oZGF0YSRiZmlfb3BlbiksDQogICAgICAgICAgICByZWxpZ2lvc2l0eSA9IG1lYW4oZGF0YSRyZWxpZ2lvc2l0eSkNCiAgKQ0KDQpgYGANCg0KIyMjIyBBZGQgUHJlZGljdGVkIFZhbHVlcw0KYGBge3J9DQpkYXRhX3ByZWQgPSBhZGRfZXByZWRfZHJhd3MoZ3JpZCwgbV9oY19zZXhmcmVxcGVuX2NvbnRyb2xsZWQsDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiRVt5fEEsQl0iLA0KICAgICAgICAgICAgICAgICAgIG5kcmF3cyA9IDEwMDApDQpgYGANCg0KIyMjIyBBdmVyYWdlIE1hcmdpbmFsIEVmZmVjdA0KYGBge3J9DQphbWUgPSBkYXRhX3ByZWQgJT4lDQogIGdyb3VwX2J5KGNvbnRyYWNlcHRpb25faG9ybW9uYWwsIC5kcmF3KSAlPiUgICMgZ3JvdXAgYnkgcHJlZGljdG9ycyB0byBrZWVwDQogIHN1bW1hcmlzZShgRVt5fEFdYCA9IG1lYW4oYEVbeXxBLEJdYCwgbmEucm0gPSBUKSkgJT4lDQogIGNvbXBhcmVfbGV2ZWxzKGBFW3l8QV1gLCBieSA9IGNvbnRyYWNlcHRpb25faG9ybW9uYWwpICU+JSAgDQogIHJlbmFtZShgbWVhbiBkaWZmZXJlbmNlYCA9IGBFW3l8QV1gKSAlPiUNCiAgbWVhbl9xaShgbWVhbiBkaWZmZXJlbmNlYCwgLndpZHRoID0gLjkwKQ0KYW1lDQpgYGANCg0KIyMjIyBDb21wYXJlIE1lYW5zDQpgYGB7cn0NCm1lYW5zID0gZGF0YV9wcmVkICU+JQ0KICBncm91cF9ieShjb250cmFjZXB0aW9uX2hvcm1vbmFsKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fZml0ID0gbWVhbihgRVt5fEEsQl1gLCBuYS5ybSA9IFQpKQ0KcHJpbnQoYXMuZGF0YS5mcmFtZShtZWFucyksIGRpZ2l0cyA9IDQpDQpgYGANCg0KDQojIyBNYXN0dXJiYXRpb24gRnJlcXVlbmN5IHsudGFic2V0fQ0KIyMjIFVuY29udHJvbGxlZCBNb2RlbA0KYGBge3J9DQptX2hjX21hc2ZyZXEgPSBicm0oZGlhcnlfbWFzdHVyYmF0aW9uX3N1bSB+IG9mZnNldChsb2cobnVtYmVyX29mX2RheXMpKSArDQogICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBwb2lzc29uKCksDQogICAgICAgICAgICAgICAgZmlsZSA9ICJtX2hjX21hc2ZyZXEiKQ0KYGBgDQoNCg0KIyMjIyBEYXRhIEdyaWQNCmBgYHtyfQ0KZ3JpZCA9IGRhdGEgJT4lDQogIGRhdGFfZ3JpZChudW1iZXJfb2ZfZGF5cyA9IDEsDQogICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsKQ0KDQpgYGANCg0KIyMjIyBBZGQgUHJlZGljdGVkIFZhbHVlcw0KYGBge3J9DQpkYXRhX3ByZWQgPSBhZGRfZXByZWRfZHJhd3MoZ3JpZCwgbV9oY19tYXNmcmVxLA0KICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIkVbeXxBLEJdIiwNCiAgICAgICAgICAgICAgICAgICBuZHJhd3MgPSAxMDAwKQ0KYGBgDQoNCiMjIyMgQXZlcmFnZSBNYXJnaW5hbCBFZmZlY3QNCmBgYHtyfQ0KYW1lID0gZGF0YV9wcmVkICU+JQ0KICBncm91cF9ieShjb250cmFjZXB0aW9uX2hvcm1vbmFsLCAuZHJhdykgJT4lICAjIGdyb3VwIGJ5IHByZWRpY3RvcnMgdG8ga2VlcA0KICBzdW1tYXJpc2UoYEVbeXxBXWAgPSBtZWFuKGBFW3l8QSxCXWAsIG5hLnJtID0gVCkpICU+JQ0KICBjb21wYXJlX2xldmVscyhgRVt5fEFdYCwgYnkgPSBjb250cmFjZXB0aW9uX2hvcm1vbmFsKSAlPiUgIA0KICByZW5hbWUoYG1lYW4gZGlmZmVyZW5jZWAgPSBgRVt5fEFdYCkgJT4lDQogIG1lYW5fcWkoYG1lYW4gZGlmZmVyZW5jZWAsIC53aWR0aCA9IC45MCkNCmFtZQ0KYGBgDQoNCiMjIyMgQ29tcGFyZSBNZWFucw0KYGBge3J9DQptZWFucyA9IGRhdGFfcHJlZCAlPiUNCiAgZ3JvdXBfYnkoY29udHJhY2VwdGlvbl9ob3Jtb25hbCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2ZpdCA9IG1lYW4oYEVbeXxBLEJdYCwgbmEucm0gPSBUKSkNCnByaW50KGFzLmRhdGEuZnJhbWUobWVhbnMpLCBkaWdpdHMgPSA0KQ0KYGBgDQoNCiMjIyBDb250cm9sbGVkIE1vZGVsDQpgYGB7cn0NCm1faGNfbWFzZnJlcV9jb250cm9sbGVkID0gYnJtKGRpYXJ5X21hc3R1cmJhdGlvbl9zdW0gfg0KICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KGxvZyhudW1iZXJfb2ZfZGF5cykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKw0KICAgICAgICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLCBmYW1pbHkgPSBwb2lzc29uKCksDQogICAgICAgICAgICAgICAgZmlsZSA9ICJtX2hjX21hc2ZyZXFfY29udHJvbGxlZCIpDQpgYGANCg0KDQojIyMjIERhdGEgR3JpZA0KYGBge3J9DQpncmlkID0gZGF0YSAlPiUNCiAgZGF0YV9ncmlkKG51bWJlcl9vZl9kYXlzID0gMSwNCiAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwsDQogICAgICAgICAgICBhZ2UgPSBzZXFfcmFuZ2UoYWdlLCBuID0gNSksICMgbWVhc3VyZWQgaW4gZnVsbCB5ZWFycw0KICAgICAgICAgICAgbmV0X2luY29tZSwNCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IsDQogICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgPSBzZXFfcmFuZ2UoZWR1Y2F0aW9uX3llYXJzLCBuID0gNSksICMgbWVhc3VyZWQgaW4gZnVsbCB5ZWFycw0KICAgICAgICAgICAgYmZpX2V4dHJhID0gbWVhbihkYXRhJGJmaV9leHRyYSksDQogICAgICAgICAgICBiZmlfbmV1cm8gPSBtZWFuKGRhdGEkYmZpX25ldXJvKSwgDQogICAgICAgICAgICBiZmlfYWdyZWUgPSBtZWFuKGRhdGEkYmZpX2FncmVlKSwgDQogICAgICAgICAgICBiZmlfY29uc2MgPSBtZWFuKGRhdGEkYmZpX2NvbnNjKSwgDQogICAgICAgICAgICBiZmlfb3BlbiA9IG1lYW4oZGF0YSRiZmlfb3BlbiksDQogICAgICAgICAgICByZWxpZ2lvc2l0eSA9IG1lYW4oZGF0YSRyZWxpZ2lvc2l0eSkNCiAgKQ0KDQpgYGANCg0KIyMjIyBBZGQgUHJlZGljdGVkIFZhbHVlcw0KYGBge3J9DQpkYXRhX3ByZWQgPSBhZGRfZXByZWRfZHJhd3MoZ3JpZCwgbV9oY19tYXNmcmVxX2NvbnRyb2xsZWQsDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiRVt5fEEsQl0iLA0KICAgICAgICAgICAgICAgICAgIG5kcmF3cyA9IDEwMDApDQpgYGANCg0KIyMjIyBBdmVyYWdlIE1hcmdpbmFsIEVmZmVjdA0KYGBge3J9DQphbWUgPSBkYXRhX3ByZWQgJT4lDQogIGdyb3VwX2J5KGNvbnRyYWNlcHRpb25faG9ybW9uYWwsIC5kcmF3KSAlPiUgICMgZ3JvdXAgYnkgcHJlZGljdG9ycyB0byBrZWVwDQogIHN1bW1hcmlzZShgRVt5fEFdYCA9IG1lYW4oYEVbeXxBLEJdYCwgbmEucm0gPSBUKSkgJT4lDQogIGNvbXBhcmVfbGV2ZWxzKGBFW3l8QV1gLCBieSA9IGNvbnRyYWNlcHRpb25faG9ybW9uYWwpICU+JSAgDQogIHJlbmFtZShgbWVhbiBkaWZmZXJlbmNlYCA9IGBFW3l8QV1gKSAlPiUNCiAgbWVhbl9xaShgbWVhbiBkaWZmZXJlbmNlYCwgLndpZHRoID0gLjkwKQ0KYW1lDQpgYGANCg0KIyMjIyBDb21wYXJlIE1lYW5zDQpgYGB7cn0NCm1lYW5zID0gZGF0YV9wcmVkICU+JQ0KICBncm91cF9ieShjb250cmFjZXB0aW9uX2hvcm1vbmFsKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fZml0ID0gbWVhbihgRVt5fEEsQl1gLCBuYS5ybSA9IFQpKQ0KcHJpbnQoYXMuZGF0YS5mcmFtZShtZWFucyksIGRpZ2l0cyA9IDQpDQpgYGANCg==