data pulled: 2022-12-13
website: http://rpubs.com/nsharmaa/spasd_tracking
This report is meant to provide a quick overview of the
Social Processes Initiative in Neurobiology of Autism-spectrum
and Schizophrenia-spectrum Disorders (SPIN-ASD) study. All data
summarized here derives from the SPIN-ASD project on CAMH’s REDCap
database, the SPINS project on AHRC’s REDCap database, and TIGRLab’s
XNAT database. This summary is only as accurate as the data captured
there.
For each of the plots, you can hover over selected areas to see more
metadata. Dragging a rectangle over a specific area of the plot will
zoom in and double clicking will reset to the original view.
Demographics
As part of the study design, one of the goals is to collect cognitive
and MR imaging data from 140 participants (100
participants with autism-spectrum disorders and 40
healthy controls). Participants who either drop out, are
withdrawn prior to completing the study, or whose MRI data cannot be
used will be replaced until this goal is achieved.
The study will also leverage previously collected data from the
Social Processes Initiative in Neurobiology of Schizophrenias
(SPINS) study, which consists of a matching protocol. SPINS is
a multi-site study that collected cognitive and MR imaging data from
clinically stable patients with schizophrenia-spectrum
disorders and healthy controls from each of
CAMH (CMH), Zucker Hillside Hospital
(ZHH) and Maryland Psychiatric Research Center
(MRC).
SPIN-ASD
Thus far, 133 participants have consented to be in
the study. A table summarizing their demographics as well as histograms
of their age and estimated IQ distributions are shown below.
For estimated IQ, study participants either
completed the Wechsler Abbreviated Scale of Intelligence
(WASI-II) or the Wechsler Adult Intelligence Scale
(WAIS-IV).
|
Case (N=98) |
Control (N=35) |
Overall (N=133) |
| Age (years) |
|
|
|
| Mean (SD) |
21 (± 3.9) |
27 (± 4.6) |
22 (± 4.8) |
| Median [Min, Max] |
20 [15, 33] |
27 [17, 35] |
22 [15, 35] |
| Missing |
0 (0%) |
2 (5.7%) |
2 (1.5%) |
| Sex |
|
|
|
| Female |
40 (41 %) |
14 (40 %) |
54 (41 %) |
| Male |
58 (59 %) |
19 (54 %) |
77 (58 %) |
| Missing |
0 (0%) |
2 (5.7%) |
2 (1.5%) |
| Race |
|
|
|
| Asian |
14 (14 %) |
16 (46 %) |
30 (23 %) |
| Black or African American |
1 (1 %) |
6 (17 %) |
7 (5 %) |
| More than one race |
7 (7 %) |
2 (6 %) |
9 (7 %) |
| Other |
6 (6 %) |
0 (0 %) |
6 (5 %) |
| White |
70 (71 %) |
9 (26 %) |
79 (59 %) |
| Missing |
0 (0%) |
2 (5.7%) |
2 (1.5%) |
| Education (years) |
|
|
|
| Mean (SD) |
13 (± 2.2) |
16 (± 2.1) |
14 (± 2.6) |
| Median [Min, Max] |
12 [9.0, 20] |
16 [11, 20] |
13 [9.0, 20] |
| Missing |
0 (0%) |
2 (5.7%) |
2 (1.5%) |
| Estimated IQ |
|
|
|
| Mean (SD) |
110 (± 14) |
110 (± 11) |
110 (± 13) |
| Median [Min, Max] |
120 [73, 150] |
110 [96, 130] |
110 [73, 150] |
| Missing |
36 (36.7%) |
22 (62.9%) |
58 (43.6%) |
| MATRICS |
|
|
|
| Mean (SD) |
41 (± 11) |
49 (± 7.7) |
43 (± 11) |
| Median [Min, Max] |
43 [-3.0, 59] |
51 [33, 60] |
44 [-3.0, 60] |
| Missing |
12 (12.2%) |
13 (37.1%) |
25 (18.8%) |
SPINS
The total SPINS dataset consists of 359 participants
with an SSD and 198 participants. After filtering the
dataset for participants within the same age range as SPIN-ASD, we get
the demographics table, and age and estimated IQ distributions shown
below.
For estimated IQ, study participants completed the
Wechsler Test of Adult Reading (WTAR).
|
CMH |
CMP |
MRC |
MRP |
ZHH |
ZHP |
Overall |
|
Case (N=107) |
Control (N=47) |
Case (N=15) |
Control (N=14) |
Case (N=18) |
Control (N=15) |
Case (N=32) |
Control (N=27) |
Case (N=22) |
Control (N=13) |
Case (N=45) |
Control (N=26) |
Case (N=239) |
Control (N=142) |
| Age (years) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
26 (± 4.6) |
24 (± 4.2) |
25 (± 3.4) |
26 (± 4.1) |
27 (± 5.2) |
28 (± 4.1) |
28 (± 4.8) |
27 (± 4.1) |
28 (± 4.4) |
27 (± 5.2) |
25 (± 4.7) |
28 (± 4.7) |
26 (± 4.7) |
26 (± 4.5) |
| Median [Min, Max] |
25 [18, 35] |
23 [18, 35] |
24 [20, 31] |
25 [20, 34] |
26 [18, 34] |
29 [21, 33] |
28 [18, 35] |
26 [19, 34] |
30 [21, 35] |
26 [20, 35] |
24 [18, 35] |
28 [18, 35] |
25 [18, 35] |
25 [18, 35] |
| Sex |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Female |
31 (29 %) |
21 (45 %) |
7 (47 %) |
10 (71 %) |
3 (17 %) |
3 (20 %) |
7 (22 %) |
11 (41 %) |
9 (41 %) |
7 (54 %) |
15 (33 %) |
16 (62 %) |
72 (30 %) |
68 (48 %) |
| Male |
76 (71 %) |
26 (55 %) |
8 (53 %) |
4 (29 %) |
15 (83 %) |
12 (80 %) |
25 (78 %) |
16 (59 %) |
13 (59 %) |
6 (46 %) |
30 (67 %) |
10 (38 %) |
167 (70 %) |
74 (52 %) |
| Intersex |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
| Race |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| American Indian/Alaska Native |
1 (1 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
1 (0 %) |
0 (0 %) |
| Asian |
23 (21 %) |
15 (32 %) |
1 (7 %) |
7 (50 %) |
2 (11 %) |
1 (7 %) |
3 (9 %) |
1 (4 %) |
2 (9 %) |
1 (8 %) |
9 (20 %) |
5 (19 %) |
40 (17 %) |
30 (21 %) |
| Black or African American |
17 (16 %) |
3 (6 %) |
1 (7 %) |
0 (0 %) |
12 (67 %) |
7 (47 %) |
13 (41 %) |
4 (15 %) |
10 (45 %) |
4 (31 %) |
18 (40 %) |
11 (42 %) |
71 (30 %) |
29 (20 %) |
| More than one race |
8 (7 %) |
2 (4 %) |
5 (33 %) |
0 (0 %) |
1 (6 %) |
1 (7 %) |
1 (3 %) |
0 (0 %) |
3 (14 %) |
2 (15 %) |
1 (2 %) |
0 (0 %) |
19 (8 %) |
5 (4 %) |
| Other |
3 (3 %) |
1 (2 %) |
1 (7 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
1 (4 %) |
2 (9 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
6 (3 %) |
2 (1 %) |
| Unknown or not reported |
3 (3 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
2 (9 %) |
0 (0 %) |
0 (0 %) |
0 (0 %) |
5 (2 %) |
0 (0 %) |
| White |
52 (49 %) |
26 (55 %) |
7 (47 %) |
7 (50 %) |
3 (17 %) |
6 (40 %) |
15 (47 %) |
21 (78 %) |
3 (14 %) |
6 (46 %) |
17 (38 %) |
10 (38 %) |
97 (41 %) |
76 (54 %) |
| Education (years) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
13 (± 1.8) |
15 (± 1.8) |
14 (± 2.1) |
17 (± 1.7) |
13 (± 1.8) |
15 (± 1.8) |
14 (± 2.3) |
17 (± 2.0) |
13 (± 2.2) |
15 (± 2.4) |
14 (± 1.8) |
17 (± 2.0) |
14 (± 1.9) |
16 (± 2.0) |
| Median [Min, Max] |
13 [10, 18] |
16 [11, 18] |
14 [10, 18] |
18 [14, 20] |
14 [10, 16] |
16 [12, 18] |
14 [7.0, 18] |
16 [12, 20] |
14 [10, 18] |
16 [12, 19] |
13 [9.0, 18] |
17 [13, 20] |
13 [7.0, 18] |
16 [11, 20] |
| Estimated IQ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Mean (SD) |
110 (± 13) |
120 (± 8.5) |
120 (± 8.0) |
110 (± 9.1) |
99 (± 17) |
110 (± 13) |
110 (± 13) |
110 (± 11) |
93 (± 12) |
110 (± 14) |
100 (± 12) |
110 (± 12) |
110 (± 15) |
110 (± 11) |
| Median [Min, Max] |
110 [65, 130] |
120 [92, 130] |
120 [98, 120] |
110 [95, 120] |
98 [73, 120] |
120 [86, 130] |
110 [81, 130] |
120 [87, 130] |
87 [77, 120] |
110 [83, 130] |
110 [67, 120] |
120 [79, 130] |
110 [65, 130] |
120 [79, 130] |
| Missing |
5 (4.7%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
0 (0%) |
2 (4.4%) |
1 (3.8%) |
7 (2.9%) |
1 (0.7%) |
Assessment Completion Status
Below is a heatmap depicting which assessments have been completed
for each participant in SPIN-ASD. There are separate tabs dividing
Case and Control participants. The
Assessment is shown in the x axis and the
Subject ID is shown in the y axis. Green indicates ‘complete’,
red indicates
‘incomplete’ and yellow indicates a ‘partial
complete’. Blank rectangles indicate that the assessment either hasn’t
been attempted yet or that the data hasn’t been entered. You can hover
over each square to get more details on the reason for an assessment
being incomplete.
The Autism-Spectrum Quotient (AQ),
Schizotypal Personality Questionnaire-Brief (SPQ-B) and
Beck Depression Inventory-II (BDI-II) were added to the
study protocol partway through the study and haven’t been completed for
several participants at the beginning.
Case
The Autism Diagnostic Interview-Revised (ADI-R) was
included in the study protocol in the event of an inconclusive clinical
diagnosis and a need for further diagnostic information following the
Autism Diagnostic Observation Schedule, Second Edition
(ADOS-2) .
Social Cognition
RMET
The Reading the Mind in the Eyes test (RMET) is a
test of social sensitivity. The participant is presented with a series
of 36 photographs of the eye region and asked to choose which of 4 words
best describes what the actor in the photograph is thinking or
feeling.
IRI
The Interpersonal Reactivity Index (IRI) is a 28
item self-report measure of cognitive and affective empathy.
TASIT-R
The Awareness of Social Inference Test-Revised
(TASIT-R) consists of emotion evaluation (Part
1), social inference - minimal (Part 2), and
social inference - enriched (Part 3). In Part 1, the
participant views 28 brief video clips to identify the emotion expressed
by the actor. In Part 2 and 3, the participant views 31 videotaped
vignettes of social interactions involving lies and sarcasm and makes
judgements regarding what the individual in the scene believed or knew,
meant by what he or she said, intended to do, and actually felt.
ER-40
The Penn Emotion Recognition Task-40 (ER-40) is a
measure of emotional processing. Participants rate the emotional valence
of 40 faces displaying happy, sad or neutral expressions on a 7 point
scale.
A median response time below 1000 seconds indicates inattention and
should be filtered out from further analysis.
MRI
Thus far, 110 participants have been scanned. The
target is to scan 3.33 participants per month
(40 per year). We are currently averaging
2.08 participants per month.
LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwYXNkX2RhdGFfcGF0aCkpewogIGdldF9yZWRjYXAoIlNQQVNEIiwgc2V0dGluZ3NfY2ZnLCBzcGFzZF9kYXRhX3BhdGgpCn0KCnNwaW5zX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUElOU197ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwaW5zX2RhdGFfcGF0aCkpewogIGdldF9yZWRjYXAoIlNQSU5TIiwgc2V0dGluZ3NfY2ZnLCBzcGluc19kYXRhX3BhdGgpCn0KYGBgCgpgYGB7ciBjbGVhbl9kYXRhfQpzcGFzZF9yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGFzZF9kYXRhX3BhdGgsIG5hID0gYygiIiwgIk5BIiwgIk5JIiwgIklOViIsICJOQVNLIiwgIkFTS1UiKSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU4tQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSkgJT4lCiAgZmlsdGVyKHJlZGNhcF9ldmVudF9uYW1lICE9ICJjbF9hcm1fMyIpICU+JQogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHJlYWRfY3N2KHNwaW5zX2RhdGFfcGF0aCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQoKICAgICAgICAgICBmYWN0b3IoLikpICU+JQogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3RvdGFsX2Nhc2UgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgpzcGluc190b3RhbF9jb250cm9sIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKc3BpbnNfcmVkY2FwX2RmIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihkZW1vX2FnZV9zdHVkeV9lbnRyeSA8IDM2KQoKdGFyZ2V0c19kZiA8LQogIHJlYWRfY3N2KGhlcmUoIm1ldGFkYXRhIiwgInJlY3J1aXRtZW50X3RhcmdldHMuY3N2IikpCmBgYAoKVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSAqKlNvY2lhbCBQcm9jZXNzZXMgSW5pdGlhdGl2ZSBpbiBOZXVyb2Jpb2xvZ3kgb2YgQXV0aXNtLXNwZWN0cnVtIGFuZCBTY2hpem9waHJlbmlhLXNwZWN0cnVtIERpc29yZGVycyAoU1BJTi1BU0QpKiogc3R1ZHkuIEFsbCBkYXRhIHN1bW1hcml6ZWQgaGVyZSBkZXJpdmVzIGZyb20gdGhlIFNQSU4tQVNEIHByb2plY3Qgb24gQ0FNSCdzIFJFRENhcCBkYXRhYmFzZSwgdGhlIFNQSU5TIHByb2plY3Qgb24gQUhSQydzIFJFRENhcCBkYXRhYmFzZSwgYW5kIFRJR1JMYWIncyBYTkFUIGRhdGFiYXNlLiBUaGlzIHN1bW1hcnkgaXMgb25seSBhcyBhY2N1cmF0ZSBhcyB0aGUgZGF0YSBjYXB0dXJlZCB0aGVyZS4gIAoKRm9yIGVhY2ggb2YgdGhlIHBsb3RzLCB5b3UgY2FuIGhvdmVyIG92ZXIgc2VsZWN0ZWQgYXJlYXMgdG8gc2VlIG1vcmUgbWV0YWRhdGEuIERyYWdnaW5nIGEgcmVjdGFuZ2xlIG92ZXIgYSBzcGVjaWZpYyBhcmVhIG9mIHRoZSBwbG90IHdpbGwgem9vbSBpbiBhbmQgZG91YmxlIGNsaWNraW5nIHdpbGwgcmVzZXQgdG8gdGhlIG9yaWdpbmFsIHZpZXcuCgojIyBEZW1vZ3JhcGhpY3Mgey50YWJzZXR9CgpBcyBwYXJ0IG9mIHRoZSBzdHVkeSBkZXNpZ24sIG9uZSBvZiB0aGUgZ29hbHMgaXMgdG8gY29sbGVjdCBjb2duaXRpdmUgYW5kIE1SIGltYWdpbmcgZGF0YSBmcm9tICoqMTQwKiogcGFydGljaXBhbnRzICgqKjEwMCBwYXJ0aWNpcGFudHMgd2l0aCBhdXRpc20tc3BlY3RydW0gZGlzb3JkZXJzKiogYW5kICoqNDAgaGVhbHRoeSBjb250cm9scyoqKS4gUGFydGljaXBhbnRzIHdobyBlaXRoZXIgZHJvcCBvdXQsIGFyZSB3aXRoZHJhd24gcHJpb3IgdG8gY29tcGxldGluZyB0aGUgc3R1ZHksIG9yIHdob3NlIE1SSSBkYXRhIGNhbm5vdCBiZSB1c2VkIHdpbGwgYmUgcmVwbGFjZWQgdW50aWwgdGhpcyBnb2FsIGlzIGFjaGlldmVkLiAgCgpUaGUgc3R1ZHkgd2lsbCBhbHNvIGxldmVyYWdlIHByZXZpb3VzbHkgY29sbGVjdGVkIGRhdGEgZnJvbSB0aGUgKipTb2NpYWwgUHJvY2Vzc2VzIEluaXRpYXRpdmUgaW4gTmV1cm9iaW9sb2d5IG9mIFNjaGl6b3BocmVuaWFzIChTUElOUykqKiBzdHVkeSwgd2hpY2ggY29uc2lzdHMgb2YgYSBtYXRjaGluZyBwcm90b2NvbC4gU1BJTlMgaXMgYSBtdWx0aS1zaXRlIHN0dWR5IHRoYXQgY29sbGVjdGVkIGNvZ25pdGl2ZSBhbmQgTVIgaW1hZ2luZyBkYXRhIGZyb20gKipjbGluaWNhbGx5IHN0YWJsZSBwYXRpZW50cyB3aXRoIHNjaGl6b3BocmVuaWEtc3BlY3RydW0gZGlzb3JkZXJzKiogYW5kICoqaGVhbHRoeSBjb250cm9scyoqIGZyb20gZWFjaCBvZiAqKkNBTUggKENNSCkqKiwgKipadWNrZXIgSGlsbHNpZGUgSG9zcGl0YWwgKFpISCkqKiBhbmQgKipNYXJ5bGFuZCBQc3ljaGlhdHJpYyBSZXNlYXJjaCBDZW50ZXIgKE1SQykqKi4KCiMjIyBTUElOLUFTRAoKYGBgIHtyIHNwYXNkX2RlbW9fZGF0YWZyYW1lfQpzcGFzZF9kZW1vX2RmIDwtCiAgc3Bhc2RfcmVkY2FwX2RmICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLAogICAgICAgICBkZW1vX3NleF9iaXJ0aCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksCiAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUsIGRlbW9fcmFjZV9fXzJfYmxhY2ssIGRlbW9fcmFjZV9fXzNfbmF0aXZlLAogICAgICAgICBkZW1vX3JhY2VfX180X2FzaWFuLCBkZW1vX3JhY2VfX181X2lzbGFuZGVyLCBkZW1vX3JhY2VfX182X290aGVyLAogICAgICAgICBkZW1vX3JhY2VfX183X21peGVkLCBkZW1vX3JhY2VfX184X3Vua25vd24sIGRlbW9fcmFjZV9vdGhlciwKICAgICAgICAgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYsIHdhc2lfd2Fpc19mc2lxLCB3YXNpX2ZzaXE0X2NzLCBucF9jb21wb3NpdGVfdHNjb3JlLAogICAgICAgICBoYW5kX2xhdGVyYWxpdHlfcXVvdGllbnQpICU+JQogIG11dGF0ZShzZXggPSBmYWN0b3IoZGVtb19zZXhfYmlydGgsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiLCAiSW50ZXJzZXgiKSksCiAgICAgICAgIHJhY2UgPSBjYXNlX3doZW4oZGVtb19yYWNlX19fN19taXhlZCA9PSAxIH4gIk1vcmUgdGhhbiBvbmUgcmFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSA9PSAxIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18yX2JsYWNrID09IDEgfiAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fM19uYXRpdmUgPT0gMSB+ICJBbWVyaWNhbiBJbmRpYW4vQWxhc2thIE5hdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiA9PSAxIH4gIkFzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX181X2lzbGFuZGVyID09IDEgfiAiSGF3YWlpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNl9vdGhlciA9PSAxIH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX184X3Vua25vd24gPT0gMSB+ICJVbmtub3duIG9yIG5vdCByZXBvcnRlZCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSwKICAgICAgICAgaXEgPSBpZmVsc2UoaXMubmEod2FzaV9mc2lxNF9jcyksIHdhc2lfd2Fpc19mc2lxLCB3YXNpX2ZzaXE0X2NzKSkgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIHNleCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksIHJhY2UsIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCBpcSwgbnBfY29tcG9zaXRlX3RzY29yZSkgJT4lCiAgZHJvcGxldmVscygpCmBgYAoKVGh1cyBmYXIsICoqYHIgbnJvdyhzcGFzZF9kZW1vX2RmKWAqKiBwYXJ0aWNpcGFudHMgaGF2ZSBjb25zZW50ZWQgdG8gYmUgaW4gdGhlIHN0dWR5LiBBIHRhYmxlIHN1bW1hcml6aW5nIHRoZWlyIGRlbW9ncmFwaGljcyBhcyB3ZWxsIGFzIGhpc3RvZ3JhbXMgb2YgdGhlaXIgYWdlIGFuZCBlc3RpbWF0ZWQgSVEgZGlzdHJpYnV0aW9ucyBhcmUgc2hvd24gYmVsb3cuICAKCkZvciAqKmVzdGltYXRlZCBJUSoqLCBzdHVkeSBwYXJ0aWNpcGFudHMgZWl0aGVyIGNvbXBsZXRlZCB0aGUgKipXZWNoc2xlciBBYmJyZXZpYXRlZCBTY2FsZSBvZiBJbnRlbGxpZ2VuY2UgKFdBU0ktSUkpKiogb3IgdGhlICoqV2VjaHNsZXIgQWR1bHQgSW50ZWxsaWdlbmNlIFNjYWxlIChXQUlTLUlWKSoqLgoKYGBge3Igc3Bhc2RfZGVtb190YWJsZX0KbGFiZWwoc3Bhc2RfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeSkgPC0gIkFnZSAoeWVhcnMpIgpsYWJlbChzcGFzZF9kZW1vX2RmJHNleCkgPC0gIlNleCIKbGFiZWwoc3Bhc2RfZGVtb19kZiRyYWNlKSA8LSAiUmFjZSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZikgPC0iRWR1Y2F0aW9uICh5ZWFycykiCmxhYmVsKHNwYXNkX2RlbW9fZGYkaXEpIDwtICJFc3RpbWF0ZWQgSVEiCmxhYmVsKHNwYXNkX2RlbW9fZGYkbnBfY29tcG9zaXRlX3RzY29yZSkgPC0gIk1BVFJJQ1MiCgpteS5yZW5kZXIuY29udCA8LSBmdW5jdGlvbih4KSB7CiAgICB3aXRoKHN0YXRzLmFwcGx5LnJvdW5kaW5nKHN0YXRzLmRlZmF1bHQoeCksIGRpZ2l0cz0yKSwgYygiIiwKICAgICAgICAiTWVhbiAoU0QpIj1zcHJpbnRmKCIlcyAoJnBsdXNtbjsgJXMpIiwgTUVBTiwgU0QpLAogICAgICAgICJNZWRpYW4gW01pbiwgTWF4XSI9c3ByaW50ZigiJXMgWyVzLCAlc10iLCBNRURJQU4sIE1JTiwgTUFYKSkpCn0KbXkucmVuZGVyLmNhdCA8LSBmdW5jdGlvbih4KSB7CiAgICBjKCIiLCBzYXBwbHkoc3RhdHMuZGVmYXVsdCh4KSwgZnVuY3Rpb24oeSkgd2l0aCh5LAogICAgICAgIHNwcmludGYoIiVkICglMC4wZiAlJSkiLCBGUkVRLCBQQ1QpKSkpCn0KCnNwYXNkX2RlbW9fdGFibGUgPC0KICB0YWJsZTEofiBkZW1vX2FnZV9zdHVkeV9lbnRyeSArIHNleCArIHJhY2UgKyBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiArIGlxICsgbnBfY29tcG9zaXRlX3RzY29yZSB8IGdyb3VwLAogICAgICAgIGRhdGEgPSBzcGFzZF9kZW1vX2RmLAogICAgICAgIHJlbmRlci5jb250aW51b3VzID0gbXkucmVuZGVyLmNvbnQsIHJlbmRlci5jYXRlZ29yaWNhbCA9IG15LnJlbmRlci5jYXQpCgpzcGFzZF9kZW1vX3RhYmxlCmBgYAoKYGBge3Igc3Bhc2RfZGVtb19kaXN0cmlidXRpb25zfQpzcGFzZF9hZ2VfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDE1LCBlbmQgPSAzNiwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQWdlICh5ZWFycykiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3Bhc2RfaXFfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDcwLCBlbmQgPSAxNTAsIHNpemUgPSAxMCkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGlxW3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkaXFbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJFc3RpbWF0ZWQgSVEiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3Bhc2RfYWdlX2Rpc3RyaWJ1dGlvbgpzcGFzZF9pcV9kaXN0cmlidXRpb24KYGBgCgojIyMgU1BJTlMKCmBgYHtyIHNwaW5zX2RlbW9fZGF0YWZyYW1lfQpzcGluc19kZW1vX2RmIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCByZWRjYXBfZGF0YV9hY2Nlc3NfZ3JvdXAsCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd3Rhcl9zdGRfc2NvcmUsIHd0YXJzdW1fc3RkLAogICAgICAgICBoYW5kX2xhdGVyYWxpdHlfcXVvdGllbnQpICU+JQogIG11dGF0ZShzZXggPSBmYWN0b3IoZGVtb19zZXhfYmlydGgsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiLCAiSW50ZXJzZXgiKSksCiAgICAgICAgIHJhY2UgPSBjYXNlX3doZW4oZGVtb19yYWNlX19fN19taXhlZCA9PSAxIH4gIk1vcmUgdGhhbiBvbmUgcmFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSA9PSAxIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18yX2JsYWNrID09IDEgfiAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fM19uYXRpdmUgPT0gMSB+ICJBbWVyaWNhbiBJbmRpYW4vQWxhc2thIE5hdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiA9PSAxIH4gIkFzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX181X2lzbGFuZGVyID09IDEgfiAiSGF3YWlpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNl9vdGhlciA9PSAxIH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX184X3Vua25vd24gPT0gMSB+ICJVbmtub3duIG9yIG5vdCByZXBvcnRlZCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSwKICAgICAgICAgaXEgPSBpZmVsc2UoaXMubmEod3Rhcl9zdGRfc2NvcmUpLCB3dGFyc3VtX3N0ZCwgd3Rhcl9zdGRfc2NvcmUpKSAlPiUKICBzZXBhcmF0ZShyZWNvcmRfaWQsIGMoInN0dWR5IiwgInNpdGUiLCAic3ViIiksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIHNpdGUsIGdyb3VwLCBzZXgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LCByYWNlLCBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgaXEpCmBgYAoKVGhlIHRvdGFsIFNQSU5TIGRhdGFzZXQgY29uc2lzdHMgb2YgKipgciBzcGluc190b3RhbF9jYXNlYCoqIHBhcnRpY2lwYW50cyB3aXRoIGFuIFNTRCBhbmQgKipgciBzcGluc190b3RhbF9jb250cm9sYCoqIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZmlsdGVyaW5nIHRoZSBkYXRhc2V0IGZvciBwYXJ0aWNpcGFudHMgd2l0aGluIHRoZSBzYW1lIGFnZSByYW5nZSBhcyBTUElOLUFTRCwgd2UgZ2V0IHRoZSBkZW1vZ3JhcGhpY3MgdGFibGUsIGFuZCBhZ2UgYW5kIGVzdGltYXRlZCBJUSBkaXN0cmlidXRpb25zIHNob3duIGJlbG93LiAgCgpGb3IgKiplc3RpbWF0ZWQgSVEqKiwgc3R1ZHkgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgKipXZWNoc2xlciBUZXN0IG9mIEFkdWx0IFJlYWRpbmcgKFdUQVIpKiouCgpgYGB7ciBzcGluc19kZW1vX3RhYmxlfQpsYWJlbChzcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5KSA8LSAiQWdlICh5ZWFycykiCmxhYmVsKHNwaW5zX2RlbW9fZGYkc2V4KSA8LSAiU2V4IgpsYWJlbChzcGluc19kZW1vX2RmJHJhY2UpIDwtICJSYWNlIgpsYWJlbChzcGluc19kZW1vX2RmJGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmKSA8LSJFZHVjYXRpb24gKHllYXJzKSIKbGFiZWwoc3BpbnNfZGVtb19kZiRpcSkgPC0gIkVzdGltYXRlZCBJUSIKCm15LnJlbmRlci5jb250IDwtIGZ1bmN0aW9uKHgpIHsKICAgIHdpdGgoc3RhdHMuYXBwbHkucm91bmRpbmcoc3RhdHMuZGVmYXVsdCh4KSwgZGlnaXRzPTIpLCBjKCIiLAogICAgICAgICJNZWFuIChTRCkiPXNwcmludGYoIiVzICgmcGx1c21uOyAlcykiLCBNRUFOLCBTRCksCiAgICAgICAgIk1lZGlhbiBbTWluLCBNYXhdIj1zcHJpbnRmKCIlcyBbJXMsICVzXSIsIE1FRElBTiwgTUlOLCBNQVgpKSkKfQpteS5yZW5kZXIuY2F0IDwtIGZ1bmN0aW9uKHgpIHsKICAgIGMoIiIsIHNhcHBseShzdGF0cy5kZWZhdWx0KHgpLCBmdW5jdGlvbih5KSB3aXRoKHksCiAgICAgICAgc3ByaW50ZigiJWQgKCUwLjBmICUlKSIsIEZSRVEsIFBDVCkpKSkKfQoKc3BpbnNfZGVtb190YWJsZSA8LQogIHRhYmxlMSh+IGRlbW9fYWdlX3N0dWR5X2VudHJ5ICsgc2V4ICsgcmFjZSArIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmICsgaXEgfCBzaXRlKmdyb3VwLAogICAgICAgIGRhdGEgPSBzcGluc19kZW1vX2RmLAogICAgICAgIHJlbmRlci5jb250aW51b3VzID0gbXkucmVuZGVyLmNvbnQsIHJlbmRlci5jYXRlZ29yaWNhbCA9IG15LnJlbmRlci5jYXQpCgpzcGluc19kZW1vX3RhYmxlCmBgYAoKYGBge3Igc3BpbnNfZGVtb19kaXN0cmlidXRpb25zfQpzcGluc19hZ2VfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDE3LCBlbmQgPSAzNiwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3BpbnNfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGluc19kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQWdlICh5ZWFycykiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3BpbnNfaXFfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDYwLCBlbmQgPSAxMzAsIHNpemUgPSAxMCkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGlxW3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkaXFbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJFc3RpbWF0ZWQgSVEiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3BpbnNfYWdlX2Rpc3RyaWJ1dGlvbgpzcGluc19pcV9kaXN0cmlidXRpb24KYGBgCgojIyBBc3Nlc3NtZW50IENvbXBsZXRpb24gU3RhdHVzIHsudGFic2V0fQoKQmVsb3cgaXMgYSBoZWF0bWFwIGRlcGljdGluZyB3aGljaCBhc3Nlc3NtZW50cyBoYXZlIGJlZW4gY29tcGxldGVkIGZvciBlYWNoIHBhcnRpY2lwYW50IGluIFNQSU4tQVNELiBUaGVyZSBhcmUgc2VwYXJhdGUgdGFicyBkaXZpZGluZyBgQ2FzZWAgYW5kIGBDb250cm9sYCBwYXJ0aWNpcGFudHMuIFRoZSBgQXNzZXNzbWVudGAgaXMgc2hvd24gaW4gdGhlIHggYXhpcyBhbmQgdGhlIGBTdWJqZWN0IElEYCBpcyBzaG93biBpbiB0aGUgeSBheGlzLiAqKjxzcGFuIHN0eWxlPSJjb2xvcjojMjM4ODIzIj5HcmVlbjwvc3Bhbj4qKiBpbmRpY2F0ZXMgJ2NvbXBsZXRlJywgKio8c3BhbiBzdHlsZT0iY29sb3I6I0QyMjIyRCI+cmVkPC9zcGFuPioqIGluZGljYXRlcyAnaW5jb21wbGV0ZScgYW5kICoqPHNwYW4gc3R5bGU9ImNvbG9yOiNGRkJGMDAiPnllbGxvdzwvc3Bhbj4qKiBpbmRpY2F0ZXMgYSAncGFydGlhbCBjb21wbGV0ZScuIEJsYW5rIHJlY3RhbmdsZXMgaW5kaWNhdGUgdGhhdCB0aGUgYXNzZXNzbWVudCBlaXRoZXIgaGFzbid0IGJlZW4gYXR0ZW1wdGVkIHlldCBvciB0aGF0IHRoZSBkYXRhIGhhc24ndCBiZWVuIGVudGVyZWQuIFlvdSBjYW4gaG92ZXIgb3ZlciBlYWNoIHNxdWFyZSB0byBnZXQgbW9yZSBkZXRhaWxzIG9uIHRoZSByZWFzb24gZm9yIGFuIGFzc2Vzc21lbnQgYmVpbmcgaW5jb21wbGV0ZS4KCmBgYHtyIGFzc2Vzc21lbnRfY29tcGxldGV9CnNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzIDwtCiAgc3Bhc2RfcmVkY2FwX2RmICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwKICAgICAgICAgZW5kc193aXRoKCJfZm9ybV9jb21wbGV0ZSIpLAogICAgICAgICBoYW5kX3JlZGNhcF9pZCwKICAgICAgICAgYXFfcmVkY2FwX2lkLAogICAgICAgICBzcHFiX3JlZGNhcF9pZCwKICAgICAgICAgYmRpX3JlZGNhcF9pZCwKICAgICAgICAgaXJpX3JlZGNhcF9pZCwKICAgICAgICAgZW5kc193aXRoKCJfZXhwbGFpbiIpLAogICAgICAgICBlbmRzX3dpdGgoIl9vdGhlcl9yZWFzb25fbmMiKSkgJT4lCiAgbXV0YXRlKHJlY29yZF9pZCA9IHN0cl9yZW1vdmUocmVjb3JkX2lkLCAiU1BBU0RfQ01QXyIpLAogICAgICAgICBoYW5kX2Zvcm1fY29tcGxldGUgPSBpZmVsc2UoaGFuZF9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBoYW5kX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBhcV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGFxX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIGFxX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBzcHFiX2Zvcm1fY29tcGxldGUgPSBpZmVsc2Uoc3BxYl9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBzcHFiX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBiZGlfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShiZGlfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgYmRpX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBpcmlfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShpcmlfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgaXJpX2Zvcm1fY29tcGxldGUpKQoKc3Bhc2RfYXNzZXNzbWVudF9jb21wbGV0ZSA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9mb3JtX2NvbXBsZXRlIikpICU+JQogIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gImNvbXBsZXRlIiwgLWMocmVjb3JkX2lkLCBncm91cCkpICU+JQogIGZpbHRlcighaXMubmEoY29tcGxldGUpKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9mb3JtX2NvbXBsZXRlIikpCgpzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW4gPC0KICBzcGFzZF9hc3Nlc3NtZW50X3N0YXR1cyAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgZW5kc193aXRoKCJfZXhwbGFpbiIpKSAlPiUKICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJyZWFzb24iLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWFzb24pKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9leHBsYWluIikpICU+JQogIGZpbHRlcihhc3Nlc3NtZW50ICE9ICJucF92YWxpZGl0eV9pc3N1ZXMiKSAlPiUKICBtdXRhdGUocmVhc29uID0gZmFjdG9yKHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoODgsIDg5LCA5MCwgOTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyLCA5MywgOTQsIDk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgOTcsIDk4LCA5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXJtaW5hdGVkIGZyb20gc3R1ZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2VkIGFwcG9pbnRtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhdGVyIGZvcmdvdCB0byBhZG1pbmlzdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWUgY29uc3RyYWludHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2l0aGRyZXcgY29uc2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYmUgY29udGFjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXRlZCBidXQgd2l0aCBsZXNzIHRoYW4gYmVzdCBlZmZvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmdXNlZCB0byBiZWdpbi9maW5pc2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGh5c2ljYWwgaW1wYWlybWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2duaXRpdmUgaW1wYWlybWVudCIpKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZXhwbGFpbl9vdGhlciA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9vdGhlcl9yZWFzb25fbmMiKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAicmVhc29uX290aGVyIiwgLWMocmVjb3JkX2lkLCBncm91cCkpICU+JQogIGZpbHRlcighaXMubmEocmVhc29uX290aGVyKSkgJT4lCiAgbXV0YXRlKGFzc2Vzc21lbnQgPSBzdHJfcmVtb3ZlKGFzc2Vzc21lbnQsICJfb3RoZXJfcmVhc29uX25jIikpCgpzcGFzZF9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9jb21wbGV0ZSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluKSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluX290aGVyKSAlPiUKICBmaWx0ZXIoIWFzc2Vzc21lbnQgJWluJSBjKCJlbGdfcCIsICJlbGdfY3QiLCAibnBfZmFjdCIsICJ0ZXJtIikpICU+JQogIG11dGF0ZShyZWFzb24gPSBpZmVsc2UocmVhc29uID09ICJPdGhlciIsIHJlYXNvbl9vdGhlciwgYXMuY2hhcmFjdGVyKHJlYXNvbikpLAogICAgICAgICBjb21wbGV0ZV90ZXh0ID0gY2FzZV93aGVuKGNvbXBsZXRlID09IDEgfiAiQ29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID09IDIgfiAiTm90IGNvbXBsZXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA9PSAzIH4gIlBhcnRpYWwiKSkKYGBgCgpUaGUgKipBdXRpc20tU3BlY3RydW0gUXVvdGllbnQgKEFRKSoqLCAqKlNjaGl6b3R5cGFsIFBlcnNvbmFsaXR5IFF1ZXN0aW9ubmFpcmUtQnJpZWYgKFNQUS1CKSoqIGFuZCAqKkJlY2sgRGVwcmVzc2lvbiBJbnZlbnRvcnktSUkgKEJESS1JSSkqKiB3ZXJlIGFkZGVkIHRvIHRoZSBzdHVkeSBwcm90b2NvbCBwYXJ0d2F5IHRocm91Z2ggdGhlIHN0dWR5IGFuZCBoYXZlbid0IGJlZW4gY29tcGxldGVkIGZvciBzZXZlcmFsIHBhcnRpY2lwYW50cyBhdCB0aGUgYmVnaW5uaW5nLgoKIyMjIENhc2UKClRoZSAqKkF1dGlzbSBEaWFnbm9zdGljIEludGVydmlldy1SZXZpc2VkIChBREktUikqKiB3YXMgaW5jbHVkZWQgaW4gdGhlIHN0dWR5IHByb3RvY29sIGluIHRoZSBldmVudCBvZiBhbiBpbmNvbmNsdXNpdmUgY2xpbmljYWwgZGlhZ25vc2lzIGFuZCBhIG5lZWQgZm9yIGZ1cnRoZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb2xsb3dpbmcgdGhlICoqQXV0aXNtIERpYWdub3N0aWMgT2JzZXJ2YXRpb24gU2NoZWR1bGUsIFNlY29uZCBFZGl0aW9uIChBRE9TLTIpKiogLiAgCgpgYGB7ciBjYXNlX2Fzc2Vzc21lbnRfY29tcGxldGV9CmNhc2VfYXNzZXNzbWVudF9kZiA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29uc2VudCIsICJkZW1vIiwgInNjaWQ1IiwgInNvZmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaGgiLCAibnBtZWQiLCAicG1lZCIsICJ1cmluZSIsICJod3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmQiLCAid2FzaSIsICJmbmQiLCAiYWRpciIsICJhZG9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcSIsICJicHJzIiwgInNwcWIiLCAiYmRpIiwgImNvIiwgIm1yaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJhcyIsICJic2ZzIiwgIm5wIiwgInRhc2l0IiwgInJtZXQiLCAiaXJpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29uc2VudCIsICJEZW1vZ3JhcGhpY3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQ0lELTUtUlYiLCAiU09GQVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGljYWwgSGlzdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ucHN5Y2hvdHJvcGljIE1lZGljYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVyaW5lIFRveGljb2xvZ3kgUHJlZ25hbmN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWlnaHQgV2VpZ2h0IFZpdGFscyIsICJIRFEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBU0ktSUkvV0FJUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFnZXJzdHJvbSBOaWNvdGluZSBEZXBlbmRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBREktUiIsICJBRE9TLTIiLCAiQVEiLCAiQlBSUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1BRLUIiLCAiQkRJLUlJIiwgIk5pY290aW5lIEV4cGlyZWQgQ08iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUkkiLCAiQUJBUy1JSSIsICJCU0ZTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV1cm9wc3ljaCIsICJUQVNJVCBBIiwgIlJNRVQiLCAiSVJJIikpKQoKY2FzZV9jb21wbGV0ZV9wbG90IDwtCiAgY2FzZV9hc3Nlc3NtZW50X2RmICU+JQogIHBsb3RfbHkoeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnJlY29yZF9pZCwgeiA9IH5jb21wbGV0ZSwKICAgICAgICAgIHhnYXAgPSAyLCB5Z2FwID0gMiwKICAgICAgICAgIGNvbG9ycyA9IGMoIiMyMzg4MjMiLCAiI0QyMjIyRCIsICIjRkZCRjAwIiksCiAgICAgICAgICB0eXBlID0gImhlYXRtYXAiLAogICAgICAgICAgaGVpZ2h0PTEzMDAsCiAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCcgU3ViamVjdCBJRDogJywgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBBc3Nlc3NtZW50OiAnLCBhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBTdGF0dXM6ICcsIGNvbXBsZXRlX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFJlYXNvbjogJywgcmVhc29uKSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQXNzZXNzbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja2FuZ2xlPSA0NSwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU3ViamVjdCBJRCIsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvcmFuZ2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJjYXRlZ29yeSIsCiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeW9yZGVyID0gImNhdGVnb3J5IGRlc2NlbmRpbmciLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2t2YWxzPX5yZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICBzaG93Z3JpZCA9IEZBTFNFKSkgJT4lCiAgaGlkZV9jb2xvcmJhcigpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKY2FzZV9jb21wbGV0ZV9wbG90CmBgYAoKIyMjIENvbnRyb2wKCmBgYHtyIGNvbnRyb2xfYXNzZXNzbWVudF9jb21wbGV0ZX0KY29udHJvbF9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb25zZW50IiwgImRlbW8iLCAic2NpZDUiLCAic29mYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFoaCIsICJucG1lZCIsICJwbWVkIiwgInVyaW5lIiwgImh3diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZCIsICJ3YXNpIiwgImZuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFxIiwgInNwcWIiLCAiYmRpIiwgImNvIiwgIm1yaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJhcyIsICJic2ZzIiwgIm5wIiwgInRhc2l0IiwgInJtZXQiLCAiaXJpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29uc2VudCIsICJEZW1vZ3JhcGhpY3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQ0lELTUtUlYiLCAiU09GQVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGljYWwgSGlzdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ucHN5Y2hvdHJvcGljIE1lZGljYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVyaW5lIFRveGljb2xvZ3kgUHJlZ25hbmN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWlnaHQgV2VpZ2h0IFZpdGFscyIsICJIRFEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBU0ktSUkvV0FJUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFnZXJzdHJvbSBOaWNvdGluZSBEZXBlbmRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUSIsICJTUFEtQiIsICJCREktSUkiLCAiTmljb3RpbmUgRXhwaXJlZCBDTyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SSSIsICJBQkFTLUlJIiwgIkJTRlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb3BzeWNoIiwgIlRBU0lUIEEiLCAiUk1FVCIsICJJUkkiKSkpCgpjb250cm9sX2NvbXBsZXRlX3Bsb3QgPC0KICBjb250cm9sX2Fzc2Vzc21lbnRfZGYgJT4lCiAgcGxvdF9seSh4ID0gfmFzc2Vzc21lbnQsIHkgPSB+cmVjb3JkX2lkLCB6ID0gfmNvbXBsZXRlLAogICAgICAgICAgeGdhcCA9IDIsIHlnYXAgPSAyLAogICAgICAgICAgY29sb3JzID0gYygiIzIzODgyMyIsICIjRkZCRjAwIiwgIiNEMjIyMkQiKSwKICAgICAgICAgIHR5cGUgPSAiaGVhdG1hcCIsCiAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCcgU3ViamVjdCBJRDogJywgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBBc3Nlc3NtZW50OiAnLCBhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBTdGF0dXM6ICcsIGNvbXBsZXRlX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFJlYXNvbjogJywgcmVhc29uKSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQXNzZXNzbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGUgPSA0NSwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU3ViamVjdCBJRCIsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvcmFuZ2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJjYXRlZ29yeSIsCiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeW9yZGVyID0gImNhdGVnb3J5IGRlc2NlbmRpbmciLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2t2YWxzPX5yZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICBzaG93Z3JpZCA9IEZBTFNFKSkgJT4lCiAgaGlkZV9jb2xvcmJhcigpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKY29udHJvbF9jb21wbGV0ZV9wbG90CmBgYAoKIyMgU29jaWFsIENvZ25pdGlvbiB7LnRhYnNldH0KCmBgYHtyIHNjb2dfZGF0YWZyYW1lfQpzY29nX2RmIDwtCiAgcmJpbmQoCiAgICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgICAgIHNlbGVjdChyZWNvcmRfaWQsIHN0dWR5LCBncm91cCwKICAgICAgICAgICAgIHJtZXRfdG90YWwsCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3B0LCBpcmlfZmFjdG9yX2ZzLCBpcmlfZmFjdG9yX2VjLCBpcmlfZmFjdG9yX3BkLCBpcmlfdG90YWwsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2dfZXI0MGFuZ19jb2x1bW52LCBzY29nX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCwgc2NvZ19lcjQwbm9lX2NvbHVtbnksIHNjb2dfZXI0MHNhZF9jb2x1bW56LCBzY29nX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nX2VyNDBfZnBmX2NvbHVtbmFiLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZ19lcjQwbWRydF9jb2x1bW5hciwgc2NvZ19lcjQwZXhydF9jb2x1bW5hcywKICAgICAgICAgICAgIHRhc2l0X2NvcnJlY3RfdG90YWwsIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcywgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSwKICAgIHNwaW5zX3JlZGNhcF9kZiAlPiUKICAgICAgc2VsZWN0KHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwLAogICAgICAgICAgICAgcm1ldF90b3RhbCwgc2NvZzJfcm1ldF90b3RhbCwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQsIHNjb2cyX2lyaV9mYWN0b3JfcGVyc3BlY3RpdmUsCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2ZzLCBzY29nMl9pcmlfZmFjdG9yX2ZhbnRhc3ksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2VjLCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3BkLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNvbmFsX2Rpc3RyZXNzLAogICAgICAgICAgICAgaXJpX3RvdGFsLAogICAgICAgICAgICAgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZ19lcjQwMl9jcl9jb2x1bW5wY3JfdmFsdWUsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2cyX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsCiAgICAgICAgICAgICBzY29nX2VyNDBhbmdfY29sdW1udiwgc2NvZzJfZXI0MGFuZ19jb2x1bW52LAogICAgICAgICAgICAgc2NvZ19lcjQwZmVhcl9jb2x1bW53LCBzY29nMl9lcjQwZmVhcl9jb2x1bW53LAogICAgICAgICAgICAgc2NvZ19lcjQwaGFwX2NvbHVtbngsIHNjb2cyX2VyNDBoYXBfY29sdW1ueCwKICAgICAgICAgICAgIHNjb2dfZXI0MG5vZV9jb2x1bW55LCBzY29nMl9lcjQwbm9lX2NvbHVtbnksCiAgICAgICAgICAgICBzY29nX2VyNDBzYWRfY29sdW1ueiwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LAogICAgICAgICAgICAgc2NvZ19lcjQwX2ZwYV9jb2x1bW5hYSwgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nMl9lcjQwX2ZwZl9jb2x1bW5hYiwKICAgICAgICAgICAgIHNjb2dfZXI0MG1pbGRfY29sdW1uYXAsIHNjb2cyX2VyNDBtaWxkX2NvbHVtbmFwLAogICAgICAgICAgICAgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZzJfZXI0MGV4dHJfY29sdW1uYXEsCiAgICAgICAgICAgICBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nMl9lcjQwbWRydF9jb2x1bW5hciwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4cnRfY29sdW1uYXMsIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgdGFzaXRfY29ycmVjdF90b3RhbCwgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwKICAgICAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIHRhc2l0c3VtX3AyX3RvdGFsX2l0ZW1zY29ycmVjdCwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcywgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9saWVzLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX3NhcmNhc20pICU+JQogICAgICBtdXRhdGUocm1ldF90b3RhbCA9IGlmZWxzZShpcy5uYShybWV0X3RvdGFsKSwgc2NvZzJfcm1ldF90b3RhbCwgcm1ldF90b3RhbCksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3B0ID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfcHQpLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNwZWN0aXZlLCBpcmlfZmFjdG9yX3B0KSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZnMgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9mcyksIHNjb2cyX2lyaV9mYWN0b3JfZmFudGFzeSwgaXJpX2ZhY3Rvcl9mcyksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2VjID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfZWMpLCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sIGlyaV9mYWN0b3JfZWMpLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9wZCA9IGlmZWxzZShpcy5uYShpcmlfZmFjdG9yX3BkKSwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzb25hbF9kaXN0cmVzcywgaXJpX2ZhY3Rvcl9wZCksCiAgICAgICAgICAgICBpcmlfdG90YWwgPSBpZmVsc2UoaXMubmEoaXJpX3RvdGFsKSwgaXJpX2ZhY3Rvcl9wdCArIGlyaV9mYWN0b3JfZnMgKyBpcmlfZmFjdG9yX2VjICsgaXJpX2ZhY3Rvcl9wZCwgaXJpX3RvdGFsKSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSksCiAgICAgICAgICAgICBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlLCBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUpLAogICAgICAgICAgICAgc2NvZ19lcjQwYW5nX2NvbHVtbnYgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsIHNjb2dfZXI0MGFuZ19jb2x1bW52KSwKICAgICAgICAgICAgIHNjb2dfZXI0MGZlYXJfY29sdW1udyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsIHNjb2dfZXI0MGZlYXJfY29sdW1udyksCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBoYXBfY29sdW1ueCwgc2NvZ19lcjQwaGFwX2NvbHVtbngpLAogICAgICAgICAgICAgc2NvZ19lcjQwbm9lX2NvbHVtbnkgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwbm9lX2NvbHVtbnksIHNjb2dfZXI0MG5vZV9jb2x1bW55KSwKICAgICAgICAgICAgIHNjb2dfZXI0MHNhZF9jb2x1bW56ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LCBzY29nX2VyNDBzYWRfY29sdW1ueiksCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBhX2NvbHVtbmFhID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEpLAogICAgICAgICAgICAgc2NvZ19lcjQwX2ZwZl9jb2x1bW5hYiA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nX2VyNDBfZnBmX2NvbHVtbmFiKSwKICAgICAgICAgICAgIHNjb2dfZXI0MG1pbGRfY29sdW1uYXAgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCksCiAgICAgICAgICAgICBzY29nX2VyNDBleHRyX2NvbHVtbmFxID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGV4dHJfY29sdW1uYXEsIHNjb2dfZXI0MGV4dHJfY29sdW1uYXEpLAogICAgICAgICAgICAgc2NvZ19lcjQwbWRydF9jb2x1bW5hciA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyKSwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4cnRfY29sdW1uYXMgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwZXhydF9jb2x1bW5hcywgc2NvZ19lcjQwZXhydF9jb2x1bW5hcyksCiAgICAgICAgICAgICB0YXNpdF9jb3JyZWN0X3RvdGFsID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwgdGFzaXRfY29ycmVjdF90b3RhbCksCiAgICAgICAgICAgICB0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LCB0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfbGllcywgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSwgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSkgJT4lCiAgICAgIHNlbGVjdCgtYyhzY29nMl9ybWV0X3RvdGFsLAogICAgICAgICAgICAgICAgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzcGVjdGl2ZSwgc2NvZzJfaXJpX2ZhY3Rvcl9mYW50YXN5LCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sIHNjb2cyX2lyaV9mYWN0b3JfcGVyc29uYWxfZGlzdHJlc3MsCiAgICAgICAgICAgICAgICBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZzJfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZzJfZXI0MGFuZ19jb2x1bW52LCBzY29nMl9lcjQwZmVhcl9jb2x1bW53LAogICAgICAgICAgICAgICAgc2NvZzJfZXI0MGhhcF9jb2x1bW54LCBzY29nMl9lcjQwbm9lX2NvbHVtbnksIHNjb2cyX2VyNDBzYWRfY29sdW1ueiwKICAgICAgICAgICAgICAgIHNjb2cyX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nMl9lcjQwX2ZwZl9jb2x1bW5hYiwgc2NvZzJfZXI0MG1pbGRfY29sdW1uYXAsCiAgICAgICAgICAgICAgICBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZzJfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgICAgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX2xpZXMsIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSkpKQoKIyBmaWx0ZXIgb3V0IHBhcnRpY2lwYW50cyB3aXRoIE5BIHJvd3MKc2NvZ19kZiA8LSBzY29nX2RmW3Jvd1N1bXMoaXMubmEoc2NvZ19kZikpIDwgMTgsIF0KCiMgZmlsdGVyIG91dCBUQVNJVCBzY29yZXMgd2l0aCAwCnNjb2dfZGYgPC0KICBzY29nX2RmICU+JQogIG11dGF0ZSh0YXNpdF9jb3JyZWN0X3RvdGFsID0gbmFfaWYodGFzaXRfY29ycmVjdF90b3RhbCwgMCksCiAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwgPSBuYV9pZih0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzID0gbmFfaWYodGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtID0gbmFfaWYodGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCAwKSkKYGBgCgojIyMgUk1FVAoKVGhlICoqUmVhZGluZyB0aGUgTWluZCBpbiB0aGUgRXllcyB0ZXN0IChSTUVUKSoqICBpcyBhIHRlc3Qgb2Ygc29jaWFsIHNlbnNpdGl2aXR5LiBUaGUgcGFydGljaXBhbnQgaXMgcHJlc2VudGVkIHdpdGggYSBzZXJpZXMgb2YgMzYgcGhvdG9ncmFwaHMgb2YgdGhlIGV5ZSByZWdpb24gYW5kIGFza2VkIHRvIGNob29zZSB3aGljaCBvZiA0IHdvcmRzIGJlc3QgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdG9yIGluIHRoZSBwaG90b2dyYXBoIGlzIHRoaW5raW5nIG9yIGZlZWxpbmcuCgpgYGB7ciBybWV0X2Rpc3RyaWJ1dGlvbn0KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJybWV0X3RvdGFsIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInJtZXRfdG90YWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlJNRVQgVG90YWwiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlJNRVQiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBJUkkKClRoZSAqKkludGVycGVyc29uYWwgUmVhY3Rpdml0eSBJbmRleCAoSVJJKSoqIGlzIGEgMjggaXRlbSBzZWxmLXJlcG9ydCBtZWFzdXJlIG9mIGNvZ25pdGl2ZSBhbmQgYWZmZWN0aXZlIGVtcGF0aHkuCgpgYGB7ciBpcmlfZGlzdHJpYnV0aW9ufQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoImlyaV9mYWN0b3JfcHQiLCAiaXJpX2ZhY3Rvcl9mcyIsICJpcmlfZmFjdG9yX2VjIiwgImlyaV9mYWN0b3JfcGQiLCAiaXJpX3RvdGFsIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImlyaV9mYWN0b3JfcHQiLCAiaXJpX2ZhY3Rvcl9mcyIsICJpcmlfZmFjdG9yX2VjIiwgImlyaV9mYWN0b3JfcGQiLCAiaXJpX3RvdGFsIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQZXJzcGVjdGl2ZS1UYWtpbmciLCAiRmFudGFzeSIsICJFbXBhdGhpYyBDb25jZXJuIiwgIlBlcnNvbmFsIERpc3RyZXNzIiwgIlRvdGFsIikpKSwKICAgICAgICB4ID0gfmFzc2Vzc21lbnQsIHkgPSB+c2NvcmUsIGNvbG9yID0gfmdyb3VwLCBzeW1ib2wgPSB+c3R1ZHksCiAgICAgICAgdHlwZSA9ICJib3giLCBib3hwb2ludHMgPSAiYWxsIiwgaml0dGVyID0gMC4zLCBwb2ludHBvcyA9IDAsCiAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLAogICAgICAgIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIGFzc2Vzc21lbnQsICI6ICIsIHNjb3JlKSwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJJUkkgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgojIyMgVEFTSVQtUgoKKipUaGUgQXdhcmVuZXNzIG9mIFNvY2lhbCBJbmZlcmVuY2UgVGVzdC1SZXZpc2VkIChUQVNJVC1SKSoqIGNvbnNpc3RzIG9mIGVtb3Rpb24gZXZhbHVhdGlvbiAoKipQYXJ0IDEqKiksIHNvY2lhbCBpbmZlcmVuY2UgLSBtaW5pbWFsICgqKlBhcnQgMioqKSwgYW5kIHNvY2lhbCBpbmZlcmVuY2UgLSBlbnJpY2hlZCAoKipQYXJ0IDMqKikuIEluIFBhcnQgMSwgdGhlIHBhcnRpY2lwYW50IHZpZXdzIDI4IGJyaWVmIHZpZGVvIGNsaXBzIHRvIGlkZW50aWZ5IHRoZSBlbW90aW9uIGV4cHJlc3NlZCBieSB0aGUgYWN0b3IuIEluIFBhcnQgMiBhbmQgMywgdGhlIHBhcnRpY2lwYW50IHZpZXdzIDMxIHZpZGVvdGFwZWQgdmlnbmV0dGVzIG9mIHNvY2lhbCBpbnRlcmFjdGlvbnMgaW52b2x2aW5nIGxpZXMgYW5kIHNhcmNhc20gYW5kIG1ha2VzIGp1ZGdlbWVudHMgcmVnYXJkaW5nIHdoYXQgdGhlIGluZGl2aWR1YWwgaW4gdGhlIHNjZW5lIGJlbGlldmVkIG9yIGtuZXcsIG1lYW50IGJ5IHdoYXQgaGUgb3Igc2hlIHNhaWQsIGludGVuZGVkIHRvIGRvLCBhbmQgYWN0dWFsbHkgZmVsdC4KCmBgYHtyIHRhc2l0X2Rpc3RyaWJ1dGlvbnN9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygidGFzaXRfY29ycmVjdF90b3RhbCIsICJ0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyIsICJ0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20iKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidGFzaXRfY29ycmVjdF90b3RhbCIsICJ0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyIsICJ0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBhcnQgMSIsICJQYXJ0IDIiLCAiUGFydCAzIExpZXMiLCAiUGFydCAzIFNhcmNhc20iKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRBU0lULVIgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgojIyMgRVItNDAKClRoZSAqKlBlbm4gRW1vdGlvbiBSZWNvZ25pdGlvbiBUYXNrLTQwIChFUi00MCkqKiBpcyBhIG1lYXN1cmUgb2YgZW1vdGlvbmFsIHByb2Nlc3NpbmcuIFBhcnRpY2lwYW50cyByYXRlIHRoZSBlbW90aW9uYWwgdmFsZW5jZSBvZiA0MCBmYWNlcyBkaXNwbGF5aW5nIGhhcHB5LCBzYWQgb3IgbmV1dHJhbCBleHByZXNzaW9ucyBvbiBhIDcgcG9pbnQgc2NhbGUuIAoKYGBge3IgZXI0MF9jb3JyZWN0fQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoInNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUiLCAic2NvZ19lcjQwYW5nX2NvbHVtbnYiLCAic2NvZ19lcjQwZmVhcl9jb2x1bW53IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwaGFwX2NvbHVtbngiLCAic2NvZ19lcjQwbm9lX2NvbHVtbnkiLCAic2NvZ19lcjQwc2FkX2NvbHVtbnoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwbWlsZF9jb2x1bW5hcCIsICJzY29nX2VyNDBleHRyX2NvbHVtbmFxIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUiLCAic2NvZ19lcjQwYW5nX2NvbHVtbnYiLCAic2NvZ19lcjQwZmVhcl9jb2x1bW53IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb2dfZXI0MGhhcF9jb2x1bW54IiwgInNjb2dfZXI0MG5vZV9jb2x1bW55IiwgInNjb2dfZXI0MHNhZF9jb2x1bW56IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBtaWxkX2NvbHVtbmFwIiwgInNjb2dfZXI0MGV4dHJfY29sdW1uYXEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNvcnJlY3QgUmVzcG9uc2VzIiwgIkNvcnJlY3QgQW5nZXIiLCAiQ29ycmVjdCBGZWFyIiwgIkNvcnJlY3QgSGFwcHkiLCAiQ29ycmVjdCBOZXV0cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJlY3QgU2FkIiwgIkNvcnJlY3QgTWlsZCIsICJDb3JyZWN0IEV4dHJlbWUiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVSLTQwIFN1c2JzY2FsZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NvcmUiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKQSBtZWRpYW4gcmVzcG9uc2UgdGltZSBiZWxvdyAxMDAwIHNlY29uZHMgaW5kaWNhdGVzIGluYXR0ZW50aW9uIGFuZCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGZyb20gZnVydGhlciBhbmFseXNpcy4KCmBgYHtyIGVyNDBfcnR9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygic2NvZ19lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlIiwgInNjb2dfZXI0MG1kcnRfY29sdW1uYXIiLCAic2NvZ19lcjQwZXhydF9jb2x1bW5hcyIpKSAlPiUKICAgICAgICAgIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUiLCAic2NvZ19lcjQwbWRydF9jb2x1bW5hciIsICJzY29nX2VyNDBleHJ0X2NvbHVtbmFzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb3JyZWN0IFJlc3BvbnNlcyIsICJDb3JyZWN0IE1pbGQiLCAiQ29ycmVjdCBFeHRyZW1lIikpKSwKICAgICAgICB4ID0gfmFzc2Vzc21lbnQsIHkgPSB+c2NvcmUsIGNvbG9yID0gfmdyb3VwLCBzeW1ib2wgPSB+c3R1ZHksCiAgICAgICAgdHlwZSA9ICJib3giLCBib3hwb2ludHMgPSAiYWxsIiwgaml0dGVyID0gMC4zLCBwb2ludHBvcyA9IDAsCiAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLAogICAgICAgIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIGFzc2Vzc21lbnQsICI6ICIsIHNjb3JlKSwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJFUi00MCBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lZGlhbiBSZXNwb25zZSBUaW1lIChzZWNvbmRzKSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgojIyBNUkkKCmBgYHtyIG1yaV9kYXRhZnJhbWV9CnhuYXRfZGYgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgbXJpX2RvYSwgbXJpX2Zvcm1fY29tcGxldGUpICU+JQogIGZpbHRlcihtcmlfZm9ybV9jb21wbGV0ZSAhPSAyKSAlPiUKICByZW5hbWUoZGF0ZSA9IG1yaV9kb2EpICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUEFTRCIpCgptcmlfZGYgPC0KICB4bmF0X2RmICU+JQogIGdyb3VwX2J5KHN0dWR5LCBkYXRlKSAlPiUKICBjb3VudCgpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodG90YWwgPSBjdW1zdW0obikpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgYmluZF9yb3dzKAogICAgdGFyZ2V0c19kZiAlPiUKICAgICAgbXV0YXRlKHN0dWR5ID0gInRhcmdldCIpICU+JQogICAgICByZW5hbWUodG90YWwgPSB0YXJnZXQsCiAgICAgICAgICAgICBkYXRlID0gbW9udGgpICU+JQogICAgICBzZWxlY3Qoc3R1ZHksIGRhdGUsIHRvdGFsKSkKCnBhcnRpY2lwYW50c19yZWNydWl0ZWQgPC0gbnJvdyh4bmF0X2RmKQoKbW9udGhzX29mX3N0dWR5IDwtIG5yb3coCiAgbXJpX2RmICU+JQogIGZpbHRlcihzdHVkeSA9PSAidGFyZ2V0IikgJT4lCiAgZmlsdGVyKCFkYXRlID09ICIyMDE4LTA3LTMxIikgJT4lCiAgZmlsdGVyKGRhdGUgPCBjZWlsaW5nX2RhdGUoU3lzLkRhdGUoKSwgIm1vbnRoIikpCikKCmF2Z19yZWNydWl0bWVudCA8LSByb3VuZChwYXJ0aWNpcGFudHNfcmVjcnVpdGVkIC8gbW9udGhzX29mX3N0dWR5LCBkaWdpdHMgPSAyKQpgYGAKClRodXMgZmFyLCAqKmByIHBhcnRpY2lwYW50c19yZWNydWl0ZWRgKiogcGFydGljaXBhbnRzIGhhdmUgYmVlbiBzY2FubmVkLiBUaGUgdGFyZ2V0IGlzIHRvIHNjYW4gKiozLjMzKiogcGFydGljaXBhbnRzIHBlciBtb250aCAoKio0MCoqIHBlciB5ZWFyKS4gV2UgYXJlIGN1cnJlbnRseSBhdmVyYWdpbmcgKipgciBhdmdfcmVjcnVpdG1lbnRgKiogcGFydGljaXBhbnRzIHBlciBtb250aC4KCmBgYHtyIG1yaV9wbG90fQphIDwtIGxpc3QoCiAgeCA9IHRhaWwobXJpX2RmJGRhdGUsIG4gPSAxKSwKICB5ID0gdGFpbChtcmlfZGYkdG90YWwsIG4gPSAxKSwKICB0ZXh0ID0gbXJpX2RmJHRvdGFsLAogIHhyZWYgPSAieCIsCiAgeXJlZiA9ICJ5IiwKICBzaG93YXJyb3cgPSBGQUxTRSkKCm1yaV9wbG90IDwtCiAgcGxvdF9seShtcmlfZGYsIAogICAgICAgICAgeCA9IH5kYXRlLCB5ID0gfnRvdGFsLAogICAgICAgICAgdHlwZT0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzK21hcmtlcnMnLAogICAgICAgICAgY29sb3IgPSB+c3R1ZHkpICU+JQogIGxheW91dChmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0RhdGUnLAogICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBjKGFzLkRhdGUoIjIwMTgtMDctMzEiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzLkRhdGUoKSArIDMwKSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICcjIG9mIFBhcnRpY2lwYW50cyBTY2FubmVkJywKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gYygwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmlfZGYkdG90YWxbbXJpX2RmJGRhdGUgPCBsdWJyaWRhdGU6OmNlaWxpbmdfZGF0ZShTeXMuRGF0ZSgpLCJtb250aCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAxKSkpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCm1yaV9wbG90Cgo=
Social Cognition
RMET
The Reading the Mind in the Eyes test (RMET) is a test of social sensitivity. The participant is presented with a series of 36 photographs of the eye region and asked to choose which of 4 words best describes what the actor in the photograph is thinking or feeling.
IRI
The Interpersonal Reactivity Index (IRI) is a 28 item self-report measure of cognitive and affective empathy.
TASIT-R
The Awareness of Social Inference Test-Revised (TASIT-R) consists of emotion evaluation (Part 1), social inference - minimal (Part 2), and social inference - enriched (Part 3). In Part 1, the participant views 28 brief video clips to identify the emotion expressed by the actor. In Part 2 and 3, the participant views 31 videotaped vignettes of social interactions involving lies and sarcasm and makes judgements regarding what the individual in the scene believed or knew, meant by what he or she said, intended to do, and actually felt.
ER-40
The Penn Emotion Recognition Task-40 (ER-40) is a measure of emotional processing. Participants rate the emotional valence of 40 faces displaying happy, sad or neutral expressions on a 7 point scale.
A median response time below 1000 seconds indicates inattention and should be filtered out from further analysis.