library(mice)
library(tidyverse)
library(data.table)
#load prepared data.
load("datafiles/data-processed/disaggregated_data/2023-06-12_dyad-survival-data.rda")
# 
# #load ego and alter data
# load(file = "datafiles/data-processed/disaggregated_data/2023-01-17_ego-data.rds")
# load(file = "datafiles/data-processed/disaggregated_data/2023-01-17_alter-data.rds")
# 
#change scientific notation
 options(scipen = 999)

Main analysis dataset

kin_ids_df <- repeated_event_data %>% 
  select(dyad_id, rel_alter) %>% 
  filter(rel_alter < 6) %>% 
  select(dyad_id) %>% 
  distinct()

#we lose half of the data. 
nonkin_repeated_event_data <- repeated_event_data %>% 
  filter(!dyad_id %in% kin_ids_df$dyad_id)
nonkin_survival_data_lead_dependent <-
  nonkin_repeated_event_data %>%
  select(!contains("recode")) %>%
  select(
    nomem_encr,
    process_id,
    dyad_id,
    survey_wave,
    time,
    dropped,
    gender_fac,
    divorced_fac,
    moving_fac,
    educ_alter,
    age_alter,
    gender_alter_fac,
    dear_alter_rec,
    rel_alter_rec,
    origin_rec_nar,
    origin_rec_nar_fac,
    origin_alter_rec,
    origin_alter_rec_fac,
    dyad_educ_sim,
    dyad_gender_sim,
    dyad_age_sim,
    dyad_ethnicity_sim,
    times_dropped_earlier,
    censor,
    length,
    educ_ego,
    leeftijd,
    age_sq,
    net_educ,
    net_density,
    size,
    net_age,
    net_gender,
    starts_with("avealter"),
    starts_with("ei_"),
    starts_with("avsim"),
    degree,
    degree_normalized,
    length_rel_member,
    length_rel_total,
    divorced_event,
    divorced_transition,
    move_event,
    move_transition,
    new_municipality_event,
    new_municipality_transition,
    new_residence_event,
    new_residence_transition,
    first_child,
    first_child_event,
    first_child_transition,
    employment_status,
    paid_work,
    employment,
    employment_event,
    employment_transition,
    retired,
    retired_event,
    retired_transition,
    unemployment,
    unemployed_event,
    unemployed_transition,
    divorced_event,
    divorced_transition,
    lost_partner,
    lost_partner_event,
    lost_partner_transition,
    divorced_seperated
  ) %>%
  group_by(process_id) %>%
  mutate(dropped_lead = lead(dropped)) %>%
  ungroup() %>%
  filter(!is.na(dropped_lead))

Imputation of missing values

Dataprep. We use mean imputation to impute numeric missing values.

#recode error in data in which NA should have been coded as 0.
nonkin_survival_data_lead_dependent <- nonkin_survival_data_lead_dependent %>% 
  mutate(move_event = ifelse(is.na(move_event) & !is.na(new_residence_event),0, move_event),
         new_municipality_event = ifelse(is.na(move_event) & !is.na(new_residence_event),0,new_municipality_event))

#create imputation dummies for divorce, child, move transitions
nonkin_survival_data_lead_dependent <- nonkin_survival_data_lead_dependent %>% 
  mutate(first_child_event_missing = if_else(is.na(first_child_event), 1, 0),
         divorced_event_missing = if_else(is.na(divorced_event), 1, 0),
         move_event_missing = if_else(is.na(move_event), 1, 0),
         new_municipality_event_missing = if_else(is.na(new_municipality_event), 1, 0),
         new_residence_event_missing = if_else(is.na(move_event), 1, 0),
         employment_event_missing = if_else(is.na(employment_event), 1, 0),
         unemployed_event_missing = if_else(is.na(unemployed_event), 1, 0),
         lost_partner_event_missing = if_else(is.na(lost_partner_event), 1, 0),
         retired_event_missing = if_else(is.na(retired_event), 1, 0))


#set seed for imp
set.seed(123)

#mean imputation(for now)
#impute the numeric variables
nonkin_survival_data_lead_dependent_numeric <-
  nonkin_survival_data_lead_dependent %>%
  select(
    educ_ego,
    leeftijd,
    age_sq,
    educ_alter,
    age_alter,
    dyad_educ_sim,
    dyad_gender_sim,
    dyad_age_sim,
    dyad_ethnicity_sim,
    net_educ,
    net_density,
    size,
    net_age,
    net_gender,
    degree_normalized,
    degree,
    starts_with("avealter"),
    starts_with("ei_"),
    starts_with("avsim"),
    divorced_event,
    divorced_transition,
    move_event,
    move_transition,
    new_municipality_event,
    new_municipality_transition,
    new_residence_event,
    new_residence_transition,
    first_child_transition,
    employment_event,
    employment_transition,
    unemployed_event,
    unemployed_transition,
    lost_partner_event,
    lost_partner_transition,
    retired_event,
    retired_transition
  ) %>%
  mutate(across(everything(), ~ as.numeric(.)))

#impute with Mice
nonkin_survival_data_lead_dependent_numeric_imputed <- mice(nonkin_survival_data_lead_dependent_numeric, method = "mean", m = 1, maxit = 1)

iter imp variable 1 1 educ_ego leeftijd age_sq educ_alter age_alter dyad_educ_sim dyad_gender_sim dyad_age_sim dyad_ethnicity_sim net_educ net_density net_age degree avealter_alter_educ avealter_ego_educ avealter_alter_age avealter_ego_age avealter_alter_gender avealter_ego_gender avealter_alter_ethnicity avealter_ego_ethnicity ei_alter_educ ei_ego_educ ei_alter_age ei_ego_age ei_alter_gender ei_ego_gender ei_alter_ethnicity ei_ego_ethnicity avsim_alter_educ avsim_ego_educ avsim_alter_age avsim_ego_age avsim_alter_ethnicity avsim_ego_ethnicity divorced_event divorced_transition new_municipality_event new_municipality_transition new_residence_event new_residence_transition first_child_transition employment_event employment_transition unemployed_event unemployed_transition lost_partner_event lost_partner_transition retired_event retired_transition

#selection of non numeric variables. 
nonkin_survival_data_lead_dependent <- nonkin_survival_data_lead_dependent %>%
  select(nomem_encr,
         process_id,
         dyad_id,
         time,
         dropped_lead,
        gender_fac, 
        divorced_fac, 
        moving_fac,
        gender_alter_fac,
        dear_alter_rec,
        rel_alter_rec,
        times_dropped_earlier,
        censor,
        length,
        length_rel_member,
        length_rel_total,
        origin_rec_nar,
        origin_rec_nar_fac,
        origin_alter_rec,
        origin_alter_rec_fac,
        survey_wave,
        first_child,
        first_child_event_missing,
        divorced_event_missing,
        move_event_missing,
        new_municipality_event_missing,
        new_residence_event_missing,
        employment_event_missing,
        employment_status,
        employment,
        unemployment,
        retired,
        lost_partner,
        unemployed_event_missing,
        retired_event_missing,
        lost_partner_event_missing,
        paid_work
        ) %>% 
  mutate(paid_work_fac = ifelse(is.na(paid_work), 2, paid_work),
         paid_work_fac = factor(
           paid_work,
           levels = 0:2,
           labels = c(
             "No paid work",
             "Paid work",
             "Missing")
           ),
         employment_status_fac = ifelse(
           is.na(employment_status),
           8,
           as.numeric(employment_status)
           ),
         employment_status_fac = factor(
           employment_status_fac,
           levels = 1:8,
           labels = c(
             "employed",
             "self-employed",
             "unemployed",
             "student",
             "housework",
             "retired",
             "other",
             "missing"
             )
           ),
         first_child = ifelse(is.na(first_child), 2, first_child),
         first_child_fac = factor(
           first_child,
           levels = 0:2,
           labels = c("No change", "First child born", "Missing")
         ),
         retired = ifelse(is.na(retired), 2, retired),
         retired_fac = factor(
           retired,
           levels = 0:2,
           labels = c("No change", "Retired", "Missing")
         ),
         employment = ifelse(is.na(employment), 2, employment),
         employment_fac = factor(
           employment,
           levels = 0:2,
           labels = c("No change", "Employed", "Missing")
         ),
         unemployment = ifelse(is.na(unemployment), 2, unemployment),
         unemployment_fac = factor(
           unemployment,
           levels = 0:2,
           labels = c("No change", "Employed", "Missing")
         ),
         lost_partner = ifelse(is.na(lost_partner), 2, lost_partner),
         lost_partner_fac = factor(
           lost_partner,
           levels = 0:2,
           labels = c("No change", "Lost partner", "Missing")
         )
         )

#add the imputed data
nonkin_survival_data_lead_dependent_imputed <- cbind(nonkin_survival_data_lead_dependent, complete(nonkin_survival_data_lead_dependent_numeric_imputed))

#create time variables
nonkin_survival_data_lead_dependent_imputed <- nonkin_survival_data_lead_dependent_imputed %>%
  mutate(time_2 = time*time,
         time_3 = time^3,
         time_4 = time^4,
         time_5 = time^5,
         time_6 = time^6,
         time_7 = time^7,
         time_8 = time^8,
         time_9 = time^9,
         time_10 = time^10)

#create dummy for netsize is 1. These have missings on the ave_alter variables. 
nonkin_survival_data_lead_dependent_imputed <- nonkin_survival_data_lead_dependent_imputed %>% 
  mutate(size_net_one = ifelse(size == 1, 1, 0))


#center and scale numeric
nonkin_survival_data_lead_dependent_imputed <- nonkin_survival_data_lead_dependent_imputed %>%
  mutate(educ_ego_cen = scale(educ_ego),
         age_cen = scale(leeftijd),
         age_sq_cen = scale(age_sq),
         educ_alter_cen = scale(educ_alter),
         age_alter_cen = scale(age_alter),
         dyad_educ_sim_cen = scale(dyad_educ_sim),
         dyad_age_sim_cen = scale(dyad_age_sim),
         dyad_gender_sim_cen = scale(dyad_gender_sim),
         dyad_ethnicity_sim_cen = scale(dyad_ethnicity_sim),
         net_density_cen = scale(net_density),
         net_size_cen = scale(size),
         times_dropped_earlier_cen = scale(times_dropped_earlier),
         length_fac = factor(length, levels = 1:3, labels = c("< 3 years", "3 - 6 years", "> 6 years"))
         )
#save prepared data.
save(nonkin_survival_data_lead_dependent_imputed, file = "datafiles/data-processed/disaggregated_data/2022-09-20_dyad-survival-data-imputed.rda")
LS0tDQp0aXRsZTogIkVnby1uZXQgZGVzZWxlY3Rpb246IEltcHV0YXRpb24iDQphdXRob3I6ICJUaGlqbWVuIEplcm9lbnNlIg0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIpDQpgYGANCg0KYGBge3IgbGlicmFyaWVzfQ0KbGlicmFyeShtaWNlKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpgYGANCg0KDQpgYGB7ciBkYXRhIGltcG9ydH0NCiNsb2FkIHByZXBhcmVkIGRhdGEuDQpsb2FkKCJkYXRhZmlsZXMvZGF0YS1wcm9jZXNzZWQvZGlzYWdncmVnYXRlZF9kYXRhLzIwMjMtMDYtMTJfZHlhZC1zdXJ2aXZhbC1kYXRhLnJkYSIpDQojIA0KIyAjbG9hZCBlZ28gYW5kIGFsdGVyIGRhdGENCiMgbG9hZChmaWxlID0gImRhdGFmaWxlcy9kYXRhLXByb2Nlc3NlZC9kaXNhZ2dyZWdhdGVkX2RhdGEvMjAyMy0wMS0xN19lZ28tZGF0YS5yZHMiKQ0KIyBsb2FkKGZpbGUgPSAiZGF0YWZpbGVzL2RhdGEtcHJvY2Vzc2VkL2Rpc2FnZ3JlZ2F0ZWRfZGF0YS8yMDIzLTAxLTE3X2FsdGVyLWRhdGEucmRzIikNCiMgDQojY2hhbmdlIHNjaWVudGlmaWMgbm90YXRpb24NCiBvcHRpb25zKHNjaXBlbiA9IDk5OSkNCmBgYA0KDQoNCg0KIyBNYWluIGFuYWx5c2lzIGRhdGFzZXQNCg0KDQpgYGB7ciBkZXRlY3Qgbm9uIGtpbiB0aWVzfQ0Ka2luX2lkc19kZiA8LSByZXBlYXRlZF9ldmVudF9kYXRhICU+JSANCiAgc2VsZWN0KGR5YWRfaWQsIHJlbF9hbHRlcikgJT4lIA0KICBmaWx0ZXIocmVsX2FsdGVyIDwgNikgJT4lIA0KICBzZWxlY3QoZHlhZF9pZCkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCiN3ZSBsb3NlIGhhbGYgb2YgdGhlIGRhdGEuIA0Kbm9ua2luX3JlcGVhdGVkX2V2ZW50X2RhdGEgPC0gcmVwZWF0ZWRfZXZlbnRfZGF0YSAlPiUgDQogIGZpbHRlcighZHlhZF9pZCAlaW4lIGtpbl9pZHNfZGYkZHlhZF9pZCkNCmBgYA0KDQpgYGB7ciBzdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50IG5vbmtpbn0NCm5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50IDwtDQogIG5vbmtpbl9yZXBlYXRlZF9ldmVudF9kYXRhICU+JQ0KICBzZWxlY3QoIWNvbnRhaW5zKCJyZWNvZGUiKSkgJT4lDQogIHNlbGVjdCgNCiAgICBub21lbV9lbmNyLA0KICAgIHByb2Nlc3NfaWQsDQogICAgZHlhZF9pZCwNCiAgICBzdXJ2ZXlfd2F2ZSwNCiAgICB0aW1lLA0KICAgIGRyb3BwZWQsDQogICAgZ2VuZGVyX2ZhYywNCiAgICBkaXZvcmNlZF9mYWMsDQogICAgbW92aW5nX2ZhYywNCiAgICBlZHVjX2FsdGVyLA0KICAgIGFnZV9hbHRlciwNCiAgICBnZW5kZXJfYWx0ZXJfZmFjLA0KICAgIGRlYXJfYWx0ZXJfcmVjLA0KICAgIHJlbF9hbHRlcl9yZWMsDQogICAgb3JpZ2luX3JlY19uYXIsDQogICAgb3JpZ2luX3JlY19uYXJfZmFjLA0KICAgIG9yaWdpbl9hbHRlcl9yZWMsDQogICAgb3JpZ2luX2FsdGVyX3JlY19mYWMsDQogICAgZHlhZF9lZHVjX3NpbSwNCiAgICBkeWFkX2dlbmRlcl9zaW0sDQogICAgZHlhZF9hZ2Vfc2ltLA0KICAgIGR5YWRfZXRobmljaXR5X3NpbSwNCiAgICB0aW1lc19kcm9wcGVkX2VhcmxpZXIsDQogICAgY2Vuc29yLA0KICAgIGxlbmd0aCwNCiAgICBlZHVjX2VnbywNCiAgICBsZWVmdGlqZCwNCiAgICBhZ2Vfc3EsDQogICAgbmV0X2VkdWMsDQogICAgbmV0X2RlbnNpdHksDQogICAgc2l6ZSwNCiAgICBuZXRfYWdlLA0KICAgIG5ldF9nZW5kZXIsDQogICAgc3RhcnRzX3dpdGgoImF2ZWFsdGVyIiksDQogICAgc3RhcnRzX3dpdGgoImVpXyIpLA0KICAgIHN0YXJ0c193aXRoKCJhdnNpbSIpLA0KICAgIGRlZ3JlZSwNCiAgICBkZWdyZWVfbm9ybWFsaXplZCwNCiAgICBsZW5ndGhfcmVsX21lbWJlciwNCiAgICBsZW5ndGhfcmVsX3RvdGFsLA0KICAgIGRpdm9yY2VkX2V2ZW50LA0KICAgIGRpdm9yY2VkX3RyYW5zaXRpb24sDQogICAgbW92ZV9ldmVudCwNCiAgICBtb3ZlX3RyYW5zaXRpb24sDQogICAgbmV3X211bmljaXBhbGl0eV9ldmVudCwNCiAgICBuZXdfbXVuaWNpcGFsaXR5X3RyYW5zaXRpb24sDQogICAgbmV3X3Jlc2lkZW5jZV9ldmVudCwNCiAgICBuZXdfcmVzaWRlbmNlX3RyYW5zaXRpb24sDQogICAgZmlyc3RfY2hpbGQsDQogICAgZmlyc3RfY2hpbGRfZXZlbnQsDQogICAgZmlyc3RfY2hpbGRfdHJhbnNpdGlvbiwNCiAgICBlbXBsb3ltZW50X3N0YXR1cywNCiAgICBwYWlkX3dvcmssDQogICAgZW1wbG95bWVudCwNCiAgICBlbXBsb3ltZW50X2V2ZW50LA0KICAgIGVtcGxveW1lbnRfdHJhbnNpdGlvbiwNCiAgICByZXRpcmVkLA0KICAgIHJldGlyZWRfZXZlbnQsDQogICAgcmV0aXJlZF90cmFuc2l0aW9uLA0KICAgIHVuZW1wbG95bWVudCwNCiAgICB1bmVtcGxveWVkX2V2ZW50LA0KICAgIHVuZW1wbG95ZWRfdHJhbnNpdGlvbiwNCiAgICBkaXZvcmNlZF9ldmVudCwNCiAgICBkaXZvcmNlZF90cmFuc2l0aW9uLA0KICAgIGxvc3RfcGFydG5lciwNCiAgICBsb3N0X3BhcnRuZXJfZXZlbnQsDQogICAgbG9zdF9wYXJ0bmVyX3RyYW5zaXRpb24sDQogICAgZGl2b3JjZWRfc2VwZXJhdGVkDQogICkgJT4lDQogIGdyb3VwX2J5KHByb2Nlc3NfaWQpICU+JQ0KICBtdXRhdGUoZHJvcHBlZF9sZWFkID0gbGVhZChkcm9wcGVkKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShkcm9wcGVkX2xlYWQpKQ0KICANCmBgYA0KDQoNCiMgSW1wdXRhdGlvbiBvZiBtaXNzaW5nIHZhbHVlcw0KDQpEYXRhcHJlcC4gV2UgdXNlIG1lYW4gaW1wdXRhdGlvbiB0byBpbXB1dGUgbnVtZXJpYyBtaXNzaW5nIHZhbHVlcy4gDQoNCiMjDQoNCmBgYHtyIHN1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnQgZmluYWwgZGF0YSBwcmVwIG5vbmtpbn0NCiNyZWNvZGUgZXJyb3IgaW4gZGF0YSBpbiB3aGljaCBOQSBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkIGFzIDAuDQpub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudCA8LSBub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudCAlPiUgDQogIG11dGF0ZShtb3ZlX2V2ZW50ID0gaWZlbHNlKGlzLm5hKG1vdmVfZXZlbnQpICYgIWlzLm5hKG5ld19yZXNpZGVuY2VfZXZlbnQpLDAsIG1vdmVfZXZlbnQpLA0KICAgICAgICAgbmV3X211bmljaXBhbGl0eV9ldmVudCA9IGlmZWxzZShpcy5uYShtb3ZlX2V2ZW50KSAmICFpcy5uYShuZXdfcmVzaWRlbmNlX2V2ZW50KSwwLG5ld19tdW5pY2lwYWxpdHlfZXZlbnQpKQ0KDQojY3JlYXRlIGltcHV0YXRpb24gZHVtbWllcyBmb3IgZGl2b3JjZSwgY2hpbGQsIG1vdmUgdHJhbnNpdGlvbnMNCm5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50IDwtIG5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50ICU+JSANCiAgbXV0YXRlKGZpcnN0X2NoaWxkX2V2ZW50X21pc3NpbmcgPSBpZl9lbHNlKGlzLm5hKGZpcnN0X2NoaWxkX2V2ZW50KSwgMSwgMCksDQogICAgICAgICBkaXZvcmNlZF9ldmVudF9taXNzaW5nID0gaWZfZWxzZShpcy5uYShkaXZvcmNlZF9ldmVudCksIDEsIDApLA0KICAgICAgICAgbW92ZV9ldmVudF9taXNzaW5nID0gaWZfZWxzZShpcy5uYShtb3ZlX2V2ZW50KSwgMSwgMCksDQogICAgICAgICBuZXdfbXVuaWNpcGFsaXR5X2V2ZW50X21pc3NpbmcgPSBpZl9lbHNlKGlzLm5hKG5ld19tdW5pY2lwYWxpdHlfZXZlbnQpLCAxLCAwKSwNCiAgICAgICAgIG5ld19yZXNpZGVuY2VfZXZlbnRfbWlzc2luZyA9IGlmX2Vsc2UoaXMubmEobW92ZV9ldmVudCksIDEsIDApLA0KICAgICAgICAgZW1wbG95bWVudF9ldmVudF9taXNzaW5nID0gaWZfZWxzZShpcy5uYShlbXBsb3ltZW50X2V2ZW50KSwgMSwgMCksDQogICAgICAgICB1bmVtcGxveWVkX2V2ZW50X21pc3NpbmcgPSBpZl9lbHNlKGlzLm5hKHVuZW1wbG95ZWRfZXZlbnQpLCAxLCAwKSwNCiAgICAgICAgIGxvc3RfcGFydG5lcl9ldmVudF9taXNzaW5nID0gaWZfZWxzZShpcy5uYShsb3N0X3BhcnRuZXJfZXZlbnQpLCAxLCAwKSwNCiAgICAgICAgIHJldGlyZWRfZXZlbnRfbWlzc2luZyA9IGlmX2Vsc2UoaXMubmEocmV0aXJlZF9ldmVudCksIDEsIDApKQ0KDQoNCiNzZXQgc2VlZCBmb3IgaW1wDQpzZXQuc2VlZCgxMjMpDQoNCiNtZWFuIGltcHV0YXRpb24oZm9yIG5vdykNCiNpbXB1dGUgdGhlIG51bWVyaWMgdmFyaWFibGVzDQpub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudF9udW1lcmljIDwtDQogIG5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50ICU+JQ0KICBzZWxlY3QoDQogICAgZWR1Y19lZ28sDQogICAgbGVlZnRpamQsDQogICAgYWdlX3NxLA0KICAgIGVkdWNfYWx0ZXIsDQogICAgYWdlX2FsdGVyLA0KICAgIGR5YWRfZWR1Y19zaW0sDQogICAgZHlhZF9nZW5kZXJfc2ltLA0KICAgIGR5YWRfYWdlX3NpbSwNCiAgICBkeWFkX2V0aG5pY2l0eV9zaW0sDQogICAgbmV0X2VkdWMsDQogICAgbmV0X2RlbnNpdHksDQogICAgc2l6ZSwNCiAgICBuZXRfYWdlLA0KICAgIG5ldF9nZW5kZXIsDQogICAgZGVncmVlX25vcm1hbGl6ZWQsDQogICAgZGVncmVlLA0KICAgIHN0YXJ0c193aXRoKCJhdmVhbHRlciIpLA0KICAgIHN0YXJ0c193aXRoKCJlaV8iKSwNCiAgICBzdGFydHNfd2l0aCgiYXZzaW0iKSwNCiAgICBkaXZvcmNlZF9ldmVudCwNCiAgICBkaXZvcmNlZF90cmFuc2l0aW9uLA0KICAgIG1vdmVfZXZlbnQsDQogICAgbW92ZV90cmFuc2l0aW9uLA0KICAgIG5ld19tdW5pY2lwYWxpdHlfZXZlbnQsDQogICAgbmV3X211bmljaXBhbGl0eV90cmFuc2l0aW9uLA0KICAgIG5ld19yZXNpZGVuY2VfZXZlbnQsDQogICAgbmV3X3Jlc2lkZW5jZV90cmFuc2l0aW9uLA0KICAgIGZpcnN0X2NoaWxkX3RyYW5zaXRpb24sDQogICAgZW1wbG95bWVudF9ldmVudCwNCiAgICBlbXBsb3ltZW50X3RyYW5zaXRpb24sDQogICAgdW5lbXBsb3llZF9ldmVudCwNCiAgICB1bmVtcGxveWVkX3RyYW5zaXRpb24sDQogICAgbG9zdF9wYXJ0bmVyX2V2ZW50LA0KICAgIGxvc3RfcGFydG5lcl90cmFuc2l0aW9uLA0KICAgIHJldGlyZWRfZXZlbnQsDQogICAgcmV0aXJlZF90cmFuc2l0aW9uDQogICkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+IGFzLm51bWVyaWMoLikpKQ0KDQojaW1wdXRlIHdpdGggTWljZQ0Kbm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnRfbnVtZXJpY19pbXB1dGVkIDwtIG1pY2Uobm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnRfbnVtZXJpYywgbWV0aG9kID0gIm1lYW4iLCBtID0gMSwgbWF4aXQgPSAxKQ0KDQojc2VsZWN0aW9uIG9mIG5vbiBudW1lcmljIHZhcmlhYmxlcy4gDQpub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudCA8LSBub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudCAlPiUNCiAgc2VsZWN0KG5vbWVtX2VuY3IsDQogICAgICAgICBwcm9jZXNzX2lkLA0KICAgICAgICAgZHlhZF9pZCwNCiAgICAgICAgIHRpbWUsDQogICAgICAgICBkcm9wcGVkX2xlYWQsDQogICAgICAgIGdlbmRlcl9mYWMsIA0KICAgICAgICBkaXZvcmNlZF9mYWMsIA0KICAgICAgICBtb3ZpbmdfZmFjLA0KICAgICAgICBnZW5kZXJfYWx0ZXJfZmFjLA0KICAgICAgICBkZWFyX2FsdGVyX3JlYywNCiAgICAgICAgcmVsX2FsdGVyX3JlYywNCiAgICAgICAgdGltZXNfZHJvcHBlZF9lYXJsaWVyLA0KICAgICAgICBjZW5zb3IsDQogICAgICAgIGxlbmd0aCwNCiAgICAgICAgbGVuZ3RoX3JlbF9tZW1iZXIsDQogICAgICAgIGxlbmd0aF9yZWxfdG90YWwsDQogICAgICAgIG9yaWdpbl9yZWNfbmFyLA0KICAgICAgICBvcmlnaW5fcmVjX25hcl9mYWMsDQogICAgICAgIG9yaWdpbl9hbHRlcl9yZWMsDQogICAgICAgIG9yaWdpbl9hbHRlcl9yZWNfZmFjLA0KICAgICAgICBzdXJ2ZXlfd2F2ZSwNCiAgICAgICAgZmlyc3RfY2hpbGQsDQogICAgICAgIGZpcnN0X2NoaWxkX2V2ZW50X21pc3NpbmcsDQogICAgICAgIGRpdm9yY2VkX2V2ZW50X21pc3NpbmcsDQogICAgICAgIG1vdmVfZXZlbnRfbWlzc2luZywNCiAgICAgICAgbmV3X211bmljaXBhbGl0eV9ldmVudF9taXNzaW5nLA0KICAgICAgICBuZXdfcmVzaWRlbmNlX2V2ZW50X21pc3NpbmcsDQogICAgICAgIGVtcGxveW1lbnRfZXZlbnRfbWlzc2luZywNCiAgICAgICAgZW1wbG95bWVudF9zdGF0dXMsDQogICAgICAgIGVtcGxveW1lbnQsDQogICAgICAgIHVuZW1wbG95bWVudCwNCiAgICAgICAgcmV0aXJlZCwNCiAgICAgICAgbG9zdF9wYXJ0bmVyLA0KICAgICAgICB1bmVtcGxveWVkX2V2ZW50X21pc3NpbmcsDQogICAgICAgIHJldGlyZWRfZXZlbnRfbWlzc2luZywNCiAgICAgICAgbG9zdF9wYXJ0bmVyX2V2ZW50X21pc3NpbmcsDQogICAgICAgIHBhaWRfd29yaw0KICAgICAgICApICU+JSANCiAgbXV0YXRlKHBhaWRfd29ya19mYWMgPSBpZmVsc2UoaXMubmEocGFpZF93b3JrKSwgMiwgcGFpZF93b3JrKSwNCiAgICAgICAgIHBhaWRfd29ya19mYWMgPSBmYWN0b3IoDQogICAgICAgICAgIHBhaWRfd29yaywNCiAgICAgICAgICAgbGV2ZWxzID0gMDoyLA0KICAgICAgICAgICBsYWJlbHMgPSBjKA0KICAgICAgICAgICAgICJObyBwYWlkIHdvcmsiLA0KICAgICAgICAgICAgICJQYWlkIHdvcmsiLA0KICAgICAgICAgICAgICJNaXNzaW5nIikNCiAgICAgICAgICAgKSwNCiAgICAgICAgIGVtcGxveW1lbnRfc3RhdHVzX2ZhYyA9IGlmZWxzZSgNCiAgICAgICAgICAgaXMubmEoZW1wbG95bWVudF9zdGF0dXMpLA0KICAgICAgICAgICA4LA0KICAgICAgICAgICBhcy5udW1lcmljKGVtcGxveW1lbnRfc3RhdHVzKQ0KICAgICAgICAgICApLA0KICAgICAgICAgZW1wbG95bWVudF9zdGF0dXNfZmFjID0gZmFjdG9yKA0KICAgICAgICAgICBlbXBsb3ltZW50X3N0YXR1c19mYWMsDQogICAgICAgICAgIGxldmVscyA9IDE6OCwNCiAgICAgICAgICAgbGFiZWxzID0gYygNCiAgICAgICAgICAgICAiZW1wbG95ZWQiLA0KICAgICAgICAgICAgICJzZWxmLWVtcGxveWVkIiwNCiAgICAgICAgICAgICAidW5lbXBsb3llZCIsDQogICAgICAgICAgICAgInN0dWRlbnQiLA0KICAgICAgICAgICAgICJob3VzZXdvcmsiLA0KICAgICAgICAgICAgICJyZXRpcmVkIiwNCiAgICAgICAgICAgICAib3RoZXIiLA0KICAgICAgICAgICAgICJtaXNzaW5nIg0KICAgICAgICAgICAgICkNCiAgICAgICAgICAgKSwNCiAgICAgICAgIGZpcnN0X2NoaWxkID0gaWZlbHNlKGlzLm5hKGZpcnN0X2NoaWxkKSwgMiwgZmlyc3RfY2hpbGQpLA0KICAgICAgICAgZmlyc3RfY2hpbGRfZmFjID0gZmFjdG9yKA0KICAgICAgICAgICBmaXJzdF9jaGlsZCwNCiAgICAgICAgICAgbGV2ZWxzID0gMDoyLA0KICAgICAgICAgICBsYWJlbHMgPSBjKCJObyBjaGFuZ2UiLCAiRmlyc3QgY2hpbGQgYm9ybiIsICJNaXNzaW5nIikNCiAgICAgICAgICksDQogICAgICAgICByZXRpcmVkID0gaWZlbHNlKGlzLm5hKHJldGlyZWQpLCAyLCByZXRpcmVkKSwNCiAgICAgICAgIHJldGlyZWRfZmFjID0gZmFjdG9yKA0KICAgICAgICAgICByZXRpcmVkLA0KICAgICAgICAgICBsZXZlbHMgPSAwOjIsDQogICAgICAgICAgIGxhYmVscyA9IGMoIk5vIGNoYW5nZSIsICJSZXRpcmVkIiwgIk1pc3NpbmciKQ0KICAgICAgICAgKSwNCiAgICAgICAgIGVtcGxveW1lbnQgPSBpZmVsc2UoaXMubmEoZW1wbG95bWVudCksIDIsIGVtcGxveW1lbnQpLA0KICAgICAgICAgZW1wbG95bWVudF9mYWMgPSBmYWN0b3IoDQogICAgICAgICAgIGVtcGxveW1lbnQsDQogICAgICAgICAgIGxldmVscyA9IDA6MiwNCiAgICAgICAgICAgbGFiZWxzID0gYygiTm8gY2hhbmdlIiwgIkVtcGxveWVkIiwgIk1pc3NpbmciKQ0KICAgICAgICAgKSwNCiAgICAgICAgIHVuZW1wbG95bWVudCA9IGlmZWxzZShpcy5uYSh1bmVtcGxveW1lbnQpLCAyLCB1bmVtcGxveW1lbnQpLA0KICAgICAgICAgdW5lbXBsb3ltZW50X2ZhYyA9IGZhY3RvcigNCiAgICAgICAgICAgdW5lbXBsb3ltZW50LA0KICAgICAgICAgICBsZXZlbHMgPSAwOjIsDQogICAgICAgICAgIGxhYmVscyA9IGMoIk5vIGNoYW5nZSIsICJFbXBsb3llZCIsICJNaXNzaW5nIikNCiAgICAgICAgICksDQogICAgICAgICBsb3N0X3BhcnRuZXIgPSBpZmVsc2UoaXMubmEobG9zdF9wYXJ0bmVyKSwgMiwgbG9zdF9wYXJ0bmVyKSwNCiAgICAgICAgIGxvc3RfcGFydG5lcl9mYWMgPSBmYWN0b3IoDQogICAgICAgICAgIGxvc3RfcGFydG5lciwNCiAgICAgICAgICAgbGV2ZWxzID0gMDoyLA0KICAgICAgICAgICBsYWJlbHMgPSBjKCJObyBjaGFuZ2UiLCAiTG9zdCBwYXJ0bmVyIiwgIk1pc3NpbmciKQ0KICAgICAgICAgKQ0KICAgICAgICAgKQ0KDQojYWRkIHRoZSBpbXB1dGVkIGRhdGENCm5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50X2ltcHV0ZWQgPC0gY2JpbmQobm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnQsIGNvbXBsZXRlKG5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50X251bWVyaWNfaW1wdXRlZCkpDQoNCiNjcmVhdGUgdGltZSB2YXJpYWJsZXMNCm5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50X2ltcHV0ZWQgPC0gbm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnRfaW1wdXRlZCAlPiUNCiAgbXV0YXRlKHRpbWVfMiA9IHRpbWUqdGltZSwNCiAgICAgICAgIHRpbWVfMyA9IHRpbWVeMywNCiAgICAgICAgIHRpbWVfNCA9IHRpbWVeNCwNCiAgICAgICAgIHRpbWVfNSA9IHRpbWVeNSwNCiAgICAgICAgIHRpbWVfNiA9IHRpbWVeNiwNCiAgICAgICAgIHRpbWVfNyA9IHRpbWVeNywNCiAgICAgICAgIHRpbWVfOCA9IHRpbWVeOCwNCiAgICAgICAgIHRpbWVfOSA9IHRpbWVeOSwNCiAgICAgICAgIHRpbWVfMTAgPSB0aW1lXjEwKQ0KDQojY3JlYXRlIGR1bW15IGZvciBuZXRzaXplIGlzIDEuIFRoZXNlIGhhdmUgbWlzc2luZ3Mgb24gdGhlIGF2ZV9hbHRlciB2YXJpYWJsZXMuIA0Kbm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnRfaW1wdXRlZCA8LSBub25raW5fc3Vydml2YWxfZGF0YV9sZWFkX2RlcGVuZGVudF9pbXB1dGVkICU+JSANCiAgbXV0YXRlKHNpemVfbmV0X29uZSA9IGlmZWxzZShzaXplID09IDEsIDEsIDApKQ0KDQoNCiNjZW50ZXIgYW5kIHNjYWxlIG51bWVyaWMNCm5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50X2ltcHV0ZWQgPC0gbm9ua2luX3N1cnZpdmFsX2RhdGFfbGVhZF9kZXBlbmRlbnRfaW1wdXRlZCAlPiUNCiAgbXV0YXRlKGVkdWNfZWdvX2NlbiA9IHNjYWxlKGVkdWNfZWdvKSwNCiAgICAgICAgIGFnZV9jZW4gPSBzY2FsZShsZWVmdGlqZCksDQogICAgICAgICBhZ2Vfc3FfY2VuID0gc2NhbGUoYWdlX3NxKSwNCiAgICAgICAgIGVkdWNfYWx0ZXJfY2VuID0gc2NhbGUoZWR1Y19hbHRlciksDQogICAgICAgICBhZ2VfYWx0ZXJfY2VuID0gc2NhbGUoYWdlX2FsdGVyKSwNCiAgICAgICAgIGR5YWRfZWR1Y19zaW1fY2VuID0gc2NhbGUoZHlhZF9lZHVjX3NpbSksDQogICAgICAgICBkeWFkX2FnZV9zaW1fY2VuID0gc2NhbGUoZHlhZF9hZ2Vfc2ltKSwNCiAgICAgICAgIGR5YWRfZ2VuZGVyX3NpbV9jZW4gPSBzY2FsZShkeWFkX2dlbmRlcl9zaW0pLA0KICAgICAgICAgZHlhZF9ldGhuaWNpdHlfc2ltX2NlbiA9IHNjYWxlKGR5YWRfZXRobmljaXR5X3NpbSksDQogICAgICAgICBuZXRfZGVuc2l0eV9jZW4gPSBzY2FsZShuZXRfZGVuc2l0eSksDQogICAgICAgICBuZXRfc2l6ZV9jZW4gPSBzY2FsZShzaXplKSwNCiAgICAgICAgIHRpbWVzX2Ryb3BwZWRfZWFybGllcl9jZW4gPSBzY2FsZSh0aW1lc19kcm9wcGVkX2VhcmxpZXIpLA0KICAgICAgICAgbGVuZ3RoX2ZhYyA9IGZhY3RvcihsZW5ndGgsIGxldmVscyA9IDE6MywgbGFiZWxzID0gYygiPCAzIHllYXJzIiwgIjMgLSA2IHllYXJzIiwgIj4gNiB5ZWFycyIpKQ0KICAgICAgICAgKQ0KDQoNCg0KYGBgDQoNCg0KYGBge3IgZXhwb3J0IG5vbmtpbn0NCiNzYXZlIHByZXBhcmVkIGRhdGEuDQpzYXZlKG5vbmtpbl9zdXJ2aXZhbF9kYXRhX2xlYWRfZGVwZW5kZW50X2ltcHV0ZWQsIGZpbGUgPSAiZGF0YWZpbGVzL2RhdGEtcHJvY2Vzc2VkL2Rpc2FnZ3JlZ2F0ZWRfZGF0YS8yMDIyLTA5LTIwX2R5YWQtc3Vydml2YWwtZGF0YS1pbXB1dGVkLnJkYSIpDQoNCmBgYA0KDQo=


Copyright © 2023 Jeroense Thijmen