This is an R Markdown
Notebook. When you execute code within the notebook, the results appear
beneath the code.
library(dplyr)
library(ggplot2)
install.packages("survey")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:
https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/seise/AppData/Local/R/win-library/4.2’
(as ‘lib’ is unspecified)
also installing the dependencies ‘DBI’, ‘mitools’
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.2/DBI_1.1.3.zip'
Content type 'application/zip' length 767082 bytes (749 KB)
downloaded 749 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.2/mitools_2.4.zip'
Content type 'application/zip' length 298587 bytes (291 KB)
downloaded 291 KB
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.2/survey_4.2-1.zip'
Content type 'application/zip' length 3198784 bytes (3.1 MB)
downloaded 3.1 MB
package ‘DBI’ successfully unpacked and MD5 sums checked
package ‘mitools’ successfully unpacked and MD5 sums checked
package ‘survey’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\seise\AppData\Local\Temp\RtmpIrH1dg\downloaded_packages
library(survey)
Warning: package ‘survey’ was built under R version 4.2.3Loading required package: grid
Loading required package: Matrix
Loading required package: survival
Attaching package: ‘survey’
The following object is masked from ‘package:graphics’:
dotchart
#import dataset csv
dataset<-use_this_July26_2023
dataset
NA
#number of research participants = 19,997
#name column variables for ease of use and understanding
dataset$Year -> year
dataset$RIAGENDR -> gender
dataset$RIDAGEYR -> age
dataset$INDFMPIR -> ratio_income_to_poverty_family
dataset$nhanes_drug_use_csv.DUQ200 -> mj_hashish_ever
dataset$nhanes_drug_use_csv.DUQ210 -> age_1st_mj
dataset$nhanes_drug_use_csv.DUQ213 -> age_start_reg_use_mj
dataset$nhanes_drug_use_csv.DUQ230 -> no_days_used_mj_in_last_month
dataset$nhanes_drug_use_csv.DUQ240 -> coc_her_meth_ever
dataset$nhanes_drug_use_csv.DUQ250 -> coc_ever
dataset$nhanes_drug_use_csv.DUQ260 -> age_1st_coc
dataset$nhanes_drug_use_csv.DUQ280 -> no_days_used_coc_in_last_month
dataset$nhanes_drug_use_csv.DUQ290 -> heroin_ever
dataset$nhanes_drug_use_csv.DUQ300 -> age_1st_her
dataset$nhanes_drug_use_csv.DUQ320 -> no_days_used_her_in_last_month
dataset$nhanes_drug_use_csv.DUQ330 -> meth_ever
dataset$nhanes_drug_use_csv.DUQ340 -> age_1st_meth
dataset$nhanes_drug_use_csv.DUQ360 -> no_days_used_meth_in_last_month
dataset$nhanes_drug_use_csv.DUQ370 -> needle_use_ever
#Survey weights
#Use "svydesign" to assign NHANES-recommended weights. We will use this new design variable "dataset_weighted" when obtaining descriptive statistics.
dataset_weighted <- svydesign(id = dataset$SDMVPSU,
strata = dataset$SDMVSTRA,
weights = dataset$WTINT2YR,
nest = TRUE,
data = dataset)
dataset_weighted
Stratified 1 - level Cluster Sampling design (with replacement)
With (122) clusters.
svydesign(id = dataset$SDMVPSU, strata = dataset$SDMVSTRA, weights = dataset$WTINT2YR,
nest = TRUE, data = dataset)
#Scatterplots_____________________________________________________________________________________
##Marijuana:
###Number of days participants reported using marijuana in last month plotted against their current age
#how many research participants reported using marijuana at least one day in the last 30 days?
19997-17836
[1] 2161
#2161 participants
ggplot(dataset, aes(x = age, y = no_days_used_mj_in_last_month)) +
geom_point()

Conclusion: There is not a clear relationship between current age and
number of days marijuana was used during the past month. Some 50-60 year
olds used marijuana nearly every day while others used marijuana less
frequently. This is true of younger participants as well. But what about
by gender?
ggplot(dataset, aes(x = age, y = no_days_used_mj_in_last_month, color = gender)) +
geom_point()

Hmm, there is still no evidence of a relationship between age and
number of days marijuana was used that varies by gender (1, red = male;
2, blue = female).
Maybe, instead of age, income to family ratio may be more interesting
to explore. I will substitute income to family ratio for age as the
x-axis.
ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_mj_in_last_month)) +
geom_point()

n = 19997-17997 = 2000 participants who had these data. Conclusion:
In this scatter plot, one can see that individuals with a smaller ratio
of income to family size tended to report greater number of days that
marijuana was used during the last month. This figure presents more
interesting information compared to the previous scatterplot (age vs #
days marijuana used during last month).
Does the relationship between income:family size and #days marijuana
used during last month vary by gender?
ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_mj_in_last_month, color = gender)) +
geom_point()

It looks like the relationship between income:family size and #days
marijuana used during last month are similar across males (1, red) and
females (2, blue).Let’s make sure these patterns are consistent across
cross-sectional time points.
ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_mj_in_last_month, color = gender)) +
geom_point() +
facet_wrap(year)

Yep, it looks like at each time point at which this data was
collected, similar patterns are seen: lower income:family size ratio is
related to self-report of more frequent use of marijuana during the past
month in males and females.
How about frequency of use? Let’s get some simple descriptives
grouped by gender.
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_mj_use_past_month_days <- summarise(dataset_by_gender, mean_mj_use_past_month_days = mean(nhanes_drug_use_csv.DUQ230, na.rm = TRUE))
mean_mj_use_past_month_days
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_age_1st_mj_use <- summarise(dataset_by_gender, mean_age_1stmj_use = mean(nhanes_drug_use_csv.DUQ210, na.rm = TRUE))
mean_age_1st_mj_use
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_age_reg_mj_use <- summarise(dataset_by_gender, mean_age_reg_mj_use = mean(nhanes_drug_use_csv.DUQ213, na.rm = TRUE))
mean_age_reg_mj_use
NA
Conclusion: On average, males self-reported they first used marijuana
at a younger age, started regular use at a younger age, and had higher
self-reported # days marijuana use during last month than that
self-reported by females.
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_mj_use_past_month_days <- summarise(dataset_by_gender, mean_mj_use_past_month_days = mean(dataset$nhanes_drug_use_csv.DUQ230, na.rm = TRUE))
mean_mj_use_past_month_days
svymean(~nhanes_drug_use_csv.DUQ230, na.rm = TRUE)
Error in .svycheck(design) :
argument "design" is missing, with no default
##Cocaine
###Number of days participants reported using cocaine in last month plotted against their current age
#how many research participants reported using cocaine at least one day in the last 30 days?
19997-19760
[1] 237
#2161 participants
ggplot(dataset, aes(x = age, y = no_days_used_coc_in_last_month)) +
geom_point()

Conclusion: Only 237 men and women reported using cocaine during the
past 30 days. The number of days cocaine was used is similar across all
ages.
Are there differences by gender?
ggplot(dataset, aes(x = age, y = no_days_used_coc_in_last_month, color = gender)) +
geom_point()

Conclusion: it looks like both males (1, red) and females (2, blue)
mostly tended to self-report using cocaine <15 days. Possibly males
self-reported using cocaine on more days than females.
Let’s look at the relationship between income:family size and cocaine
use self-reported during the last 30 days.
ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_coc_in_last_month)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_coc_in_last_month, color = gender)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_coc_in_last_month, color = gender)) +
geom_point() +
facet_wrap(year)

The pattern is similar at each time point, although the sample is
small.
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_coc_use_past_month_days <- summarise(dataset_by_gender, mean_coc_use_past_month_days = mean(nhanes_drug_use_csv.DUQ280, na.rm = TRUE))
mean_coc_use_past_month_days
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_age_1st_coc_use <- summarise(dataset_by_gender, mean_age_1st_coc_use = mean(nhanes_drug_use_csv.DUQ260, na.rm = TRUE))
mean_age_1st_coc_use
NA
NA
##Heroin
###Number of days participants reported using heroin in last month plotted against their current age
#how many research participants reported using heroin at least one day in the last 30 days?
19997-19959
[1] 38
#n = 38 participants
ggplot(dataset, aes(x = age, y = no_days_used_her_in_last_month)) +
geom_point()

ggplot(dataset, aes(x = age, y = no_days_used_her_in_last_month, color = gender)) +
geom_point()

NA
NA
NA
ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_her_in_last_month)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_her_in_last_month, color = gender)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_her_in_last_month, color = gender)) +
geom_point() +
facet_wrap(year)

dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_her_use_past_month_days <- summarise(dataset_by_gender, mean_her_use_past_month_days = mean(nhanes_drug_use_csv.DUQ320, na.rm = TRUE))
mean_her_use_past_month_days
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_age_1st_her_use <- summarise(dataset_by_gender, mean_age_1st_her_use = mean(nhanes_drug_use_csv.DUQ300, na.rm = TRUE))
mean_age_1st_her_use
##Methamphetamine
###Number of days participants reported using methamphetamine in last month plotted against their current age
#how many research participants reported using heroin at least one day in the last 30 days?
19997-19915
[1] 82
#n = 38 participants
ggplot(dataset, aes(x = age, y = no_days_used_meth_in_last_month)) +
geom_point()

ggplot(dataset, aes(x = age, y = no_days_used_meth_in_last_month, color = gender)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_meth_in_last_month)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_meth_in_last_month, color = gender)) +
geom_point()

ggplot(dataset, aes(x = ratio_income_to_poverty_family, y = no_days_used_meth_in_last_month, color = gender)) +
geom_point() +
facet_wrap(year)

dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_meth_use_past_month_days <- summarise(dataset_by_gender, mean_meth_use_past_month_days = mean(nhanes_drug_use_csv.DUQ360, na.rm = TRUE))
mean_meth_use_past_month_days
dataset_by_gender <- group_by(dataset, RIAGENDR)
mean_age_1st_meth_use <- summarise(dataset_by_gender, mean_age_1st_meth_use = mean(nhanes_drug_use_csv.DUQ340, na.rm = TRUE))
mean_age_1st_meth_use
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KYGBge3J9DQojZm9yIGRhdGEgd3JhbmdsaW5nOyBkcGx5cjo6c2VsZWN0LCBtdXRhdGUsIHNlbGVjdCwgcmVjb2RlDQpsaWJyYXJ5KGRwbHlyKSANCg0KI2ZvciBkYXRhIHZpc3VhbGl6YXRpb24gd2l0aCB2YXJpb3VzIHBsb3RzDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiNmb3IgdXNpbmcgc3VydmV5IHdlaWdodHM7IHN1cnZleTo6c3Z5ZGVzaWduLCBzdnltZWFuLCBzdnlnbG0NCmluc3RhbGwucGFja2FnZXMoInN1cnZleSIpDQpsaWJyYXJ5KHN1cnZleSkNCmBgYA0KYGBge3J9DQojaW1wb3J0IGRhdGFzZXQgY3N2DQpgYGANCg0KYGBge3J9DQpkYXRhc2V0PC11c2VfdGhpc19KdWx5MjZfMjAyMw0KDQpkYXRhc2V0DQoNCmBgYA0KI251bWJlciBvZiByZXNlYXJjaCBwYXJ0aWNpcGFudHMgPSAxOSw5OTcNCg0KYGBge3J9DQojbmFtZSBjb2x1bW4gdmFyaWFibGVzIGZvciBlYXNlIG9mIHVzZSBhbmQgdW5kZXJzdGFuZGluZw0KZGF0YXNldCRZZWFyIC0+IHllYXINCmRhdGFzZXQkUklBR0VORFIgLT4gZ2VuZGVyDQpkYXRhc2V0JFJJREFHRVlSIC0+IGFnZQ0KZGF0YXNldCRJTkRGTVBJUiAtPiByYXRpb19pbmNvbWVfdG9fcG92ZXJ0eV9mYW1pbHkNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyMDAgLT4gbWpfaGFzaGlzaF9ldmVyDQpkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMjEwIC0+IGFnZV8xc3RfbWoNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyMTMgLT4gYWdlX3N0YXJ0X3JlZ191c2VfbWoNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyMzAgLT4gbm9fZGF5c191c2VkX21qX2luX2xhc3RfbW9udGgNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyNDAgLT4gY29jX2hlcl9tZXRoX2V2ZXINCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyNTAgLT4gY29jX2V2ZXINCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyNjAgLT4gYWdlXzFzdF9jb2MNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyODAgLT4gbm9fZGF5c191c2VkX2NvY19pbl9sYXN0X21vbnRoDQpkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMjkwIC0+IGhlcm9pbl9ldmVyDQpkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMzAwIC0+IGFnZV8xc3RfaGVyDQpkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMzIwIC0+IG5vX2RheXNfdXNlZF9oZXJfaW5fbGFzdF9tb250aA0KZGF0YXNldCRuaGFuZXNfZHJ1Z191c2VfY3N2LkRVUTMzMCAtPiBtZXRoX2V2ZXINCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzNDAgLT4gYWdlXzFzdF9tZXRoDQpkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMzYwIC0+IG5vX2RheXNfdXNlZF9tZXRoX2luX2xhc3RfbW9udGgNCmRhdGFzZXQkbmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzNzAgLT4gbmVlZGxlX3VzZV9ldmVyDQpgYGANCg0KYGBge3J9DQojU3VydmV5IHdlaWdodHMNCg0KI1VzZSAic3Z5ZGVzaWduIiB0byBhc3NpZ24gTkhBTkVTLXJlY29tbWVuZGVkIHdlaWdodHMuIFdlIHdpbGwgdXNlIHRoaXMgbmV3IGRlc2lnbiB2YXJpYWJsZSAiZGF0YXNldF93ZWlnaHRlZCIgd2hlbiBvYnRhaW5pbmcgZGVzY3JpcHRpdmUgc3RhdGlzdGljcy4NCg0KZGF0YXNldF93ZWlnaHRlZCA8LSBzdnlkZXNpZ24oaWQgPSBkYXRhc2V0JFNETVZQU1UsDQogICAgICAgICAgICAgICAgICAgICBzdHJhdGEgPSBkYXRhc2V0JFNETVZTVFJBLA0KICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IGRhdGFzZXQkV1RJTlQyWVIsDQogICAgICAgICAgICAgICAgICAgICBuZXN0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhc2V0KQ0KDQpkYXRhc2V0X3dlaWdodGVkDQpgYGANCg0KDQpgYGB7cn0NCiNTY2F0dGVycGxvdHNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQoNCiMjTWFyaWp1YW5hOg0KDQojIyNOdW1iZXIgb2YgZGF5cyBwYXJ0aWNpcGFudHMgcmVwb3J0ZWQgdXNpbmcgbWFyaWp1YW5hIGluIGxhc3QgbW9udGggcGxvdHRlZCBhZ2FpbnN0IHRoZWlyIGN1cnJlbnQgYWdlDQoNCiNob3cgbWFueSByZXNlYXJjaCBwYXJ0aWNpcGFudHMgcmVwb3J0ZWQgdXNpbmcgbWFyaWp1YW5hIGF0IGxlYXN0IG9uZSBkYXkgaW4gdGhlIGxhc3QgMzAgZGF5cz8NCjE5OTk3LTE3ODM2DQojMjE2MSBwYXJ0aWNpcGFudHMgDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IGFnZSwgeSA9IG5vX2RheXNfdXNlZF9tal9pbl9sYXN0X21vbnRoKSkgKyANCiAgZ2VvbV9wb2ludCgpDQpgYGANCkNvbmNsdXNpb246IFRoZXJlIGlzIG5vdCBhIGNsZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGN1cnJlbnQgYWdlIGFuZCBudW1iZXIgb2YgZGF5cyBtYXJpanVhbmEgd2FzIHVzZWQgZHVyaW5nIHRoZSBwYXN0IG1vbnRoLiBTb21lIDUwLTYwIHllYXIgb2xkcyB1c2VkIG1hcmlqdWFuYSBuZWFybHkgZXZlcnkgZGF5IHdoaWxlIG90aGVycyB1c2VkIG1hcmlqdWFuYSBsZXNzIGZyZXF1ZW50bHkuIFRoaXMgaXMgdHJ1ZSBvZiB5b3VuZ2VyIHBhcnRpY2lwYW50cyBhcyB3ZWxsLiBCdXQgd2hhdCBhYm91dCBieSBnZW5kZXI/DQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gYWdlLCB5ID0gbm9fZGF5c191c2VkX21qX2luX2xhc3RfbW9udGgsIGNvbG9yID0gZ2VuZGVyKSkgKyANCiAgZ2VvbV9wb2ludCgpDQpgYGANCkhtbSwgdGhlcmUgaXMgc3RpbGwgbm8gZXZpZGVuY2Ugb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhZ2UgYW5kIG51bWJlciBvZiBkYXlzIG1hcmlqdWFuYSB3YXMgdXNlZCB0aGF0IHZhcmllcyBieSBnZW5kZXIgKDEsIHJlZCA9IG1hbGU7IDIsIGJsdWUgPSBmZW1hbGUpLg0KDQpNYXliZSwgaW5zdGVhZCBvZiBhZ2UsIGluY29tZSB0byBmYW1pbHkgcmF0aW8gbWF5IGJlIG1vcmUgaW50ZXJlc3RpbmcgdG8gZXhwbG9yZS4gSSB3aWxsIHN1YnN0aXR1dGUgaW5jb21lIHRvIGZhbWlseSByYXRpbyBmb3IgYWdlIGFzIHRoZSB4LWF4aXMuDQpgYGB7cn0NCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9tal9pbl9sYXN0X21vbnRoKSkgKyANCiAgZ2VvbV9wb2ludCgpDQpgYGANCm4gPSAxOTk5Ny0xNzk5NyA9IDIwMDAgcGFydGljaXBhbnRzIHdobyBoYWQgdGhlc2UgZGF0YS4NCkNvbmNsdXNpb246IEluIHRoaXMgc2NhdHRlciBwbG90LCBvbmUgY2FuIHNlZSB0aGF0IGluZGl2aWR1YWxzIHdpdGggYSBzbWFsbGVyIHJhdGlvIG9mIGluY29tZSB0byBmYW1pbHkgc2l6ZSB0ZW5kZWQgdG8gcmVwb3J0IGdyZWF0ZXIgbnVtYmVyIG9mIGRheXMgdGhhdCBtYXJpanVhbmEgd2FzIHVzZWQgZHVyaW5nIHRoZSBsYXN0IG1vbnRoLiBUaGlzIGZpZ3VyZSBwcmVzZW50cyBtb3JlIGludGVyZXN0aW5nIGluZm9ybWF0aW9uIGNvbXBhcmVkIHRvIHRoZSBwcmV2aW91cyBzY2F0dGVycGxvdCAoYWdlIHZzICMgZGF5cyBtYXJpanVhbmEgdXNlZCBkdXJpbmcgbGFzdCBtb250aCkuDQoNCkRvZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGluY29tZTpmYW1pbHkgc2l6ZSBhbmQgI2RheXMgbWFyaWp1YW5hIHVzZWQgZHVyaW5nIGxhc3QgbW9udGggdmFyeSBieSBnZW5kZXI/DQpgYGB7cn0NCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9tal9pbl9sYXN0X21vbnRoLCBjb2xvciA9IGdlbmRlcikpICsgDQogIGdlb21fcG9pbnQoKQ0KYGBgDQpJdCBsb29rcyBsaWtlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNvbWU6ZmFtaWx5IHNpemUgYW5kICNkYXlzIG1hcmlqdWFuYSB1c2VkIGR1cmluZyBsYXN0IG1vbnRoIGFyZSBzaW1pbGFyIGFjcm9zcyBtYWxlcyAoMSwgcmVkKSBhbmQgZmVtYWxlcyAoMiwgYmx1ZSkuTGV0J3MgbWFrZSBzdXJlIHRoZXNlIHBhdHRlcm5zIGFyZSBjb25zaXN0ZW50IGFjcm9zcyBjcm9zcy1zZWN0aW9uYWwgdGltZSBwb2ludHMuDQpgYGB7cn0NCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9tal9pbl9sYXN0X21vbnRoLCBjb2xvciA9IGdlbmRlcikpICsgDQogIGdlb21fcG9pbnQoKSArDQogIGZhY2V0X3dyYXAoeWVhcikNCmBgYA0KWWVwLCBpdCBsb29rcyBsaWtlIGF0IGVhY2ggdGltZSBwb2ludCBhdCB3aGljaCB0aGlzIGRhdGEgd2FzIGNvbGxlY3RlZCwgc2ltaWxhciBwYXR0ZXJucyBhcmUgc2VlbjogbG93ZXIgaW5jb21lOmZhbWlseSBzaXplIHJhdGlvIGlzIHJlbGF0ZWQgdG8gc2VsZi1yZXBvcnQgb2YgbW9yZSBmcmVxdWVudCB1c2Ugb2YgbWFyaWp1YW5hIGR1cmluZyB0aGUgcGFzdCBtb250aCBpbiBtYWxlcyBhbmQgZmVtYWxlcy4NCg0KSG93IGFib3V0IGZyZXF1ZW5jeSBvZiB1c2U/IExldCdzIGdldCBzb21lIHNpbXBsZSBkZXNjcmlwdGl2ZXMgZ3JvdXBlZCBieSBnZW5kZXIuDQoNCmBgYHtyfQ0KDQoNCmRhdGFzZXRfYnlfZ2VuZGVyIDwtIGdyb3VwX2J5KGRhdGFzZXQsIFJJQUdFTkRSKQ0KbWVhbl9tal91c2VfcGFzdF9tb250aF9kYXlzIDwtIHN1bW1hcmlzZShkYXRhc2V0X2J5X2dlbmRlciwgbWVhbl9tal91c2VfcGFzdF9tb250aF9kYXlzID0gbWVhbihuaGFuZXNfZHJ1Z191c2VfY3N2LkRVUTIzMCwgbmEucm0gPSBUUlVFKSkNCm1lYW5fbWpfdXNlX3Bhc3RfbW9udGhfZGF5cw0KDQpkYXRhc2V0X2J5X2dlbmRlciA8LSBncm91cF9ieShkYXRhc2V0LCBSSUFHRU5EUikNCm1lYW5fYWdlXzFzdF9tal91c2UgPC0gc3VtbWFyaXNlKGRhdGFzZXRfYnlfZ2VuZGVyLCBtZWFuX2FnZV8xc3Rtal91c2UgPSBtZWFuKG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMjEwLCBuYS5ybSA9IFRSVUUpKQ0KbWVhbl9hZ2VfMXN0X21qX3VzZQ0KDQpkYXRhc2V0X2J5X2dlbmRlciA8LSBncm91cF9ieShkYXRhc2V0LCBSSUFHRU5EUikNCm1lYW5fYWdlX3JlZ19tal91c2UgPC0gc3VtbWFyaXNlKGRhdGFzZXRfYnlfZ2VuZGVyLCBtZWFuX2FnZV9yZWdfbWpfdXNlID0gbWVhbihuaGFuZXNfZHJ1Z191c2VfY3N2LkRVUTIxMywgbmEucm0gPSBUUlVFKSkNCm1lYW5fYWdlX3JlZ19tal91c2UNCg0KYGBgDQpDb25jbHVzaW9uOiBPbiBhdmVyYWdlLCBtYWxlcyBzZWxmLXJlcG9ydGVkIHRoZXkgZmlyc3QgdXNlZCBtYXJpanVhbmEgYXQgYSB5b3VuZ2VyIGFnZSwgc3RhcnRlZCByZWd1bGFyIHVzZSBhdCBhIHlvdW5nZXIgYWdlLCBhbmQgaGFkIGhpZ2hlciBzZWxmLXJlcG9ydGVkICMgZGF5cyBtYXJpanVhbmEgdXNlIGR1cmluZyBsYXN0IG1vbnRoIHRoYW4gdGhhdCBzZWxmLXJlcG9ydGVkIGJ5IGZlbWFsZXMuDQpgYGB7cn0NCmRhdGFzZXRfYnlfZ2VuZGVyIDwtIGdyb3VwX2J5KGRhdGFzZXQsIFJJQUdFTkRSKQ0KbWVhbl9tal91c2VfcGFzdF9tb250aF9kYXlzIDwtIHN1bW1hcmlzZShkYXRhc2V0X2J5X2dlbmRlciwgbWVhbl9tal91c2VfcGFzdF9tb250aF9kYXlzID0gbWVhbihkYXRhc2V0JG5oYW5lc19kcnVnX3VzZV9jc3YuRFVRMjMwLCBuYS5ybSA9IFRSVUUpKQ0KbWVhbl9tal91c2VfcGFzdF9tb250aF9kYXlzDQpgYGANCmBgYHtyfQ0Kc3Z5bWVhbih+bmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEyMzAsIG5hLnJtID0gVFJVRSkNCg0KDQpgYGANCg0KYGBge3J9DQojI0NvY2FpbmUNCg0KIyMjTnVtYmVyIG9mIGRheXMgcGFydGljaXBhbnRzIHJlcG9ydGVkIHVzaW5nIGNvY2FpbmUgaW4gbGFzdCBtb250aCBwbG90dGVkIGFnYWluc3QgdGhlaXIgY3VycmVudCBhZ2UNCg0KI2hvdyBtYW55IHJlc2VhcmNoIHBhcnRpY2lwYW50cyByZXBvcnRlZCB1c2luZyBjb2NhaW5lIGF0IGxlYXN0IG9uZSBkYXkgaW4gdGhlIGxhc3QgMzAgZGF5cz8NCjE5OTk3LTE5NzYwDQojbiA9IDIzNyBwYXJ0aWNpcGFudHMgDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IGFnZSwgeSA9IG5vX2RheXNfdXNlZF9jb2NfaW5fbGFzdF9tb250aCkpICsgDQogIGdlb21fcG9pbnQoKQ0KYGBgDQpDb25jbHVzaW9uOiBPbmx5IDIzNyBtZW4gYW5kIHdvbWVuIHJlcG9ydGVkIHVzaW5nIGNvY2FpbmUgZHVyaW5nIHRoZSBwYXN0IDMwIGRheXMuIFRoZSBudW1iZXIgb2YgZGF5cyBjb2NhaW5lIHdhcyB1c2VkIGlzIHNpbWlsYXIgYWNyb3NzIGFsbCBhZ2VzLg0KDQpBcmUgdGhlcmUgZGlmZmVyZW5jZXMgYnkgZ2VuZGVyPw0KDQpgYGB7cn0NCg0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gYWdlLCB5ID0gbm9fZGF5c191c2VkX2NvY19pbl9sYXN0X21vbnRoLCBjb2xvciA9IGdlbmRlcikpICsgDQogIGdlb21fcG9pbnQoKQ0KYGBgDQpDb25jbHVzaW9uOiBpdCBsb29rcyBsaWtlIGJvdGggbWFsZXMgKDEsIHJlZCkgYW5kIGZlbWFsZXMgKDIsIGJsdWUpIG1vc3RseSB0ZW5kZWQgdG8gc2VsZi1yZXBvcnQgdXNpbmcgY29jYWluZSA8MTUgZGF5cy4gUG9zc2libHkgbWFsZXMgc2VsZi1yZXBvcnRlZCB1c2luZyBjb2NhaW5lIG9uIG1vcmUgZGF5cyB0aGFuIGZlbWFsZXMuIA0KDQpMZXQncyBsb29rIGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNvbWU6ZmFtaWx5IHNpemUgYW5kIGNvY2FpbmUgdXNlIHNlbGYtcmVwb3J0ZWQgZHVyaW5nIHRoZSBsYXN0IDMwIGRheXMuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gcmF0aW9faW5jb21lX3RvX3BvdmVydHlfZmFtaWx5LCB5ID0gbm9fZGF5c191c2VkX2NvY19pbl9sYXN0X21vbnRoKSkgKyANCiAgZ2VvbV9wb2ludCgpDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9jb2NfaW5fbGFzdF9tb250aCwgY29sb3IgPSBnZW5kZXIpKSArIA0KICBnZW9tX3BvaW50KCkNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZGF0YXNldCwgYWVzKHggPSByYXRpb19pbmNvbWVfdG9fcG92ZXJ0eV9mYW1pbHksIHkgPSBub19kYXlzX3VzZWRfY29jX2luX2xhc3RfbW9udGgsIGNvbG9yID0gZ2VuZGVyKSkgKyANCiAgZ2VvbV9wb2ludCgpICsNCiAgZmFjZXRfd3JhcCh5ZWFyKQ0KYGBgDQpUaGUgcGF0dGVybiBpcyBzaW1pbGFyIGF0IGVhY2ggdGltZSBwb2ludCwgYWx0aG91Z2ggdGhlIHNhbXBsZSBpcyBzbWFsbC4NCg0KYGBge3J9DQpkYXRhc2V0X2J5X2dlbmRlciA8LSBncm91cF9ieShkYXRhc2V0LCBSSUFHRU5EUikNCm1lYW5fY29jX3VzZV9wYXN0X21vbnRoX2RheXMgPC0gc3VtbWFyaXNlKGRhdGFzZXRfYnlfZ2VuZGVyLCBtZWFuX2NvY191c2VfcGFzdF9tb250aF9kYXlzID0gbWVhbihuaGFuZXNfZHJ1Z191c2VfY3N2LkRVUTI4MCwgbmEucm0gPSBUUlVFKSkNCm1lYW5fY29jX3VzZV9wYXN0X21vbnRoX2RheXMNCg0KZGF0YXNldF9ieV9nZW5kZXIgPC0gZ3JvdXBfYnkoZGF0YXNldCwgUklBR0VORFIpDQptZWFuX2FnZV8xc3RfY29jX3VzZSA8LSBzdW1tYXJpc2UoZGF0YXNldF9ieV9nZW5kZXIsIG1lYW5fYWdlXzFzdF9jb2NfdXNlID0gbWVhbihuaGFuZXNfZHJ1Z191c2VfY3N2LkRVUTI2MCwgbmEucm0gPSBUUlVFKSkNCm1lYW5fYWdlXzFzdF9jb2NfdXNlDQoNCg0KYGBgDQoNCmBgYHtyfQ0KIyNIZXJvaW4NCg0KIyMjTnVtYmVyIG9mIGRheXMgcGFydGljaXBhbnRzIHJlcG9ydGVkIHVzaW5nIGhlcm9pbiBpbiBsYXN0IG1vbnRoIHBsb3R0ZWQgYWdhaW5zdCB0aGVpciBjdXJyZW50IGFnZQ0KDQojaG93IG1hbnkgcmVzZWFyY2ggcGFydGljaXBhbnRzIHJlcG9ydGVkIHVzaW5nIGhlcm9pbiBhdCBsZWFzdCBvbmUgZGF5IGluIHRoZSBsYXN0IDMwIGRheXM/DQoxOTk5Ny0xOTk1OQ0KI24gPSAzOCBwYXJ0aWNpcGFudHMgDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IGFnZSwgeSA9IG5vX2RheXNfdXNlZF9oZXJfaW5fbGFzdF9tb250aCkpICsgDQogIGdlb21fcG9pbnQoKQ0KDQpnZ3Bsb3QoZGF0YXNldCwgYWVzKHggPSBhZ2UsIHkgPSBub19kYXlzX3VzZWRfaGVyX2luX2xhc3RfbW9udGgsIGNvbG9yID0gZ2VuZGVyKSkgKyANCiAgZ2VvbV9wb2ludCgpDQoNCg0KDQpgYGANCmBgYHtyfQ0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gcmF0aW9faW5jb21lX3RvX3BvdmVydHlfZmFtaWx5LCB5ID0gbm9fZGF5c191c2VkX2hlcl9pbl9sYXN0X21vbnRoKSkgKyANCiAgZ2VvbV9wb2ludCgpDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9oZXJfaW5fbGFzdF9tb250aCwgY29sb3IgPSBnZW5kZXIpKSArIA0KICBnZW9tX3BvaW50KCkNCg0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gcmF0aW9faW5jb21lX3RvX3BvdmVydHlfZmFtaWx5LCB5ID0gbm9fZGF5c191c2VkX2hlcl9pbl9sYXN0X21vbnRoLCBjb2xvciA9IGdlbmRlcikpICsgDQogIGdlb21fcG9pbnQoKSArDQogIGZhY2V0X3dyYXAoeWVhcikNCg0KYGBgDQoNCmBgYHtyfQ0KZGF0YXNldF9ieV9nZW5kZXIgPC0gZ3JvdXBfYnkoZGF0YXNldCwgUklBR0VORFIpDQptZWFuX2hlcl91c2VfcGFzdF9tb250aF9kYXlzIDwtIHN1bW1hcmlzZShkYXRhc2V0X2J5X2dlbmRlciwgbWVhbl9oZXJfdXNlX3Bhc3RfbW9udGhfZGF5cyA9IG1lYW4obmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzMjAsIG5hLnJtID0gVFJVRSkpDQptZWFuX2hlcl91c2VfcGFzdF9tb250aF9kYXlzDQoNCmRhdGFzZXRfYnlfZ2VuZGVyIDwtIGdyb3VwX2J5KGRhdGFzZXQsIFJJQUdFTkRSKQ0KbWVhbl9hZ2VfMXN0X2hlcl91c2UgPC0gc3VtbWFyaXNlKGRhdGFzZXRfYnlfZ2VuZGVyLCBtZWFuX2FnZV8xc3RfaGVyX3VzZSA9IG1lYW4obmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzMDAsIG5hLnJtID0gVFJVRSkpDQptZWFuX2FnZV8xc3RfaGVyX3VzZQ0KYGBgDQpgYGB7cn0NCg0KIyNNZXRoYW1waGV0YW1pbmUNCg0KIyMjTnVtYmVyIG9mIGRheXMgcGFydGljaXBhbnRzIHJlcG9ydGVkIHVzaW5nIG1ldGhhbXBoZXRhbWluZSBpbiBsYXN0IG1vbnRoIHBsb3R0ZWQgYWdhaW5zdCB0aGVpciBjdXJyZW50IGFnZQ0KDQojaG93IG1hbnkgcmVzZWFyY2ggcGFydGljaXBhbnRzIHJlcG9ydGVkIHVzaW5nIGhlcm9pbiBhdCBsZWFzdCBvbmUgZGF5IGluIHRoZSBsYXN0IDMwIGRheXM/DQoxOTk5Ny0xOTkxNQ0KI24gPSA4MiBwYXJ0aWNpcGFudHMgDQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IGFnZSwgeSA9IG5vX2RheXNfdXNlZF9tZXRoX2luX2xhc3RfbW9udGgpKSArIA0KICBnZW9tX3BvaW50KCkNCg0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gYWdlLCB5ID0gbm9fZGF5c191c2VkX21ldGhfaW5fbGFzdF9tb250aCwgY29sb3IgPSBnZW5kZXIpKSArIA0KICBnZW9tX3BvaW50KCkNCmBgYA0KYGBge3J9DQoNCmdncGxvdChkYXRhc2V0LCBhZXMoeCA9IHJhdGlvX2luY29tZV90b19wb3ZlcnR5X2ZhbWlseSwgeSA9IG5vX2RheXNfdXNlZF9tZXRoX2luX2xhc3RfbW9udGgpKSArIA0KICBnZW9tX3BvaW50KCkNCg0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gcmF0aW9faW5jb21lX3RvX3BvdmVydHlfZmFtaWx5LCB5ID0gbm9fZGF5c191c2VkX21ldGhfaW5fbGFzdF9tb250aCwgY29sb3IgPSBnZW5kZXIpKSArIA0KICBnZW9tX3BvaW50KCkNCg0KZ2dwbG90KGRhdGFzZXQsIGFlcyh4ID0gcmF0aW9faW5jb21lX3RvX3BvdmVydHlfZmFtaWx5LCB5ID0gbm9fZGF5c191c2VkX21ldGhfaW5fbGFzdF9tb250aCwgY29sb3IgPSBnZW5kZXIpKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBmYWNldF93cmFwKHllYXIpDQoNCmBgYA0KDQpgYGB7cn0NCmRhdGFzZXRfYnlfZ2VuZGVyIDwtIGdyb3VwX2J5KGRhdGFzZXQsIFJJQUdFTkRSKQ0KbWVhbl9tZXRoX3VzZV9wYXN0X21vbnRoX2RheXMgPC0gc3VtbWFyaXNlKGRhdGFzZXRfYnlfZ2VuZGVyLCBtZWFuX21ldGhfdXNlX3Bhc3RfbW9udGhfZGF5cyA9IG1lYW4obmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzNjAsIG5hLnJtID0gVFJVRSkpDQptZWFuX21ldGhfdXNlX3Bhc3RfbW9udGhfZGF5cw0KDQpkYXRhc2V0X2J5X2dlbmRlciA8LSBncm91cF9ieShkYXRhc2V0LCBSSUFHRU5EUikNCm1lYW5fYWdlXzFzdF9tZXRoX3VzZSA8LSBzdW1tYXJpc2UoZGF0YXNldF9ieV9nZW5kZXIsIG1lYW5fYWdlXzFzdF9tZXRoX3VzZSA9IG1lYW4obmhhbmVzX2RydWdfdXNlX2Nzdi5EVVEzNDAsIG5hLnJtID0gVFJVRSkpDQptZWFuX2FnZV8xc3RfbWV0aF91c2UNCmBgYA0KDQo=