This notebook shows how you can use Harmony to find the similarity matrix between two questionnaires.

The Harmony project is a data harmonisation project that uses Natural Language Processing to help researchers make better use of existing data from different studies by supporting them with the harmonisation of various measures and items used in different studies.

Harmony is a collaboration project between Ulster University, University College London, the Universidade Federal de Santa Maria, and Fast Data Science. Harmony is funded by Wellcome as part of the Wellcome Data Prize in Mental Health.

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

First let’s import Harmony. If you haven’t already, you need to install it with install.packages("harmonydata").

library(harmonydata)

Now we can create our instruments.

If you had everything in a PDF or Excel file, you could load the instruments directly from the file: instrument = load_instruments_from_file(path = "CBCL_GOASSESS.xlsx"). However in this example we will code everything directly in the notebook.

cbcl <- list(
instrument_name = "CBCL",
questions = list(
list(question_no = "CBCL_1", question_text="Acts too young for his/her age"),
list(question_no = "CBCL_2", question_text="Drinks alcohol without parents' approval"),
list(question_no = "CBCL_3", question_text="Argues a lot"),
list(question_no = "CBCL_4", question_text="Fails to finish things he/she starts"),
list(question_no = "CBCL_5", question_text="There is very little he/she enjoys"),
list(question_no = "CBCL_6", question_text="Bowel movements outside toilet"),
list(question_no = "CBCL_7", question_text="Bragging, boasting"),
list(question_no = "CBCL_8", question_text="Can't concentrate, can't pay attention for long"),
list(question_no = "CBCL_9", question_text="Can't get his/her mind off certain thoughts; obsessions"),
list(question_no = "CBCL_10", question_text="Can't sit still, restless or hyperactive"),
list(question_no = "CBCL_11", question_text="Clings to adults or too dependent"),
list(question_no = "CBCL_12", question_text="Complains of loneliness"),
list(question_no = "CBCL_13", question_text="Confused or seems to be in a fog"),
list(question_no = "CBCL_14", question_text="Cries a lot"),
list(question_no = "CBCL_15", question_text="Cruel to animals"),
list(question_no = "CBCL_16", question_text="Cruelty, bullying, or meanness to others"),
list(question_no = "CBCL_17", question_text="Daydreams or gets lost in his/her thoughts"),
list(question_no = "CBCL_18", question_text="Deliberately harms self or attempts suicide"),
list(question_no = "CBCL_19", question_text="Demands a lot of attention"),
list(question_no = "CBCL_20", question_text="Destroys his/her own things"),
list(question_no = "CBCL_21", question_text="Destroys things belonging to his/her family or others"),
list(question_no = "CBCL_22", question_text="Disobedient at home"),
list(question_no = "CBCL_23", question_text="Disobedient at school"),
list(question_no = "CBCL_24", question_text="Doesn't eat well"),
list(question_no = "CBCL_25", question_text="Doesn't get along well with other kids"),
list(question_no = "CBCL_26", question_text="Doesn't seem to feel guilty after misbehaving"),
list(question_no = "CBCL_27", question_text="Easily jealous"),
list(question_no = "CBCL_28", question_text="Breaks rules at home, school, or elsewhere"),
list(question_no = "CBCL_29", question_text="Fears certain animals, situations, or places, other than school"),
list(question_no = "CBCL_30", question_text="Fears going to school"),
list(question_no = "CBCL_31", question_text="Fears he/she might think or do something bad"),
list(question_no = "CBCL_32", question_text="Feels he/she has to be perfect"),
list(question_no = "CBCL_33", question_text="Feels or complains that no one loves him/her"),
list(question_no = "CBCL_34", question_text="Feels others are out to get him/her"),
list(question_no = "CBCL_35", question_text="Feels worthless or inferior"),
list(question_no = "CBCL_36", question_text="Gets hurt a lot, accident-prone"),
list(question_no = "CBCL_37", question_text="Gets in many fights"),
list(question_no = "CBCL_38", question_text="Gets teased a lot"),
list(question_no = "CBCL_39", question_text="Hangs around with others who get in trouble"),
list(question_no = "CBCL_40", question_text="Hears sounds or voices that aren't there"),
list(question_no = "CBCL_41", question_text="Impulsive or acts without thinking"),
list(question_no = "CBCL_42", question_text="Would rather be alone than with others"),
list(question_no = "CBCL_43", question_text="Lying or cheating"),
list(question_no = "CBCL_44", question_text="Bites fingernails"),
list(question_no = "CBCL_45", question_text="Nervous, highstrung, or tense"),
list(question_no = "CBCL_46", question_text="Nervous movements or twitching"),
list(question_no = "CBCL_47", question_text="Nightmares"),
list(question_no = "CBCL_48", question_text="Not liked by other kids"),
list(question_no = "CBCL_49", question_text="Constipated, doesn't move bowels"),
list(question_no = "CBCL_50", question_text="Too fearful or anxious"),
list(question_no = "CBCL_51", question_text="Feels dizzy or lightheaded"),
list(question_no = "CBCL_52", question_text="Feels too guilty"),
list(question_no = "CBCL_53", question_text="Overeating"),
list(question_no = "CBCL_54", question_text="Overtired without good reason"),
list(question_no = "CBCL_55", question_text="Overweight"),
list(question_no = "CBCL_56A", question_text="Aches or pains (not stomach or headaches)"),
list(question_no = "CBCL_56B", question_text="Headaches"),
list(question_no = "CBCL_56C", question_text="Nausea, feels sick"),
list(question_no = "CBCL_56D", question_text="Problems with eyes (not if corrected by glasses"),
list(question_no = "CBCL_56E", question_text="Rashes or other skin problems"),
list(question_no = "CBCL_56F", question_text="Stomachaches"),
list(question_no = "CBCL_56G", question_text="Vomiting, throwing up"),
list(question_no = "CBCL_56H", question_text="Other"),
list(question_no = "CBCL_57", question_text="Physically attacks people"),
list(question_no = "CBCL_58", question_text="Picks nose, skin, or other parts of body"),
list(question_no = "CBCL_59", question_text="Plays with own sex parts in public"),
list(question_no = "CBCL_60", question_text="Plays with own sex parts too much"),
list(question_no = "CBCL_61", question_text="Poor school work"),
list(question_no = "CBCL_62", question_text="Poorly coordinated or clumsy"),
list(question_no = "CBCL_63", question_text="Prefers being with older kids"),
list(question_no = "CBCL_64", question_text="Prefers being with younger kids"),
list(question_no = "CBCL_65", question_text="Refuses to talk"),
list(question_no = "CBCL_66", question_text="Repeats certain acts over and over; compulsions "),
list(question_no = "CBCL_67", question_text="Runs away from home"),
list(question_no = "CBCL_68", question_text="Screams a lot"),
list(question_no = "CBCL_69", question_text="Secretive, keeps things to self"),
list(question_no = "CBCL_70", question_text="Sees things that aren't there"),
list(question_no = "CBCL_71", question_text="Self-conscious or easily embarrassed"),
list(question_no = "CBCL_72", question_text="Sets fires"),
list(question_no = "CBCL_73", question_text="Sexual problems"),
list(question_no = "CBCL_74", question_text="Showing off or clowning"),
list(question_no = "CBCL_75", question_text="Too shy or timid"),
list(question_no = "CBCL_76", question_text="Sleeps less than most kids"),
list(question_no = "CBCL_77", question_text="Sleeps more than most kids during day and/or night"),
list(question_no = "CBCL_78", question_text="Inattentive or easily distracted"),
list(question_no = "CBCL_79", question_text="Speech problem"),
list(question_no = "CBCL_80", question_text="Stares blankly "),
list(question_no = "CBCL_81", question_text="Steals at home"),
list(question_no = "CBCL_82", question_text="Steals outside the home"),
list(question_no = "CBCL_83", question_text="Stores up too many things he/she doesn't need"),
list(question_no = "CBCL_84", question_text="Strange behavior"),
list(question_no = "CBCL_85", question_text="Strange ideas"),
list(question_no = "CBCL_86", question_text="Stubborn, sullen, or irritable"),
list(question_no = "CBCL_87", question_text="Sudden changes in mood or feelings"),
list(question_no = "CBCL_88", question_text="Sulks a lot"),
list(question_no = "CBCL_89", question_text="Suspicious"),
list(question_no = "CBCL_90", question_text="Swearing or obscene language"),
list(question_no = "CBCL_91", question_text="Talks about killing self"),
list(question_no = "CBCL_92", question_text="Talks or walks in sleep"),
list(question_no = "CBCL_93", question_text="Talks too much"),
list(question_no = "CBCL_94", question_text="Teases a lot"),
list(question_no = "CBCL_95", question_text="Temper tantrums or hot temper"),
list(question_no = "CBCL_96", question_text="Thinks about sex too much"),
list(question_no = "CBCL_97", question_text="Threatens people"),
list(question_no = "CBCL_98", question_text="Thumb-sucking"),
list(question_no = "CBCL_99", question_text="Smokes, chews, or sniffs tobacco"),
list(question_no = "CBCL_100", question_text="Trouble sleeping "),
list(question_no = "CBCL_101", question_text="Truancy, skips school"),
list(question_no = "CBCL_102", question_text="Underactive, slow moving, or lacks energy"),
list(question_no = "CBCL_103", question_text="Unhappy, sad, or depressed"),
list(question_no = "CBCL_104", question_text="Unusually loud"),
list(question_no = "CBCL_105", question_text="Uses drugs for nonmedical purposes (don't include alcohol or tobacco)"),
list(question_no = "CBCL_106", question_text="Vandalism"),
list(question_no = "CBCL_107", question_text="Wets self during the day"),
list(question_no = "CBCL_108", question_text="Wets the bed"),
list(question_no = "CBCL_109", question_text="Whining"),
list(question_no = "CBCL_110", question_text="Wishes to be of opposite sex"),
list(question_no = "CBCL_111", question_text="Withdrawn, doesn't get inolved with others"),
list(question_no = "CBCL_112", question_text="Worries")
)
)

Let’s create an object for the GOASSESS:

goassess <- list(
instrument_name = "GOASSESS",
questions = list(
list(question_no = "ADD011", question_text="have trouble paying attention on activities that you were doing"),
list(question_no = "ADD012", question_text="have problems following instructions or finishing things you meant to get done"),
list(question_no = "ADD013", question_text="dislike avoid or put off school or homework"),
list(question_no = "ADD014", question_text="make careless mistakes in school work or other activities"),
list(question_no = "ADD015", question_text="have trouble making plans doing things that had a lot of different steps"),
list(question_no = "ADD016", question_text="been told that you did not seem to be listening when they spoke to you "),
list(question_no = "ADD020", question_text="have difficulty sitting still for more than a few minutes at a time"),
list(question_no = "ADD021", question_text="interrupt people abruptly"),
list(question_no = "ADD022", question_text="have trouble waiting your turn"),
list(question_no = "AGR001", question_text="afraid of being in crowds "),
list(question_no = "AGR002", question_text="afraid of being in public places"),
list(question_no = "AGR003", question_text="afraid of being in an open field"),
list(question_no = "AGR004", question_text="afraid of going over bridges or through tunnels"),
list(question_no = "AGR005", question_text="afraid of traveling by yourself"),
list(question_no = "AGR006", question_text="afraid of traveling away from home"),
list(question_no = "AGR007", question_text="afraid of traveling in a car"),
list(question_no = "AGR008", question_text="afraid of using public transportation"),
list(question_no = "CDD001", question_text="got into trouble with adults like lying or stealing"),
list(question_no = "CDD002", question_text="skip school stay out later than you were supposed to or run away from home overnight"),
list(question_no = "CDD003", question_text="set fires break into cars or destroy someone else's property on purpose"),
list(question_no = "CDD004", question_text="have been on probation"),
list(question_no = "CDD005", question_text="often bully others"),
list(question_no = "CDD006", question_text="been physically cruel to an animal or person "),
list(question_no = "CDD007", question_text="try to hurt someone with a weapon"),
list(question_no = "CDD008", question_text="threaten someone"),
list(question_no = "DEP001", question_text="you felt sad or depressed most of the time"),
list(question_no = "DEP002", question_text="cried a lot or felt like crying"),
list(question_no = "DEP004", question_text="felt grouchy irritable or in a bad mood most of the time"),
list(question_no = "DEP006", question_text="nothing was fun for you and you just weren't interested in anything"),
list(question_no = "GAD001", question_text="Have been a worrier"),
list(question_no = "GAD002", question_text="worry a lot more than most people your age"),
list(question_no = "MAN001", question_text="were much more active excited or energetic than usual"),
list(question_no = "MAN002", question_text="felt so full of energy that you couldn't stop doing things"),
list(question_no = "MAN003", question_text="felt like you hardly needed sleep"),
list(question_no = "MAN004", question_text="racing thoughts or pressured speech"),
list(question_no = "MAN005", question_text="you felt much more happy than usual when there was nothing special going on"),
list(question_no = "MAN006", question_text="you felt like you could do almost anything"),
list(question_no = "MAN007", question_text="you felt unusually grouchy cranky or irritable"),
list(question_no = "OCD001", question_text="bothered by thoughts such as concern with harming others/self"),
list(question_no = "OCD002", question_text="bothered by thoughts such as pictures of violent things"),
list(question_no = "OCD003", question_text="bothered by thoughts such as thoughts about contamination/germs/illness"),
list(question_no = "OCD004", question_text="bothered by fear that you would do/say something bad without intending to"),
list(question_no = "OCD005", question_text="bothered by thoughts such as feelings that bad things that happened were your fault"),
list(question_no = "OCD006", question_text="bothered by thoughts such as forbidden/bad thoughts"),
list(question_no = "OCD007", question_text="bothered by thoughts such as need for symmetry/exactness"),
list(question_no = "OCD008", question_text="bothered by thoughts such as religious thoughts"),
list(question_no = "OCD011", question_text="repetitive cleaning or washing (for example your hands or house)"),
list(question_no = "OCD012", question_text="repretitive counting"),
list(question_no = "OCD013", question_text="repretitive checking (for example doors locks ovens)"),
list(question_no = "OCD014", question_text="repretitive etting dressed over and over again"),
list(question_no = "OCD015", question_text="repretitive going in and out a door over and over again"),
list(question_no = "OCD016", question_text="repretitive ordering or arranging things"),
list(question_no = "OCD017", question_text="repretitive doing things at bedtime arranging the pillows sheets or other things"),
list(question_no = "OCD018", question_text="you saved up so many things that they got in the way"),
list(question_no = "OCD019", question_text="you feel the need to do things just right"),
list(question_no = "ODD001", question_text="losing temper arguing with adults or being grouchy or irritable with them"),
list(question_no = "ODD002", question_text="breaking rules at home/school"),
list(question_no = "ODD003", question_text="annoying other people on purpose or blaming other people for your mistakes"),
list(question_no = "ODD005", question_text="getting even with other people by doing things to hurt them"),
list(question_no = "ODD006", question_text="irritable or grouchy or get angry because you thought that things were unfair"),
list(question_no = "PAN001", question_text="a panic attack"),
list(question_no = "PAN003", question_text="experienced a panic attack before"),
list(question_no = "PAN004", question_text="felt losing control something terrible was going to happen"),
list(question_no = "PHB001", question_text="afraid of animals or bugs like dogs snakes or spiders"),
list(question_no = "PHB002", question_text="afraid of being in really high palces like a roof or tall building"),
list(question_no = "PHB003", question_text="afraid of water or situations involving water such as a swimming pool lake or ocean"),
list(question_no = "PHB004", question_text="afraid of storms thunder or lightening"),
list(question_no = "PHB005", question_text="afraid of doctors needles or blood"),
list(question_no = "PHB006", question_text="afraid of closed spaces like elevators or closets"),
list(question_no = "PHB007", question_text="afraid of flying or airplanes"),
list(question_no = "PHB008", question_text="afraid of any other things or situations"),
list(question_no = "PSY001", question_text="heard voices when no one was there"),
list(question_no = "PSY029", question_text="have seen visions or seen things which other people could not see"),
list(question_no = "PSY050", question_text="smelled strange odors other people could not smell"),
list(question_no = "PSY060", question_text="strange feelings in your body like things were crawling on you"),
list(question_no = "PSY070", question_text="believed in things that most other people don't believe in"),
list(question_no = "PSY071", question_text="believed people being out to get you or controlling what you do or think"),
list(question_no = "PTD009", question_text="very upset by seeing a dead body or by seeing pictures of the dead body of somebody you knew well"),
list(question_no = "SCR001", question_text="sought mental health professional about your mood or behaviors"),
list(question_no = "SCR006", question_text="currently taking medication for emotions or behaviors"),
list(question_no = "SCR007", question_text="hospitalized because of problems with mood or behaviors"),
list(question_no = "SCR008", question_text="you or others  thought you needed psychiatric help"),
list(question_no = "SEP500", question_text="worries about  attachment figures and were very upset they were away"),
list(question_no = "SEP508", question_text="wanted to stay home or not leave without your attachment figures"),
list(question_no = "SEP509", question_text="very upset when finding out will be away from attachemnt figures"),
list(question_no = "SEP510", question_text="worried about something terrible preventing you from seeing attachment figures again"),
list(question_no = "SEP511", question_text="scared to be alone or  needed  attachment figure to stay while falling asleep"),
list(question_no = "SIP003", question_text="You have felt that there are odd or unusual things going on that I can't explain."),
list(question_no = "SIP004", question_text="I think that I might be able to predict the future."),
list(question_no = "SIP005", question_text="felt that something interrupting or controlling my thoughts feelings or action"),
list(question_no = "SIP006", question_text="doing something differently because of my superstitions."),
list(question_no = "SIP007", question_text="confused at times whether something may be real or may be just part of my imagination"),
list(question_no = "SIP008", question_text="other people can read my mind or that I can read others' minds"),
list(question_no = "SIP009", question_text="people may be planning to hurt me or even may be about to hurt me."),
list(question_no = "SIP010", question_text="I have special natural or supernatural gifts beyond my talents and natural strengths."),
list(question_no = "SIP011", question_text="my mind is \"playing tricks\" on me."),
list(question_no = "SIP012", question_text="heard sounds of people talking when there is no one near me."),
list(question_no = "SIP013", question_text="hear my own thoughts being said out loud."),
list(question_no = "SIP014", question_text="concerned that I might be \"going crazy.\""),
list(question_no = "SIP027", question_text="people tell you that they can't understand you"),
list(question_no = "SIP028", question_text="people ever seem to have difficulty understanding you"),
list(question_no = "SIP032", question_text="you feel a loss of sense of self or feel disconnected from yourself or your life"),
list(question_no = "SIP033", question_text="told that you are less emotional or connected to people than you used to be"),
list(question_no = "SIP038", question_text="Within the past 6 months you are having a harder time getting your work or schoolwork done"),
list(question_no = "SIP039", question_text="Within the past 6 months you are having a harder time getting normal activities done"),
list(question_no = "SOC001", question_text="really shy with people meeting new people going to parties or doing things in front of others"),
list(question_no = "SOC002", question_text="afraid of talking on the telephone or with people your own age who you don't know very well"),
list(question_no = "SOC003", question_text="afraid when you had to do something in front of a group of people like speaking in class"),
list(question_no = "SOC004", question_text="afraid of acting, giving a talk, playing a sport or doing a musical performance or taking an important test"),
list(question_no = "SOC005", question_text="afraid being the center of attention and were concerned something embarrassing might happen"),
list(question_no = "SUI001", question_text="you have thought a lot about death or dying"),
list(question_no = "SUI002", question_text="you have thought about killing yourself")
)
)

We can concatenate both objects together:

instruments_list <- list(cbcl, goassess)

Let’s call Harmony to calculate the match:

match = match_instruments(instruments_list)

Check what has come out of the match:

names(match)
[1] "questions"        "matches"          "query_similarity"

The first question is CBCL question 1.

match$questions[[1]]
$question_no
[1] "CBCL_1"

$question_intro
NULL

$question_text
[1] "Acts too young for his/her age"

$options
list()

$source_page
[1] 0

$instrument_id
[1] "1d7ecde218ae4629a2066236aab501ac"

$instrument_name
NULL

$topics_auto
$topics_auto[[1]]
[1] "antisocial personality disorder (aspd)"

$topics_auto[[2]]
[1] "emotional problems"

$topics_auto[[3]]
[1] "behavioural problems"


$nearest_match_from_mhc_auto
$nearest_match_from_mhc_auto$question_no
[1] "2"

$nearest_match_from_mhc_auto$question_intro
NULL

$nearest_match_from_mhc_auto$question_text
[1] "Acts younger than his/her age"

$nearest_match_from_mhc_auto$options
$nearest_match_from_mhc_auto$options[[1]]
[1] "Definitely agree"

$nearest_match_from_mhc_auto$options[[2]]
[1] "Slightly agree"

$nearest_match_from_mhc_auto$options[[3]]
[1] "Slightly disagree"

$nearest_match_from_mhc_auto$options[[4]]
[1] "Definitely disagree"


$nearest_match_from_mhc_auto$source_page
[1] 0

$nearest_match_from_mhc_auto$instrument_id
NULL

$nearest_match_from_mhc_auto$instrument_name
[1] "Relationships Problems Questionnaire (18-item) (RPQ)"

$nearest_match_from_mhc_auto$topics_auto
NULL

$nearest_match_from_mhc_auto$nearest_match_from_mhc_auto
NULL

The total number of questions are:

length(match$questions)
[1] 231

The first three entries in the match array are:

match$matches[[1]][c(1,2,3)]
[[1]]
[1] 1

[[2]]
[1] -0.2975802

[[3]]
[1] 0.2499672

Saving to CSV/Excel

Let’s convert to a dataframe so we can export to CSV:

df <- data.frame(match$matches[[1]])
for (x in 1:length(match$matches)) {
    df[x, ] = match$matches[[x]]
}

Set the row and column names to something human readable:

colnames(df) <- lapply(match$questions, function(x) paste(x$question_no,  x$question_text , sep=" ") )
rownames(df) <- lapply(match$questions, function(x) paste(x$question_no,  x$question_text , sep=" ") )

Now we can save to CSV:

write.csv(df, "matches.csv")
LS0tDQp0aXRsZTogIkhhcm1vbnkgd2Fsa3Rocm91Z2ggLSBSIGxpYnJhcnkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2hhcm1vbnlkYXRhL2JyYW5kL21haW4vTG9nby9QTkcvJUQwJUJCJUQwJUJFJUQwJUIzJUQwJUJFJTIwJUQxJTg0JUQxJTgzJUQwJUJCLTA1LnBuZykNCg0KVGhpcyBub3RlYm9vayBzaG93cyBob3cgeW91IGNhbiB1c2UgSGFybW9ueSB0byBmaW5kIHRoZSBzaW1pbGFyaXR5IG1hdHJpeCBiZXR3ZWVuIHR3byBxdWVzdGlvbm5haXJlcy4NCg0KVGhlIEhhcm1vbnkgcHJvamVjdCBpcyBhIGRhdGEgaGFybW9uaXNhdGlvbiBwcm9qZWN0IHRoYXQgdXNlcyBbTmF0dXJhbCBMYW5ndWFnZSBQcm9jZXNzaW5nXShodHRwczovL2Zhc3RkYXRhc2NpZW5jZS5jb20vZ3VpZGUtbmF0dXJhbC1sYW5ndWFnZS1wcm9jZXNzaW5nLW5scC8pIHRvIGhlbHAgcmVzZWFyY2hlcnMgbWFrZSBiZXR0ZXIgdXNlIG9mIGV4aXN0aW5nIGRhdGEgZnJvbSBkaWZmZXJlbnQgc3R1ZGllcyBieSBzdXBwb3J0aW5nIHRoZW0gd2l0aCB0aGUgaGFybW9uaXNhdGlvbiBvZiB2YXJpb3VzIG1lYXN1cmVzIGFuZCBpdGVtcyB1c2VkIGluIGRpZmZlcmVudCBzdHVkaWVzLg0KDQpIYXJtb255IGlzIGEgY29sbGFib3JhdGlvbiBwcm9qZWN0IGJldHdlZW4gW1Vsc3RlciBVbml2ZXJzaXR5XShodHRwczovL3Vsc3Rlci5hYy51ay8pLCBbVW5pdmVyc2l0eSBDb2xsZWdlIExvbmRvbl0oaHR0cHM6Ly91Y2wuYWMudWsvKSwgdGhlIFtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkZSBTYW50YSBNYXJpYV0oaHR0cHM6Ly93d3cudWZzbS5ici8pLCBhbmQgW0Zhc3QgRGF0YSBTY2llbmNlXShodHRwOi8vZmFzdGRhdGFzY2llbmNlLmNvbS8pLiAgSGFybW9ueSBpcyBmdW5kZWQgYnkgW1dlbGxjb21lXShodHRwczovL3dlbGxjb21lLm9yZy8pIGFzIHBhcnQgb2YgdGhlIFtXZWxsY29tZSBEYXRhIFByaXplIGluIE1lbnRhbCBIZWFsdGhdKGh0dHBzOi8vd2VsbGNvbWUub3JnL2dyYW50LWZ1bmRpbmcvc2NoZW1lcy93ZWxsY29tZS1tZW50YWwtaGVhbHRoLWRhdGEtcHJpemUpLg0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KRmlyc3QgbGV0J3MgaW1wb3J0IEhhcm1vbnkuIElmIHlvdSBoYXZlbid0IGFscmVhZHksIHlvdSBuZWVkIHRvIGluc3RhbGwgaXQgd2l0aCBgaW5zdGFsbC5wYWNrYWdlcygiaGFybW9ueWRhdGEiKWAuDQoNCmBgYHtyfQ0KbGlicmFyeShoYXJtb255ZGF0YSkNCmBgYA0KDQpOb3cgd2UgY2FuIGNyZWF0ZSBvdXIgaW5zdHJ1bWVudHMuDQoNCklmIHlvdSBoYWQgZXZlcnl0aGluZyBpbiBhIFBERiBvciBFeGNlbCBmaWxlLCB5b3UgY291bGQgbG9hZCB0aGUgaW5zdHJ1bWVudHMgZGlyZWN0bHkgZnJvbSB0aGUgZmlsZTogYGluc3RydW1lbnQgPSBsb2FkX2luc3RydW1lbnRzX2Zyb21fZmlsZShwYXRoID0gIkNCQ0xfR09BU1NFU1MueGxzeCIpYC4gSG93ZXZlciBpbiB0aGlzIGV4YW1wbGUgd2Ugd2lsbCBjb2RlIGV2ZXJ5dGhpbmcgZGlyZWN0bHkgaW4gdGhlIG5vdGVib29rLg0KDQpgYGB7cn0NCmNiY2wgPC0gbGlzdCgNCmluc3RydW1lbnRfbmFtZSA9ICJDQkNMIiwNCnF1ZXN0aW9ucyA9IGxpc3QoDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMSIsIHF1ZXN0aW9uX3RleHQ9IkFjdHMgdG9vIHlvdW5nIGZvciBoaXMvaGVyIGFnZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzIiLCBxdWVzdGlvbl90ZXh0PSJEcmlua3MgYWxjb2hvbCB3aXRob3V0IHBhcmVudHMnIGFwcHJvdmFsIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMyIsIHF1ZXN0aW9uX3RleHQ9IkFyZ3VlcyBhIGxvdCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzQiLCBxdWVzdGlvbl90ZXh0PSJGYWlscyB0byBmaW5pc2ggdGhpbmdzIGhlL3NoZSBzdGFydHMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF81IiwgcXVlc3Rpb25fdGV4dD0iVGhlcmUgaXMgdmVyeSBsaXR0bGUgaGUvc2hlIGVuam95cyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzYiLCBxdWVzdGlvbl90ZXh0PSJCb3dlbCBtb3ZlbWVudHMgb3V0c2lkZSB0b2lsZXQiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF83IiwgcXVlc3Rpb25fdGV4dD0iQnJhZ2dpbmcsIGJvYXN0aW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOCIsIHF1ZXN0aW9uX3RleHQ9IkNhbid0IGNvbmNlbnRyYXRlLCBjYW4ndCBwYXkgYXR0ZW50aW9uIGZvciBsb25nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOSIsIHF1ZXN0aW9uX3RleHQ9IkNhbid0IGdldCBoaXMvaGVyIG1pbmQgb2ZmIGNlcnRhaW4gdGhvdWdodHM7IG9ic2Vzc2lvbnMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMCIsIHF1ZXN0aW9uX3RleHQ9IkNhbid0IHNpdCBzdGlsbCwgcmVzdGxlc3Mgb3IgaHlwZXJhY3RpdmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMSIsIHF1ZXN0aW9uX3RleHQ9IkNsaW5ncyB0byBhZHVsdHMgb3IgdG9vIGRlcGVuZGVudCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzEyIiwgcXVlc3Rpb25fdGV4dD0iQ29tcGxhaW5zIG9mIGxvbmVsaW5lc3MiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMyIsIHF1ZXN0aW9uX3RleHQ9IkNvbmZ1c2VkIG9yIHNlZW1zIHRvIGJlIGluIGEgZm9nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTQiLCBxdWVzdGlvbl90ZXh0PSJDcmllcyBhIGxvdCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzE1IiwgcXVlc3Rpb25fdGV4dD0iQ3J1ZWwgdG8gYW5pbWFscyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzE2IiwgcXVlc3Rpb25fdGV4dD0iQ3J1ZWx0eSwgYnVsbHlpbmcsIG9yIG1lYW5uZXNzIHRvIG90aGVycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzE3IiwgcXVlc3Rpb25fdGV4dD0iRGF5ZHJlYW1zIG9yIGdldHMgbG9zdCBpbiBoaXMvaGVyIHRob3VnaHRzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTgiLCBxdWVzdGlvbl90ZXh0PSJEZWxpYmVyYXRlbHkgaGFybXMgc2VsZiBvciBhdHRlbXB0cyBzdWljaWRlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTkiLCBxdWVzdGlvbl90ZXh0PSJEZW1hbmRzIGEgbG90IG9mIGF0dGVudGlvbiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzIwIiwgcXVlc3Rpb25fdGV4dD0iRGVzdHJveXMgaGlzL2hlciBvd24gdGhpbmdzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMjEiLCBxdWVzdGlvbl90ZXh0PSJEZXN0cm95cyB0aGluZ3MgYmVsb25naW5nIHRvIGhpcy9oZXIgZmFtaWx5IG9yIG90aGVycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzIyIiwgcXVlc3Rpb25fdGV4dD0iRGlzb2JlZGllbnQgYXQgaG9tZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzIzIiwgcXVlc3Rpb25fdGV4dD0iRGlzb2JlZGllbnQgYXQgc2Nob29sIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMjQiLCBxdWVzdGlvbl90ZXh0PSJEb2Vzbid0IGVhdCB3ZWxsIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMjUiLCBxdWVzdGlvbl90ZXh0PSJEb2Vzbid0IGdldCBhbG9uZyB3ZWxsIHdpdGggb3RoZXIga2lkcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzI2IiwgcXVlc3Rpb25fdGV4dD0iRG9lc24ndCBzZWVtIHRvIGZlZWwgZ3VpbHR5IGFmdGVyIG1pc2JlaGF2aW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMjciLCBxdWVzdGlvbl90ZXh0PSJFYXNpbHkgamVhbG91cyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzI4IiwgcXVlc3Rpb25fdGV4dD0iQnJlYWtzIHJ1bGVzIGF0IGhvbWUsIHNjaG9vbCwgb3IgZWxzZXdoZXJlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMjkiLCBxdWVzdGlvbl90ZXh0PSJGZWFycyBjZXJ0YWluIGFuaW1hbHMsIHNpdHVhdGlvbnMsIG9yIHBsYWNlcywgb3RoZXIgdGhhbiBzY2hvb2wiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zMCIsIHF1ZXN0aW9uX3RleHQ9IkZlYXJzIGdvaW5nIHRvIHNjaG9vbCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzMxIiwgcXVlc3Rpb25fdGV4dD0iRmVhcnMgaGUvc2hlIG1pZ2h0IHRoaW5rIG9yIGRvIHNvbWV0aGluZyBiYWQiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zMiIsIHF1ZXN0aW9uX3RleHQ9IkZlZWxzIGhlL3NoZSBoYXMgdG8gYmUgcGVyZmVjdCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzMzIiwgcXVlc3Rpb25fdGV4dD0iRmVlbHMgb3IgY29tcGxhaW5zIHRoYXQgbm8gb25lIGxvdmVzIGhpbS9oZXIiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zNCIsIHF1ZXN0aW9uX3RleHQ9IkZlZWxzIG90aGVycyBhcmUgb3V0IHRvIGdldCBoaW0vaGVyIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMzUiLCBxdWVzdGlvbl90ZXh0PSJGZWVscyB3b3J0aGxlc3Mgb3IgaW5mZXJpb3IiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zNiIsIHF1ZXN0aW9uX3RleHQ9IkdldHMgaHVydCBhIGxvdCwgYWNjaWRlbnQtcHJvbmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zNyIsIHF1ZXN0aW9uX3RleHQ9IkdldHMgaW4gbWFueSBmaWdodHMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8zOCIsIHF1ZXN0aW9uX3RleHQ9IkdldHMgdGVhc2VkIGEgbG90IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMzkiLCBxdWVzdGlvbl90ZXh0PSJIYW5ncyBhcm91bmQgd2l0aCBvdGhlcnMgd2hvIGdldCBpbiB0cm91YmxlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDAiLCBxdWVzdGlvbl90ZXh0PSJIZWFycyBzb3VuZHMgb3Igdm9pY2VzIHRoYXQgYXJlbid0IHRoZXJlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDEiLCBxdWVzdGlvbl90ZXh0PSJJbXB1bHNpdmUgb3IgYWN0cyB3aXRob3V0IHRoaW5raW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDIiLCBxdWVzdGlvbl90ZXh0PSJXb3VsZCByYXRoZXIgYmUgYWxvbmUgdGhhbiB3aXRoIG90aGVycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzQzIiwgcXVlc3Rpb25fdGV4dD0iTHlpbmcgb3IgY2hlYXRpbmciKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF80NCIsIHF1ZXN0aW9uX3RleHQ9IkJpdGVzIGZpbmdlcm5haWxzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDUiLCBxdWVzdGlvbl90ZXh0PSJOZXJ2b3VzLCBoaWdoc3RydW5nLCBvciB0ZW5zZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzQ2IiwgcXVlc3Rpb25fdGV4dD0iTmVydm91cyBtb3ZlbWVudHMgb3IgdHdpdGNoaW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDciLCBxdWVzdGlvbl90ZXh0PSJOaWdodG1hcmVzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNDgiLCBxdWVzdGlvbl90ZXh0PSJOb3QgbGlrZWQgYnkgb3RoZXIga2lkcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzQ5IiwgcXVlc3Rpb25fdGV4dD0iQ29uc3RpcGF0ZWQsIGRvZXNuJ3QgbW92ZSBib3dlbHMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF81MCIsIHF1ZXN0aW9uX3RleHQ9IlRvbyBmZWFyZnVsIG9yIGFueGlvdXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF81MSIsIHF1ZXN0aW9uX3RleHQ9IkZlZWxzIGRpenp5IG9yIGxpZ2h0aGVhZGVkIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTIiLCBxdWVzdGlvbl90ZXh0PSJGZWVscyB0b28gZ3VpbHR5IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTMiLCBxdWVzdGlvbl90ZXh0PSJPdmVyZWF0aW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTQiLCBxdWVzdGlvbl90ZXh0PSJPdmVydGlyZWQgd2l0aG91dCBnb29kIHJlYXNvbiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzU1IiwgcXVlc3Rpb25fdGV4dD0iT3ZlcndlaWdodCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzU2QSIsIHF1ZXN0aW9uX3RleHQ9IkFjaGVzIG9yIHBhaW5zIChub3Qgc3RvbWFjaCBvciBoZWFkYWNoZXMpIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTZCIiwgcXVlc3Rpb25fdGV4dD0iSGVhZGFjaGVzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTZDIiwgcXVlc3Rpb25fdGV4dD0iTmF1c2VhLCBmZWVscyBzaWNrIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTZEIiwgcXVlc3Rpb25fdGV4dD0iUHJvYmxlbXMgd2l0aCBleWVzIChub3QgaWYgY29ycmVjdGVkIGJ5IGdsYXNzZXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF81NkUiLCBxdWVzdGlvbl90ZXh0PSJSYXNoZXMgb3Igb3RoZXIgc2tpbiBwcm9ibGVtcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzU2RiIsIHF1ZXN0aW9uX3RleHQ9IlN0b21hY2hhY2hlcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzU2RyIsIHF1ZXN0aW9uX3RleHQ9IlZvbWl0aW5nLCB0aHJvd2luZyB1cCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzU2SCIsIHF1ZXN0aW9uX3RleHQ9Ik90aGVyIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTciLCBxdWVzdGlvbl90ZXh0PSJQaHlzaWNhbGx5IGF0dGFja3MgcGVvcGxlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTgiLCBxdWVzdGlvbl90ZXh0PSJQaWNrcyBub3NlLCBza2luLCBvciBvdGhlciBwYXJ0cyBvZiBib2R5IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNTkiLCBxdWVzdGlvbl90ZXh0PSJQbGF5cyB3aXRoIG93biBzZXggcGFydHMgaW4gcHVibGljIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNjAiLCBxdWVzdGlvbl90ZXh0PSJQbGF5cyB3aXRoIG93biBzZXggcGFydHMgdG9vIG11Y2giKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF82MSIsIHF1ZXN0aW9uX3RleHQ9IlBvb3Igc2Nob29sIHdvcmsiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF82MiIsIHF1ZXN0aW9uX3RleHQ9IlBvb3JseSBjb29yZGluYXRlZCBvciBjbHVtc3kiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF82MyIsIHF1ZXN0aW9uX3RleHQ9IlByZWZlcnMgYmVpbmcgd2l0aCBvbGRlciBraWRzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNjQiLCBxdWVzdGlvbl90ZXh0PSJQcmVmZXJzIGJlaW5nIHdpdGggeW91bmdlciBraWRzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNjUiLCBxdWVzdGlvbl90ZXh0PSJSZWZ1c2VzIHRvIHRhbGsiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF82NiIsIHF1ZXN0aW9uX3RleHQ9IlJlcGVhdHMgY2VydGFpbiBhY3RzIG92ZXIgYW5kIG92ZXI7IGNvbXB1bHNpb25zICIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzY3IiwgcXVlc3Rpb25fdGV4dD0iUnVucyBhd2F5IGZyb20gaG9tZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzY4IiwgcXVlc3Rpb25fdGV4dD0iU2NyZWFtcyBhIGxvdCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzY5IiwgcXVlc3Rpb25fdGV4dD0iU2VjcmV0aXZlLCBrZWVwcyB0aGluZ3MgdG8gc2VsZiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzcwIiwgcXVlc3Rpb25fdGV4dD0iU2VlcyB0aGluZ3MgdGhhdCBhcmVuJ3QgdGhlcmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF83MSIsIHF1ZXN0aW9uX3RleHQ9IlNlbGYtY29uc2Npb3VzIG9yIGVhc2lseSBlbWJhcnJhc3NlZCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzcyIiwgcXVlc3Rpb25fdGV4dD0iU2V0cyBmaXJlcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzczIiwgcXVlc3Rpb25fdGV4dD0iU2V4dWFsIHByb2JsZW1zIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNzQiLCBxdWVzdGlvbl90ZXh0PSJTaG93aW5nIG9mZiBvciBjbG93bmluZyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzc1IiwgcXVlc3Rpb25fdGV4dD0iVG9vIHNoeSBvciB0aW1pZCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzc2IiwgcXVlc3Rpb25fdGV4dD0iU2xlZXBzIGxlc3MgdGhhbiBtb3N0IGtpZHMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF83NyIsIHF1ZXN0aW9uX3RleHQ9IlNsZWVwcyBtb3JlIHRoYW4gbW9zdCBraWRzIGR1cmluZyBkYXkgYW5kL29yIG5pZ2h0IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfNzgiLCBxdWVzdGlvbl90ZXh0PSJJbmF0dGVudGl2ZSBvciBlYXNpbHkgZGlzdHJhY3RlZCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzc5IiwgcXVlc3Rpb25fdGV4dD0iU3BlZWNoIHByb2JsZW0iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84MCIsIHF1ZXN0aW9uX3RleHQ9IlN0YXJlcyBibGFua2x5ICIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzgxIiwgcXVlc3Rpb25fdGV4dD0iU3RlYWxzIGF0IGhvbWUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84MiIsIHF1ZXN0aW9uX3RleHQ9IlN0ZWFscyBvdXRzaWRlIHRoZSBob21lIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfODMiLCBxdWVzdGlvbl90ZXh0PSJTdG9yZXMgdXAgdG9vIG1hbnkgdGhpbmdzIGhlL3NoZSBkb2Vzbid0IG5lZWQiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84NCIsIHF1ZXN0aW9uX3RleHQ9IlN0cmFuZ2UgYmVoYXZpb3IiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84NSIsIHF1ZXN0aW9uX3RleHQ9IlN0cmFuZ2UgaWRlYXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84NiIsIHF1ZXN0aW9uX3RleHQ9IlN0dWJib3JuLCBzdWxsZW4sIG9yIGlycml0YWJsZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzg3IiwgcXVlc3Rpb25fdGV4dD0iU3VkZGVuIGNoYW5nZXMgaW4gbW9vZCBvciBmZWVsaW5ncyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzg4IiwgcXVlc3Rpb25fdGV4dD0iU3Vsa3MgYSBsb3QiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF84OSIsIHF1ZXN0aW9uX3RleHQ9IlN1c3BpY2lvdXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF85MCIsIHF1ZXN0aW9uX3RleHQ9IlN3ZWFyaW5nIG9yIG9ic2NlbmUgbGFuZ3VhZ2UiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF85MSIsIHF1ZXN0aW9uX3RleHQ9IlRhbGtzIGFib3V0IGtpbGxpbmcgc2VsZiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzkyIiwgcXVlc3Rpb25fdGV4dD0iVGFsa3Mgb3Igd2Fsa3MgaW4gc2xlZXAiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF85MyIsIHF1ZXN0aW9uX3RleHQ9IlRhbGtzIHRvbyBtdWNoIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOTQiLCBxdWVzdGlvbl90ZXh0PSJUZWFzZXMgYSBsb3QiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF85NSIsIHF1ZXN0aW9uX3RleHQ9IlRlbXBlciB0YW50cnVtcyBvciBob3QgdGVtcGVyIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOTYiLCBxdWVzdGlvbl90ZXh0PSJUaGlua3MgYWJvdXQgc2V4IHRvbyBtdWNoIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOTciLCBxdWVzdGlvbl90ZXh0PSJUaHJlYXRlbnMgcGVvcGxlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOTgiLCBxdWVzdGlvbl90ZXh0PSJUaHVtYi1zdWNraW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfOTkiLCBxdWVzdGlvbl90ZXh0PSJTbW9rZXMsIGNoZXdzLCBvciBzbmlmZnMgdG9iYWNjbyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzEwMCIsIHF1ZXN0aW9uX3RleHQ9IlRyb3VibGUgc2xlZXBpbmcgIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTAxIiwgcXVlc3Rpb25fdGV4dD0iVHJ1YW5jeSwgc2tpcHMgc2Nob29sIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTAyIiwgcXVlc3Rpb25fdGV4dD0iVW5kZXJhY3RpdmUsIHNsb3cgbW92aW5nLCBvciBsYWNrcyBlbmVyZ3kiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMDMiLCBxdWVzdGlvbl90ZXh0PSJVbmhhcHB5LCBzYWQsIG9yIGRlcHJlc3NlZCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzEwNCIsIHF1ZXN0aW9uX3RleHQ9IlVudXN1YWxseSBsb3VkIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTA1IiwgcXVlc3Rpb25fdGV4dD0iVXNlcyBkcnVncyBmb3Igbm9ubWVkaWNhbCBwdXJwb3NlcyAoZG9uJ3QgaW5jbHVkZSBhbGNvaG9sIG9yIHRvYmFjY28pIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTA2IiwgcXVlc3Rpb25fdGV4dD0iVmFuZGFsaXNtIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTA3IiwgcXVlc3Rpb25fdGV4dD0iV2V0cyBzZWxmIGR1cmluZyB0aGUgZGF5IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTA4IiwgcXVlc3Rpb25fdGV4dD0iV2V0cyB0aGUgYmVkIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNCQ0xfMTA5IiwgcXVlc3Rpb25fdGV4dD0iV2hpbmluZyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDQkNMXzExMCIsIHF1ZXN0aW9uX3RleHQ9Ildpc2hlcyB0byBiZSBvZiBvcHBvc2l0ZSBzZXgiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMTEiLCBxdWVzdGlvbl90ZXh0PSJXaXRoZHJhd24sIGRvZXNuJ3QgZ2V0IGlub2x2ZWQgd2l0aCBvdGhlcnMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0JDTF8xMTIiLCBxdWVzdGlvbl90ZXh0PSJXb3JyaWVzIikNCikNCikNCmBgYA0KDQpMZXQncyBjcmVhdGUgYW4gb2JqZWN0IGZvciB0aGUgR09BU1NFU1M6DQoNCmBgYHtyfQ0KZ29hc3Nlc3MgPC0gbGlzdCgNCmluc3RydW1lbnRfbmFtZSA9ICJHT0FTU0VTUyIsDQpxdWVzdGlvbnMgPSBsaXN0KA0KbGlzdChxdWVzdGlvbl9ubyA9ICJBREQwMTEiLCBxdWVzdGlvbl90ZXh0PSJoYXZlIHRyb3VibGUgcGF5aW5nIGF0dGVudGlvbiBvbiBhY3Rpdml0aWVzIHRoYXQgeW91IHdlcmUgZG9pbmciKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQUREMDEyIiwgcXVlc3Rpb25fdGV4dD0iaGF2ZSBwcm9ibGVtcyBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIG9yIGZpbmlzaGluZyB0aGluZ3MgeW91IG1lYW50IHRvIGdldCBkb25lIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFERDAxMyIsIHF1ZXN0aW9uX3RleHQ9ImRpc2xpa2UgYXZvaWQgb3IgcHV0IG9mZiBzY2hvb2wgb3IgaG9tZXdvcmsiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQUREMDE0IiwgcXVlc3Rpb25fdGV4dD0ibWFrZSBjYXJlbGVzcyBtaXN0YWtlcyBpbiBzY2hvb2wgd29yayBvciBvdGhlciBhY3Rpdml0aWVzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFERDAxNSIsIHF1ZXN0aW9uX3RleHQ9ImhhdmUgdHJvdWJsZSBtYWtpbmcgcGxhbnMgZG9pbmcgdGhpbmdzIHRoYXQgaGFkIGEgbG90IG9mIGRpZmZlcmVudCBzdGVwcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJBREQwMTYiLCBxdWVzdGlvbl90ZXh0PSJiZWVuIHRvbGQgdGhhdCB5b3UgZGlkIG5vdCBzZWVtIHRvIGJlIGxpc3RlbmluZyB3aGVuIHRoZXkgc3Bva2UgdG8geW91ICIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJBREQwMjAiLCBxdWVzdGlvbl90ZXh0PSJoYXZlIGRpZmZpY3VsdHkgc2l0dGluZyBzdGlsbCBmb3IgbW9yZSB0aGFuIGEgZmV3IG1pbnV0ZXMgYXQgYSB0aW1lIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFERDAyMSIsIHF1ZXN0aW9uX3RleHQ9ImludGVycnVwdCBwZW9wbGUgYWJydXB0bHkiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQUREMDIyIiwgcXVlc3Rpb25fdGV4dD0iaGF2ZSB0cm91YmxlIHdhaXRpbmcgeW91ciB0dXJuIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwMSIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBiZWluZyBpbiBjcm93ZHMgIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwMiIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBiZWluZyBpbiBwdWJsaWMgcGxhY2VzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwMyIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBiZWluZyBpbiBhbiBvcGVuIGZpZWxkIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwNCIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBnb2luZyBvdmVyIGJyaWRnZXMgb3IgdGhyb3VnaCB0dW5uZWxzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwNSIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiB0cmF2ZWxpbmcgYnkgeW91cnNlbGYiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQUdSMDA2IiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIG9mIHRyYXZlbGluZyBhd2F5IGZyb20gaG9tZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJBR1IwMDciLCBxdWVzdGlvbl90ZXh0PSJhZnJhaWQgb2YgdHJhdmVsaW5nIGluIGEgY2FyIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkFHUjAwOCIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiB1c2luZyBwdWJsaWMgdHJhbnNwb3J0YXRpb24iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0REMDAxIiwgcXVlc3Rpb25fdGV4dD0iZ290IGludG8gdHJvdWJsZSB3aXRoIGFkdWx0cyBsaWtlIGx5aW5nIG9yIHN0ZWFsaW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNERDAwMiIsIHF1ZXN0aW9uX3RleHQ9InNraXAgc2Nob29sIHN0YXkgb3V0IGxhdGVyIHRoYW4geW91IHdlcmUgc3VwcG9zZWQgdG8gb3IgcnVuIGF3YXkgZnJvbSBob21lIG92ZXJuaWdodCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDREQwMDMiLCBxdWVzdGlvbl90ZXh0PSJzZXQgZmlyZXMgYnJlYWsgaW50byBjYXJzIG9yIGRlc3Ryb3kgc29tZW9uZSBlbHNlJ3MgcHJvcGVydHkgb24gcHVycG9zZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDREQwMDQiLCBxdWVzdGlvbl90ZXh0PSJoYXZlIGJlZW4gb24gcHJvYmF0aW9uIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNERDAwNSIsIHF1ZXN0aW9uX3RleHQ9Im9mdGVuIGJ1bGx5IG90aGVycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJDREQwMDYiLCBxdWVzdGlvbl90ZXh0PSJiZWVuIHBoeXNpY2FsbHkgY3J1ZWwgdG8gYW4gYW5pbWFsIG9yIHBlcnNvbiAiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiQ0REMDA3IiwgcXVlc3Rpb25fdGV4dD0idHJ5IHRvIGh1cnQgc29tZW9uZSB3aXRoIGEgd2VhcG9uIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkNERDAwOCIsIHF1ZXN0aW9uX3RleHQ9InRocmVhdGVuIHNvbWVvbmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiREVQMDAxIiwgcXVlc3Rpb25fdGV4dD0ieW91IGZlbHQgc2FkIG9yIGRlcHJlc3NlZCBtb3N0IG9mIHRoZSB0aW1lIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkRFUDAwMiIsIHF1ZXN0aW9uX3RleHQ9ImNyaWVkIGEgbG90IG9yIGZlbHQgbGlrZSBjcnlpbmciKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiREVQMDA0IiwgcXVlc3Rpb25fdGV4dD0iZmVsdCBncm91Y2h5IGlycml0YWJsZSBvciBpbiBhIGJhZCBtb29kIG1vc3Qgb2YgdGhlIHRpbWUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiREVQMDA2IiwgcXVlc3Rpb25fdGV4dD0ibm90aGluZyB3YXMgZnVuIGZvciB5b3UgYW5kIHlvdSBqdXN0IHdlcmVuJ3QgaW50ZXJlc3RlZCBpbiBhbnl0aGluZyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJHQUQwMDEiLCBxdWVzdGlvbl90ZXh0PSJIYXZlIGJlZW4gYSB3b3JyaWVyIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIkdBRDAwMiIsIHF1ZXN0aW9uX3RleHQ9IndvcnJ5IGEgbG90IG1vcmUgdGhhbiBtb3N0IHBlb3BsZSB5b3VyIGFnZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJNQU4wMDEiLCBxdWVzdGlvbl90ZXh0PSJ3ZXJlIG11Y2ggbW9yZSBhY3RpdmUgZXhjaXRlZCBvciBlbmVyZ2V0aWMgdGhhbiB1c3VhbCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJNQU4wMDIiLCBxdWVzdGlvbl90ZXh0PSJmZWx0IHNvIGZ1bGwgb2YgZW5lcmd5IHRoYXQgeW91IGNvdWxkbid0IHN0b3AgZG9pbmcgdGhpbmdzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk1BTjAwMyIsIHF1ZXN0aW9uX3RleHQ9ImZlbHQgbGlrZSB5b3UgaGFyZGx5IG5lZWRlZCBzbGVlcCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJNQU4wMDQiLCBxdWVzdGlvbl90ZXh0PSJyYWNpbmcgdGhvdWdodHMgb3IgcHJlc3N1cmVkIHNwZWVjaCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJNQU4wMDUiLCBxdWVzdGlvbl90ZXh0PSJ5b3UgZmVsdCBtdWNoIG1vcmUgaGFwcHkgdGhhbiB1c3VhbCB3aGVuIHRoZXJlIHdhcyBub3RoaW5nIHNwZWNpYWwgZ29pbmcgb24iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiTUFOMDA2IiwgcXVlc3Rpb25fdGV4dD0ieW91IGZlbHQgbGlrZSB5b3UgY291bGQgZG8gYWxtb3N0IGFueXRoaW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk1BTjAwNyIsIHF1ZXN0aW9uX3RleHQ9InlvdSBmZWx0IHVudXN1YWxseSBncm91Y2h5IGNyYW5reSBvciBpcnJpdGFibGUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDAxIiwgcXVlc3Rpb25fdGV4dD0iYm90aGVyZWQgYnkgdGhvdWdodHMgc3VjaCBhcyBjb25jZXJuIHdpdGggaGFybWluZyBvdGhlcnMvc2VsZiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJPQ0QwMDIiLCBxdWVzdGlvbl90ZXh0PSJib3RoZXJlZCBieSB0aG91Z2h0cyBzdWNoIGFzIHBpY3R1cmVzIG9mIHZpb2xlbnQgdGhpbmdzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAwMyIsIHF1ZXN0aW9uX3RleHQ9ImJvdGhlcmVkIGJ5IHRob3VnaHRzIHN1Y2ggYXMgdGhvdWdodHMgYWJvdXQgY29udGFtaW5hdGlvbi9nZXJtcy9pbGxuZXNzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAwNCIsIHF1ZXN0aW9uX3RleHQ9ImJvdGhlcmVkIGJ5IGZlYXIgdGhhdCB5b3Ugd291bGQgZG8vc2F5IHNvbWV0aGluZyBiYWQgd2l0aG91dCBpbnRlbmRpbmcgdG8iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDA1IiwgcXVlc3Rpb25fdGV4dD0iYm90aGVyZWQgYnkgdGhvdWdodHMgc3VjaCBhcyBmZWVsaW5ncyB0aGF0IGJhZCB0aGluZ3MgdGhhdCBoYXBwZW5lZCB3ZXJlIHlvdXIgZmF1bHQiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDA2IiwgcXVlc3Rpb25fdGV4dD0iYm90aGVyZWQgYnkgdGhvdWdodHMgc3VjaCBhcyBmb3JiaWRkZW4vYmFkIHRob3VnaHRzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAwNyIsIHF1ZXN0aW9uX3RleHQ9ImJvdGhlcmVkIGJ5IHRob3VnaHRzIHN1Y2ggYXMgbmVlZCBmb3Igc3ltbWV0cnkvZXhhY3RuZXNzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAwOCIsIHF1ZXN0aW9uX3RleHQ9ImJvdGhlcmVkIGJ5IHRob3VnaHRzIHN1Y2ggYXMgcmVsaWdpb3VzIHRob3VnaHRzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAxMSIsIHF1ZXN0aW9uX3RleHQ9InJlcGV0aXRpdmUgY2xlYW5pbmcgb3Igd2FzaGluZyAoZm9yIGV4YW1wbGUgeW91ciBoYW5kcyBvciBob3VzZSkiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDEyIiwgcXVlc3Rpb25fdGV4dD0icmVwcmV0aXRpdmUgY291bnRpbmciKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDEzIiwgcXVlc3Rpb25fdGV4dD0icmVwcmV0aXRpdmUgY2hlY2tpbmcgKGZvciBleGFtcGxlIGRvb3JzIGxvY2tzIG92ZW5zKSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJPQ0QwMTQiLCBxdWVzdGlvbl90ZXh0PSJyZXByZXRpdGl2ZSBldHRpbmcgZHJlc3NlZCBvdmVyIGFuZCBvdmVyIGFnYWluIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAxNSIsIHF1ZXN0aW9uX3RleHQ9InJlcHJldGl0aXZlIGdvaW5nIGluIGFuZCBvdXQgYSBkb29yIG92ZXIgYW5kIG92ZXIgYWdhaW4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0NEMDE2IiwgcXVlc3Rpb25fdGV4dD0icmVwcmV0aXRpdmUgb3JkZXJpbmcgb3IgYXJyYW5naW5nIHRoaW5ncyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJPQ0QwMTciLCBxdWVzdGlvbl90ZXh0PSJyZXByZXRpdGl2ZSBkb2luZyB0aGluZ3MgYXQgYmVkdGltZSBhcnJhbmdpbmcgdGhlIHBpbGxvd3Mgc2hlZXRzIG9yIG90aGVyIHRoaW5ncyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJPQ0QwMTgiLCBxdWVzdGlvbl90ZXh0PSJ5b3Ugc2F2ZWQgdXAgc28gbWFueSB0aGluZ3MgdGhhdCB0aGV5IGdvdCBpbiB0aGUgd2F5IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9DRDAxOSIsIHF1ZXN0aW9uX3RleHQ9InlvdSBmZWVsIHRoZSBuZWVkIHRvIGRvIHRoaW5ncyBqdXN0IHJpZ2h0IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIk9ERDAwMSIsIHF1ZXN0aW9uX3RleHQ9Imxvc2luZyB0ZW1wZXIgYXJndWluZyB3aXRoIGFkdWx0cyBvciBiZWluZyBncm91Y2h5IG9yIGlycml0YWJsZSB3aXRoIHRoZW0iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0REMDAyIiwgcXVlc3Rpb25fdGV4dD0iYnJlYWtpbmcgcnVsZXMgYXQgaG9tZS9zY2hvb2wiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0REMDAzIiwgcXVlc3Rpb25fdGV4dD0iYW5ub3lpbmcgb3RoZXIgcGVvcGxlIG9uIHB1cnBvc2Ugb3IgYmxhbWluZyBvdGhlciBwZW9wbGUgZm9yIHlvdXIgbWlzdGFrZXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0REMDA1IiwgcXVlc3Rpb25fdGV4dD0iZ2V0dGluZyBldmVuIHdpdGggb3RoZXIgcGVvcGxlIGJ5IGRvaW5nIHRoaW5ncyB0byBodXJ0IHRoZW0iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiT0REMDA2IiwgcXVlc3Rpb25fdGV4dD0iaXJyaXRhYmxlIG9yIGdyb3VjaHkgb3IgZ2V0IGFuZ3J5IGJlY2F1c2UgeW91IHRob3VnaHQgdGhhdCB0aGluZ3Mgd2VyZSB1bmZhaXIiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUEFOMDAxIiwgcXVlc3Rpb25fdGV4dD0iYSBwYW5pYyBhdHRhY2siKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUEFOMDAzIiwgcXVlc3Rpb25fdGV4dD0iZXhwZXJpZW5jZWQgYSBwYW5pYyBhdHRhY2sgYmVmb3JlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlBBTjAwNCIsIHF1ZXN0aW9uX3RleHQ9ImZlbHQgbG9zaW5nIGNvbnRyb2wgc29tZXRoaW5nIHRlcnJpYmxlIHdhcyBnb2luZyB0byBoYXBwZW4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUEhCMDAxIiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIG9mIGFuaW1hbHMgb3IgYnVncyBsaWtlIGRvZ3Mgc25ha2VzIG9yIHNwaWRlcnMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUEhCMDAyIiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIG9mIGJlaW5nIGluIHJlYWxseSBoaWdoIHBhbGNlcyBsaWtlIGEgcm9vZiBvciB0YWxsIGJ1aWxkaW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlBIQjAwMyIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiB3YXRlciBvciBzaXR1YXRpb25zIGludm9sdmluZyB3YXRlciBzdWNoIGFzIGEgc3dpbW1pbmcgcG9vbCBsYWtlIG9yIG9jZWFuIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlBIQjAwNCIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBzdG9ybXMgdGh1bmRlciBvciBsaWdodGVuaW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlBIQjAwNSIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCBvZiBkb2N0b3JzIG5lZWRsZXMgb3IgYmxvb2QiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUEhCMDA2IiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIG9mIGNsb3NlZCBzcGFjZXMgbGlrZSBlbGV2YXRvcnMgb3IgY2xvc2V0cyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJQSEIwMDciLCBxdWVzdGlvbl90ZXh0PSJhZnJhaWQgb2YgZmx5aW5nIG9yIGFpcnBsYW5lcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJQSEIwMDgiLCBxdWVzdGlvbl90ZXh0PSJhZnJhaWQgb2YgYW55IG90aGVyIHRoaW5ncyBvciBzaXR1YXRpb25zIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlBTWTAwMSIsIHF1ZXN0aW9uX3RleHQ9ImhlYXJkIHZvaWNlcyB3aGVuIG5vIG9uZSB3YXMgdGhlcmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUFNZMDI5IiwgcXVlc3Rpb25fdGV4dD0iaGF2ZSBzZWVuIHZpc2lvbnMgb3Igc2VlbiB0aGluZ3Mgd2hpY2ggb3RoZXIgcGVvcGxlIGNvdWxkIG5vdCBzZWUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUFNZMDUwIiwgcXVlc3Rpb25fdGV4dD0ic21lbGxlZCBzdHJhbmdlIG9kb3JzIG90aGVyIHBlb3BsZSBjb3VsZCBub3Qgc21lbGwiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUFNZMDYwIiwgcXVlc3Rpb25fdGV4dD0ic3RyYW5nZSBmZWVsaW5ncyBpbiB5b3VyIGJvZHkgbGlrZSB0aGluZ3Mgd2VyZSBjcmF3bGluZyBvbiB5b3UiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUFNZMDcwIiwgcXVlc3Rpb25fdGV4dD0iYmVsaWV2ZWQgaW4gdGhpbmdzIHRoYXQgbW9zdCBvdGhlciBwZW9wbGUgZG9uJ3QgYmVsaWV2ZSBpbiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJQU1kwNzEiLCBxdWVzdGlvbl90ZXh0PSJiZWxpZXZlZCBwZW9wbGUgYmVpbmcgb3V0IHRvIGdldCB5b3Ugb3IgY29udHJvbGxpbmcgd2hhdCB5b3UgZG8gb3IgdGhpbmsiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiUFREMDA5IiwgcXVlc3Rpb25fdGV4dD0idmVyeSB1cHNldCBieSBzZWVpbmcgYSBkZWFkIGJvZHkgb3IgYnkgc2VlaW5nIHBpY3R1cmVzIG9mIHRoZSBkZWFkIGJvZHkgb2Ygc29tZWJvZHkgeW91IGtuZXcgd2VsbCIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTQ1IwMDEiLCBxdWVzdGlvbl90ZXh0PSJzb3VnaHQgbWVudGFsIGhlYWx0aCBwcm9mZXNzaW9uYWwgYWJvdXQgeW91ciBtb29kIG9yIGJlaGF2aW9ycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTQ1IwMDYiLCBxdWVzdGlvbl90ZXh0PSJjdXJyZW50bHkgdGFraW5nIG1lZGljYXRpb24gZm9yIGVtb3Rpb25zIG9yIGJlaGF2aW9ycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTQ1IwMDciLCBxdWVzdGlvbl90ZXh0PSJob3NwaXRhbGl6ZWQgYmVjYXVzZSBvZiBwcm9ibGVtcyB3aXRoIG1vb2Qgb3IgYmVoYXZpb3JzIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNDUjAwOCIsIHF1ZXN0aW9uX3RleHQ9InlvdSBvciBvdGhlcnMgIHRob3VnaHQgeW91IG5lZWRlZCBwc3ljaGlhdHJpYyBoZWxwIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNFUDUwMCIsIHF1ZXN0aW9uX3RleHQ9IndvcnJpZXMgYWJvdXQgIGF0dGFjaG1lbnQgZmlndXJlcyBhbmQgd2VyZSB2ZXJ5IHVwc2V0IHRoZXkgd2VyZSBhd2F5IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNFUDUwOCIsIHF1ZXN0aW9uX3RleHQ9IndhbnRlZCB0byBzdGF5IGhvbWUgb3Igbm90IGxlYXZlIHdpdGhvdXQgeW91ciBhdHRhY2htZW50IGZpZ3VyZXMiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0VQNTA5IiwgcXVlc3Rpb25fdGV4dD0idmVyeSB1cHNldCB3aGVuIGZpbmRpbmcgb3V0IHdpbGwgYmUgYXdheSBmcm9tIGF0dGFjaGVtbnQgZmlndXJlcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTRVA1MTAiLCBxdWVzdGlvbl90ZXh0PSJ3b3JyaWVkIGFib3V0IHNvbWV0aGluZyB0ZXJyaWJsZSBwcmV2ZW50aW5nIHlvdSBmcm9tIHNlZWluZyBhdHRhY2htZW50IGZpZ3VyZXMgYWdhaW4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0VQNTExIiwgcXVlc3Rpb25fdGV4dD0ic2NhcmVkIHRvIGJlIGFsb25lIG9yICBuZWVkZWQgIGF0dGFjaG1lbnQgZmlndXJlIHRvIHN0YXkgd2hpbGUgZmFsbGluZyBhc2xlZXAiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDAzIiwgcXVlc3Rpb25fdGV4dD0iWW91IGhhdmUgZmVsdCB0aGF0IHRoZXJlIGFyZSBvZGQgb3IgdW51c3VhbCB0aGluZ3MgZ29pbmcgb24gdGhhdCBJIGNhbid0IGV4cGxhaW4uIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAwNCIsIHF1ZXN0aW9uX3RleHQ9IkkgdGhpbmsgdGhhdCBJIG1pZ2h0IGJlIGFibGUgdG8gcHJlZGljdCB0aGUgZnV0dXJlLiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMDUiLCBxdWVzdGlvbl90ZXh0PSJmZWx0IHRoYXQgc29tZXRoaW5nIGludGVycnVwdGluZyBvciBjb250cm9sbGluZyBteSB0aG91Z2h0cyBmZWVsaW5ncyBvciBhY3Rpb24iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDA2IiwgcXVlc3Rpb25fdGV4dD0iZG9pbmcgc29tZXRoaW5nIGRpZmZlcmVudGx5IGJlY2F1c2Ugb2YgbXkgc3VwZXJzdGl0aW9ucy4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDA3IiwgcXVlc3Rpb25fdGV4dD0iY29uZnVzZWQgYXQgdGltZXMgd2hldGhlciBzb21ldGhpbmcgbWF5IGJlIHJlYWwgb3IgbWF5IGJlIGp1c3QgcGFydCBvZiBteSBpbWFnaW5hdGlvbiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMDgiLCBxdWVzdGlvbl90ZXh0PSJvdGhlciBwZW9wbGUgY2FuIHJlYWQgbXkgbWluZCBvciB0aGF0IEkgY2FuIHJlYWQgb3RoZXJzJyBtaW5kcyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMDkiLCBxdWVzdGlvbl90ZXh0PSJwZW9wbGUgbWF5IGJlIHBsYW5uaW5nIHRvIGh1cnQgbWUgb3IgZXZlbiBtYXkgYmUgYWJvdXQgdG8gaHVydCBtZS4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDEwIiwgcXVlc3Rpb25fdGV4dD0iSSBoYXZlIHNwZWNpYWwgbmF0dXJhbCBvciBzdXBlcm5hdHVyYWwgZ2lmdHMgYmV5b25kIG15IHRhbGVudHMgYW5kIG5hdHVyYWwgc3RyZW5ndGhzLiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMTEiLCBxdWVzdGlvbl90ZXh0PSJteSBtaW5kIGlzIFwicGxheWluZyB0cmlja3NcIiBvbiBtZS4iKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDEyIiwgcXVlc3Rpb25fdGV4dD0iaGVhcmQgc291bmRzIG9mIHBlb3BsZSB0YWxraW5nIHdoZW4gdGhlcmUgaXMgbm8gb25lIG5lYXIgbWUuIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAxMyIsIHF1ZXN0aW9uX3RleHQ9ImhlYXIgbXkgb3duIHRob3VnaHRzIGJlaW5nIHNhaWQgb3V0IGxvdWQuIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAxNCIsIHF1ZXN0aW9uX3RleHQ9ImNvbmNlcm5lZCB0aGF0IEkgbWlnaHQgYmUgXCJnb2luZyBjcmF6eS5cIiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMjciLCBxdWVzdGlvbl90ZXh0PSJwZW9wbGUgdGVsbCB5b3UgdGhhdCB0aGV5IGNhbid0IHVuZGVyc3RhbmQgeW91IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAyOCIsIHF1ZXN0aW9uX3RleHQ9InBlb3BsZSBldmVyIHNlZW0gdG8gaGF2ZSBkaWZmaWN1bHR5IHVuZGVyc3RhbmRpbmcgeW91IiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAzMiIsIHF1ZXN0aW9uX3RleHQ9InlvdSBmZWVsIGEgbG9zcyBvZiBzZW5zZSBvZiBzZWxmIG9yIGZlZWwgZGlzY29ubmVjdGVkIGZyb20geW91cnNlbGYgb3IgeW91ciBsaWZlIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNJUDAzMyIsIHF1ZXN0aW9uX3RleHQ9InRvbGQgdGhhdCB5b3UgYXJlIGxlc3MgZW1vdGlvbmFsIG9yIGNvbm5lY3RlZCB0byBwZW9wbGUgdGhhbiB5b3UgdXNlZCB0byBiZSIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTSVAwMzgiLCBxdWVzdGlvbl90ZXh0PSJXaXRoaW4gdGhlIHBhc3QgNiBtb250aHMgeW91IGFyZSBoYXZpbmcgYSBoYXJkZXIgdGltZSBnZXR0aW5nIHlvdXIgd29yayBvciBzY2hvb2x3b3JrIGRvbmUiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU0lQMDM5IiwgcXVlc3Rpb25fdGV4dD0iV2l0aGluIHRoZSBwYXN0IDYgbW9udGhzIHlvdSBhcmUgaGF2aW5nIGEgaGFyZGVyIHRpbWUgZ2V0dGluZyBub3JtYWwgYWN0aXZpdGllcyBkb25lIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNPQzAwMSIsIHF1ZXN0aW9uX3RleHQ9InJlYWxseSBzaHkgd2l0aCBwZW9wbGUgbWVldGluZyBuZXcgcGVvcGxlIGdvaW5nIHRvIHBhcnRpZXMgb3IgZG9pbmcgdGhpbmdzIGluIGZyb250IG9mIG90aGVycyIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTT0MwMDIiLCBxdWVzdGlvbl90ZXh0PSJhZnJhaWQgb2YgdGFsa2luZyBvbiB0aGUgdGVsZXBob25lIG9yIHdpdGggcGVvcGxlIHlvdXIgb3duIGFnZSB3aG8geW91IGRvbid0IGtub3cgdmVyeSB3ZWxsIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNPQzAwMyIsIHF1ZXN0aW9uX3RleHQ9ImFmcmFpZCB3aGVuIHlvdSBoYWQgdG8gZG8gc29tZXRoaW5nIGluIGZyb250IG9mIGEgZ3JvdXAgb2YgcGVvcGxlIGxpa2Ugc3BlYWtpbmcgaW4gY2xhc3MiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU09DMDA0IiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIG9mIGFjdGluZywgZ2l2aW5nIGEgdGFsaywgcGxheWluZyBhIHNwb3J0IG9yIGRvaW5nIGEgbXVzaWNhbCBwZXJmb3JtYW5jZSBvciB0YWtpbmcgYW4gaW1wb3J0YW50IHRlc3QiKSwNCmxpc3QocXVlc3Rpb25fbm8gPSAiU09DMDA1IiwgcXVlc3Rpb25fdGV4dD0iYWZyYWlkIGJlaW5nIHRoZSBjZW50ZXIgb2YgYXR0ZW50aW9uIGFuZCB3ZXJlIGNvbmNlcm5lZCBzb21ldGhpbmcgZW1iYXJyYXNzaW5nIG1pZ2h0IGhhcHBlbiIpLA0KbGlzdChxdWVzdGlvbl9ubyA9ICJTVUkwMDEiLCBxdWVzdGlvbl90ZXh0PSJ5b3UgaGF2ZSB0aG91Z2h0IGEgbG90IGFib3V0IGRlYXRoIG9yIGR5aW5nIiksDQpsaXN0KHF1ZXN0aW9uX25vID0gIlNVSTAwMiIsIHF1ZXN0aW9uX3RleHQ9InlvdSBoYXZlIHRob3VnaHQgYWJvdXQga2lsbGluZyB5b3Vyc2VsZiIpDQopDQopDQpgYGANCg0KV2UgY2FuIGNvbmNhdGVuYXRlIGJvdGggb2JqZWN0cyB0b2dldGhlcjoNCg0KYGBge3J9DQppbnN0cnVtZW50c19saXN0IDwtIGxpc3QoY2JjbCwgZ29hc3Nlc3MpDQpgYGANCg0KTGV0J3MgY2FsbCBIYXJtb255IHRvIGNhbGN1bGF0ZSB0aGUgbWF0Y2g6DQoNCmBgYHtyfQ0KbWF0Y2ggPSBtYXRjaF9pbnN0cnVtZW50cyhpbnN0cnVtZW50c19saXN0KQ0KYGBgDQoNCkNoZWNrIHdoYXQgaGFzIGNvbWUgb3V0IG9mIHRoZSBtYXRjaDoNCg0KYGBge3J9DQpuYW1lcyhtYXRjaCkNCmBgYA0KVGhlIGZpcnN0IHF1ZXN0aW9uIGlzIENCQ0wgcXVlc3Rpb24gMS4NCg0KYGBge3J9DQptYXRjaCRxdWVzdGlvbnNbWzFdXQ0KYGBgDQoNCg0KVGhlIHRvdGFsIG51bWJlciBvZiBxdWVzdGlvbnMgYXJlOg0KDQpgYGB7cn0NCmxlbmd0aChtYXRjaCRxdWVzdGlvbnMpDQpgYGANCg0KDQpUaGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgbWF0Y2ggYXJyYXkgYXJlOg0KDQpgYGB7cn0NCm1hdGNoJG1hdGNoZXNbWzFdXVtjKDEsMiwzKV0NCmBgYA0KDQojIyBTYXZpbmcgdG8gQ1NWL0V4Y2VsDQoNCkxldCdzIGNvbnZlcnQgdG8gYSBkYXRhZnJhbWUgc28gd2UgY2FuIGV4cG9ydCB0byBDU1Y6DQoNCmBgYHtyfQ0KZGYgPC0gZGF0YS5mcmFtZShtYXRjaCRtYXRjaGVzW1sxXV0pDQpmb3IgKHggaW4gMTpsZW5ndGgobWF0Y2gkbWF0Y2hlcykpIHsNCiAgICBkZlt4LCBdID0gbWF0Y2gkbWF0Y2hlc1tbeF1dDQp9DQpgYGANCg0KU2V0IHRoZSByb3cgYW5kIGNvbHVtbiBuYW1lcyB0byBzb21ldGhpbmcgaHVtYW4gcmVhZGFibGU6DQoNCmBgYHtyfQ0KY29sbmFtZXMoZGYpIDwtIGxhcHBseShtYXRjaCRxdWVzdGlvbnMsIGZ1bmN0aW9uKHgpIHBhc3RlKHgkcXVlc3Rpb25fbm8sICB4JHF1ZXN0aW9uX3RleHQgLCBzZXA9IiAiKSApDQpyb3duYW1lcyhkZikgPC0gbGFwcGx5KG1hdGNoJHF1ZXN0aW9ucywgZnVuY3Rpb24oeCkgcGFzdGUoeCRxdWVzdGlvbl9ubywgIHgkcXVlc3Rpb25fdGV4dCAsIHNlcD0iICIpICkNCmBgYA0KDQpOb3cgd2UgY2FuIHNhdmUgdG8gQ1NWOg0KDQpgYGB7cn0NCndyaXRlLmNzdihkZiwgIm1hdGNoZXMuY3N2IikNCmBgYA==