data pulled: 2023-03-27
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, 137 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=101) |
Control (N=36) |
Overall (N=137) |
| Age (years) |
|
|
|
| Mean (SD) |
21 (± 3.8) |
27 (± 4.5) |
22 (± 4.8) |
| Median [Min, Max] |
20 [15, 33] |
27 [17, 35] |
22 [15, 35] |
| Missing |
0 (0%) |
1 (2.8%) |
1 (0.7%) |
| Sex |
|
|
|
| Female |
41 (41 %) |
15 (42 %) |
56 (41 %) |
| Male |
60 (59 %) |
20 (56 %) |
80 (58 %) |
| Missing |
0 (0%) |
1 (2.8%) |
1 (0.7%) |
| Race |
|
|
|
| Asian |
14 (14 %) |
16 (44 %) |
30 (22 %) |
| Black or African American |
1 (1 %) |
6 (17 %) |
7 (5 %) |
| More than one race |
8 (8 %) |
2 (6 %) |
10 (7 %) |
| Other |
6 (6 %) |
0 (0 %) |
6 (4 %) |
| White |
72 (71 %) |
11 (31 %) |
83 (61 %) |
| Missing |
0 (0%) |
1 (2.8%) |
1 (0.7%) |
| Education (years) |
|
|
|
| Mean (SD) |
13 (± 2.2) |
16 (± 2.0) |
14 (± 2.6) |
| Median [Min, Max] |
12 [9.0, 20] |
16 [11, 20] |
13 [9.0, 20] |
| Missing |
0 (0%) |
1 (2.8%) |
1 (0.7%) |
| Estimated IQ |
|
|
|
| Mean (SD) |
110 (± 14) |
110 (± 11) |
110 (± 13) |
| Median [Min, Max] |
120 [73, 150] |
110 [96, 130] |
110 [73, 150] |
| Missing |
39 (38.6%) |
23 (63.9%) |
62 (45.3%) |
| MATRICS |
|
|
|
| Mean (SD) |
41 (± 11) |
48 (± 12) |
43 (± 11) |
| Median [Min, Max] |
43 [-3.0, 59] |
51 [16, 64] |
44 [-3.0, 64] |
| Missing |
13 (12.9%) |
8 (22.2%) |
21 (15.3%) |
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) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
NA (± NA) |
| Median [Min, Max] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
NA [NA, NA] |
| Missing |
107 (100%) |
47 (100%) |
15 (100%) |
14 (100%) |
18 (100%) |
15 (100%) |
32 (100%) |
27 (100%) |
22 (100%) |
13 (100%) |
45 (100%) |
26 (100%) |
239 (100%) |
142 (100%) |
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, 121 participants have been scanned. The
target is to scan 3.33 participants per month
(40 per year). We are currently averaging
2.28 participants per month.
Score Distributions
BSFS Section 1
BSFS Section 2
BSFS Section 3
BSFS Section 4
BSFS Section 5
BSFS Section 6
BSFS Total
Framewise Displacement
We use mriqc to
obtain image quality metrics (IQMs) for the T1w, T2w, and fMRI scans.
Below are plots of framewise displacement (FD), a measure of head motion
across time. Specifically, the average FD for each scan across all
timepoints and the percentage of FDs above a threshold of 0.5
mm are shown.
LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwYXNkX2RhdGFfcGF0aCkpewogIGdldF9yZWRjYXAoIlNQQVNEIiwgc2V0dGluZ3NfY2ZnLCBzcGFzZF9kYXRhX3BhdGgpCn0KCnNwaW5zX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUElOU197ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwaW5zX2RhdGFfcGF0aCkpIHsKICAgIGdldF9yZWRjYXAoIlNQSU5TIiwgc2V0dGluZ3NfY2ZnLCBzcGluc19kYXRhX3BhdGgpCn0KYGBgCgpgYGB7ciBjbGVhbl9kYXRhfQpzcGFzZF9yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGFzZF9kYXRhX3BhdGgsIG5hID0gYygiIiwgIk5BIiwgIk5JIiwgIklOViIsICJOQVNLIiwgIkFTS1UiKSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU4tQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSkgJT4lCiAgZmlsdGVyKHJlZGNhcF9ldmVudF9uYW1lICE9ICJjbF9hcm1fMyIpICU+JQogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHJlYWRfY3N2KHNwaW5zX2RhdGFfcGF0aCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIAogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3RvdGFsX2Nhc2UgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgpzcGluc190b3RhbF9jb250cm9sIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKc3BpbnNfcmVkY2FwX2RmIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihkZW1vX2FnZV9zdHVkeV9lbnRyeSA8IDM2KQoKCnRhcmdldHNfZGYgPC0KICByZWFkX2NzdihoZXJlKCJtZXRhZGF0YSIsICJyZWNydWl0bWVudF90YXJnZXRzLmNzdiIpKQpgYGAKClRoaXMgcmVwb3J0IGlzIG1lYW50IHRvIHByb3ZpZGUgYSBxdWljayBvdmVydmlldyBvZiB0aGUgKipTb2NpYWwgUHJvY2Vzc2VzIEluaXRpYXRpdmUgaW4gTmV1cm9iaW9sb2d5IG9mIEF1dGlzbS1zcGVjdHJ1bSBhbmQgU2NoaXpvcGhyZW5pYS1zcGVjdHJ1bSBEaXNvcmRlcnMgKFNQSU4tQVNEKSoqIHN0dWR5LiBBbGwgZGF0YSBzdW1tYXJpemVkIGhlcmUgZGVyaXZlcyBmcm9tIHRoZSBTUElOLUFTRCBwcm9qZWN0IG9uIENBTUgncyBSRURDYXAgZGF0YWJhc2UsIHRoZSBTUElOUyBwcm9qZWN0IG9uIEFIUkMncyBSRURDYXAgZGF0YWJhc2UsIGFuZCBUSUdSTGFiJ3MgWE5BVCBkYXRhYmFzZS4gVGhpcyBzdW1tYXJ5IGlzIG9ubHkgYXMgYWNjdXJhdGUgYXMgdGhlIGRhdGEgY2FwdHVyZWQgdGhlcmUuICAKCkZvciBlYWNoIG9mIHRoZSBwbG90cywgeW91IGNhbiBob3ZlciBvdmVyIHNlbGVjdGVkIGFyZWFzIHRvIHNlZSBtb3JlIG1ldGFkYXRhLiBEcmFnZ2luZyBhIHJlY3RhbmdsZSBvdmVyIGEgc3BlY2lmaWMgYXJlYSBvZiB0aGUgcGxvdCB3aWxsIHpvb20gaW4gYW5kIGRvdWJsZSBjbGlja2luZyB3aWxsIHJlc2V0IHRvIHRoZSBvcmlnaW5hbCB2aWV3LgoKIyMgRGVtb2dyYXBoaWNzIHsudGFic2V0fQoKQXMgcGFydCBvZiB0aGUgc3R1ZHkgZGVzaWduLCBvbmUgb2YgdGhlIGdvYWxzIGlzIHRvIGNvbGxlY3QgY29nbml0aXZlIGFuZCBNUiBpbWFnaW5nIGRhdGEgZnJvbSAqKjE0MCoqIHBhcnRpY2lwYW50cyAoKioxMDAgcGFydGljaXBhbnRzIHdpdGggYXV0aXNtLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKjQwIGhlYWx0aHkgY29udHJvbHMqKikuIFBhcnRpY2lwYW50cyB3aG8gZWl0aGVyIGRyb3Agb3V0LCBhcmUgd2l0aGRyYXduIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhlIHN0dWR5LCBvciB3aG9zZSBNUkkgZGF0YSBjYW5ub3QgYmUgdXNlZCB3aWxsIGJlIHJlcGxhY2VkIHVudGlsIHRoaXMgZ29hbCBpcyBhY2hpZXZlZC4gIAoKVGhlIHN0dWR5IHdpbGwgYWxzbyBsZXZlcmFnZSBwcmV2aW91c2x5IGNvbGxlY3RlZCBkYXRhIGZyb20gdGhlICoqU29jaWFsIFByb2Nlc3NlcyBJbml0aWF0aXZlIGluIE5ldXJvYmlvbG9neSBvZiBTY2hpem9waHJlbmlhcyAoU1BJTlMpKiogc3R1ZHksIHdoaWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2hpbmcgcHJvdG9jb2wuIFNQSU5TIGlzIGEgbXVsdGktc2l0ZSBzdHVkeSB0aGF0IGNvbGxlY3RlZCBjb2duaXRpdmUgYW5kIE1SIGltYWdpbmcgZGF0YSBmcm9tICoqY2xpbmljYWxseSBzdGFibGUgcGF0aWVudHMgd2l0aCBzY2hpem9waHJlbmlhLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKmhlYWx0aHkgY29udHJvbHMqKiBmcm9tIGVhY2ggb2YgKipDQU1IIChDTUgpKiosICoqWnVja2VyIEhpbGxzaWRlIEhvc3BpdGFsIChaSEgpKiogYW5kICoqTWFyeWxhbmQgUHN5Y2hpYXRyaWMgUmVzZWFyY2ggQ2VudGVyIChNUkMpKiouCgojIyMgU1BJTi1BU0QKCmBgYCB7ciBzcGFzZF9kZW1vX2RhdGFmcmFtZX0Kc3Bhc2RfZGVtb19kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwKICAgICAgICAgZGVtb19zZXhfYmlydGgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LAogICAgICAgICBkZW1vX3JhY2VfX18xX3doaXRlLCBkZW1vX3JhY2VfX18yX2JsYWNrLCBkZW1vX3JhY2VfX18zX25hdGl2ZSwKICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiwgZGVtb19yYWNlX19fNV9pc2xhbmRlciwgZGVtb19yYWNlX19fNl9vdGhlciwKICAgICAgICAgZGVtb19yYWNlX19fN19taXhlZCwgZGVtb19yYWNlX19fOF91bmtub3duLCBkZW1vX3JhY2Vfb3RoZXIsCiAgICAgICAgIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcywgbnBfY29tcG9zaXRlX3RzY29yZSwKICAgICAgICAgaGFuZF9sYXRlcmFsaXR5X3F1b3RpZW50KSAlPiUKICBtdXRhdGUoc2V4ID0gZmFjdG9yKGRlbW9fc2V4X2JpcnRoLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLCAyLCAzKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkZlbWFsZSIsICJNYWxlIiwgIkludGVyc2V4IikpLAogICAgICAgICByYWNlID0gY2FzZV93aGVuKGRlbW9fcmFjZV9fXzdfbWl4ZWQgPT0gMSB+ICJNb3JlIHRoYW4gb25lIHJhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUgPT0gMSB+ICJXaGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMl9ibGFjayA9PSAxIH4gIkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzNfbmF0aXZlID09IDEgfiAiQW1lcmljYW4gSW5kaWFuL0FsYXNrYSBOYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4gPT0gMSB+ICJBc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNV9pc2xhbmRlciA9PSAxIH4gIkhhd2FpaWFuIG9yIFBhY2lmaWMgSXNsYW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzZfb3RoZXIgPT0gMSB+ICJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fOF91bmtub3duID09IDEgfiAiVW5rbm93biBvciBub3QgcmVwb3J0ZWQiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLiksCiAgICAgICAgIGlxID0gaWZlbHNlKGlzLm5hKHdhc2lfZnNpcTRfY3MpLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcykpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBzZXgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LCByYWNlLCBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgaXEsIG5wX2NvbXBvc2l0ZV90c2NvcmUpICU+JQogIGRyb3BsZXZlbHMoKQpgYGAKClRodXMgZmFyLCAqKmByIG5yb3coc3Bhc2RfZGVtb19kZilgKiogcGFydGljaXBhbnRzIGhhdmUgY29uc2VudGVkIHRvIGJlIGluIHRoZSBzdHVkeS4gQSB0YWJsZSBzdW1tYXJpemluZyB0aGVpciBkZW1vZ3JhcGhpY3MgYXMgd2VsbCBhcyBoaXN0b2dyYW1zIG9mIHRoZWlyIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgYXJlIHNob3duIGJlbG93LiAgCgpGb3IgKiplc3RpbWF0ZWQgSVEqKiwgc3R1ZHkgcGFydGljaXBhbnRzIGVpdGhlciBjb21wbGV0ZWQgdGhlICoqV2VjaHNsZXIgQWJicmV2aWF0ZWQgU2NhbGUgb2YgSW50ZWxsaWdlbmNlIChXQVNJLUlJKSoqIG9yIHRoZSAqKldlY2hzbGVyIEFkdWx0IEludGVsbGlnZW5jZSBTY2FsZSAoV0FJUy1JVikqKi4KCmBgYHtyIHNwYXNkX2RlbW9fdGFibGV9CmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwYXNkX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGFzZF9kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgpsYWJlbChzcGFzZF9kZW1vX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmUpIDwtICJNQVRSSUNTIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGFzZF9kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSArIG5wX2NvbXBvc2l0ZV90c2NvcmUgfCBncm91cCwKICAgICAgICBkYXRhID0gc3Bhc2RfZGVtb19kZiwKICAgICAgICByZW5kZXIuY29udGludW91cyA9IG15LnJlbmRlci5jb250LCByZW5kZXIuY2F0ZWdvcmljYWwgPSBteS5yZW5kZXIuY2F0KQoKc3Bhc2RfZGVtb190YWJsZQpgYGAKCmBgYHtyIHNwYXNkX2RlbW9fZGlzdHJpYnV0aW9uc30Kc3Bhc2RfYWdlX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAxNSwgZW5kID0gMzYsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFnZSAoeWVhcnMpIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2lxX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSA3MCwgZW5kID0gMTUwLCBzaXplID0gMTApKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRpcVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGlxW3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRXN0aW1hdGVkIElRIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2FnZV9kaXN0cmlidXRpb24Kc3Bhc2RfaXFfZGlzdHJpYnV0aW9uCmBgYAoKIyMjIFNQSU5TCgpgYGB7ciBzcGluc19kZW1vX2RhdGFmcmFtZX0Kc3BpbnNfZGVtb19kZiA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgIAogCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd3Rhcl9zdGRfc2NvcmUsIHd0YXJzdW1fc3RkLAogICAgICAgICBoYW5kX2xhdGVyYWxpdHlfcXVvdGllbnQpICU+JQogIG11dGF0ZShzZXggPSBmYWN0b3IoZGVtb19zZXhfYmlydGgsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiLCAiSW50ZXJzZXgiKSksCiAgICAgICAgIHJhY2UgPSBjYXNlX3doZW4oZGVtb19yYWNlX19fN19taXhlZCA9PSAxIH4gIk1vcmUgdGhhbiBvbmUgcmFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSA9PSAxIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18yX2JsYWNrID09IDEgfiAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fM19uYXRpdmUgPT0gMSB+ICJBbWVyaWNhbiBJbmRpYW4vQWxhc2thIE5hdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiA9PSAxIH4gIkFzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX181X2lzbGFuZGVyID09IDEgfiAiSGF3YWlpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNl9vdGhlciA9PSAxIH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX184X3Vua25vd24gPT0gMSB+ICJVbmtub3duIG9yIG5vdCByZXBvcnRlZCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSwKICAgICAgICAgaXEgPSBpZmVsc2UoaXMubmEod3Rhcl9zdGRfc2NvcmUpLHd0YXJfc3RkX3Njb3JlLCB3dGFyc3VtX3N0ZCkpICU+JQogIHNlcGFyYXRlKHJlY29yZF9pZCwgYygic3R1ZHkiLCAic2l0ZSIsICJzdWIiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZSwgZ3JvdXAsIHNleCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksIHJhY2UsIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCBpcSkKYGBgCgpUaGUgdG90YWwgU1BJTlMgZGF0YXNldCBjb25zaXN0cyBvZiAqKmByIHNwaW5zX3RvdGFsX2Nhc2VgKiogcGFydGljaXBhbnRzIHdpdGggYW4gU1NEIGFuZCAqKmByIHNwaW5zX3RvdGFsX2NvbnRyb2xgKiogcGFydGljaXBhbnRzLiBBZnRlciBmaWx0ZXJpbmcgdGhlIGRhdGFzZXQgZm9yIHBhcnRpY2lwYW50cyB3aXRoaW4gdGhlIHNhbWUgYWdlIHJhbmdlIGFzIFNQSU4tQVNELCB3ZSBnZXQgdGhlIGRlbW9ncmFwaGljcyB0YWJsZSwgYW5kIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgc2hvd24gYmVsb3cuICAKCkZvciAqKmVzdGltYXRlZCBJUSoqLCBzdHVkeSBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSAqKldlY2hzbGVyIFRlc3Qgb2YgQWR1bHQgUmVhZGluZyAoV1RBUikqKi4KCmBgYHtyIHNwaW5zX2RlbW9fdGFibGV9CmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3BpbnNfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwaW5zX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGluc19kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGluc19kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSB8IHNpdGUqZ3JvdXAsCiAgICAgICAgZGF0YSA9IHNwaW5zX2RlbW9fZGYsCiAgICAgICAgcmVuZGVyLmNvbnRpbnVvdXMgPSBteS5yZW5kZXIuY29udCwgcmVuZGVyLmNhdGVnb3JpY2FsID0gbXkucmVuZGVyLmNhdCkKCnNwaW5zX2RlbW9fdGFibGUKYGBgCgpgYGB7ciBzcGluc19kZW1vX2Rpc3RyaWJ1dGlvbnN9CnNwaW5zX2FnZV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gMTcsIGVuZCA9IDM2LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UgKHllYXJzKSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19pcV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gNjAsIGVuZCA9IDEzMCwgc2l6ZSA9IDEwKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkaXFbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3BpbnNfZGVtb19kZiRpcVtzcGluc19kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVzdGltYXRlZCBJUSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19hZ2VfZGlzdHJpYnV0aW9uCnNwaW5zX2lxX2Rpc3RyaWJ1dGlvbgpgYGAKCiMjIEFzc2Vzc21lbnQgQ29tcGxldGlvbiBTdGF0dXMgey50YWJzZXR9CgpCZWxvdyBpcyBhIGhlYXRtYXAgZGVwaWN0aW5nIHdoaWNoIGFzc2Vzc21lbnRzIGhhdmUgYmVlbiBjb21wbGV0ZWQgZm9yIGVhY2ggcGFydGljaXBhbnQgaW4gU1BJTi1BU0QuIFRoZXJlIGFyZSBzZXBhcmF0ZSB0YWJzIGRpdmlkaW5nIGBDYXNlYCBhbmQgYENvbnRyb2xgIHBhcnRpY2lwYW50cy4gVGhlIGBBc3Nlc3NtZW50YCBpcyBzaG93biBpbiB0aGUgeCBheGlzIGFuZCB0aGUgYFN1YmplY3QgSURgIGlzIHNob3duIGluIHRoZSB5IGF4aXMuICoqPHNwYW4gc3R5bGU9ImNvbG9yOiMyMzg4MjMiPkdyZWVuPC9zcGFuPioqIGluZGljYXRlcyAnY29tcGxldGUnLCAqKjxzcGFuIHN0eWxlPSJjb2xvcjojRDIyMjJEIj5yZWQ8L3NwYW4+KiogaW5kaWNhdGVzICdpbmNvbXBsZXRlJyBhbmQgKio8c3BhbiBzdHlsZT0iY29sb3I6I0ZGQkYwMCI+eWVsbG93PC9zcGFuPioqIGluZGljYXRlcyBhICdwYXJ0aWFsIGNvbXBsZXRlJy4gQmxhbmsgcmVjdGFuZ2xlcyBpbmRpY2F0ZSB0aGF0IHRoZSBhc3Nlc3NtZW50IGVpdGhlciBoYXNuJ3QgYmVlbiBhdHRlbXB0ZWQgeWV0IG9yIHRoYXQgdGhlIGRhdGEgaGFzbid0IGJlZW4gZW50ZXJlZC4gWW91IGNhbiBob3ZlciBvdmVyIGVhY2ggc3F1YXJlIHRvIGdldCBtb3JlIGRldGFpbHMgb24gdGhlIHJlYXNvbiBmb3IgYW4gYXNzZXNzbWVudCBiZWluZyBpbmNvbXBsZXRlLgoKYGBge3IgYXNzZXNzbWVudF9jb21wbGV0ZX0Kc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLAogICAgICAgICBlbmRzX3dpdGgoIl9mb3JtX2NvbXBsZXRlIiksCiAgICAgICAgIGhhbmRfcmVkY2FwX2lkLAogICAgICAgICBhcV9yZWRjYXBfaWQsCiAgICAgICAgIHNwcWJfcmVkY2FwX2lkLAogICAgICAgICBiZGlfcmVkY2FwX2lkLAogICAgICAgICBpcmlfcmVkY2FwX2lkLAogICAgICAgICBlbmRzX3dpdGgoIl9leHBsYWluIiksCiAgICAgICAgIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBtdXRhdGUocmVjb3JkX2lkID0gc3RyX3JlbW92ZShyZWNvcmRfaWQsICJTUEFTRF9DTVBfIiksCiAgICAgICAgIGhhbmRfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShoYW5kX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIGhhbmRfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGFxX2Zvcm1fY29tcGxldGUgPSBpZmVsc2UoYXFfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgYXFfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIHNwcWJfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShzcHFiX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIHNwcWJfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGJkaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGJkaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBiZGlfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGlyaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGlyaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBpcmlfZm9ybV9jb21wbGV0ZSkpCgpzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX2Zvcm1fY29tcGxldGUiKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAiY29tcGxldGUiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShjb21wbGV0ZSkpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2Zvcm1fY29tcGxldGUiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZXhwbGFpbiA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9leHBsYWluIikpICU+JQogIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInJlYXNvbiIsIC1jKHJlY29yZF9pZCwgZ3JvdXApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlYXNvbikpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2V4cGxhaW4iKSkgJT4lCiAgZmlsdGVyKGFzc2Vzc21lbnQgIT0gIm5wX3ZhbGlkaXR5X2lzc3VlcyIpICU+JQogIG11dGF0ZShyZWFzb24gPSBmYWN0b3IocmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyg4OCwgODksIDkwLCA5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsIDkzLCA5NCwgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LCA5NywgOTgsIDk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcm1pbmF0ZWQgZnJvbSBzdHVkeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgYXBwb2ludG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmF0ZXIgZm9yZ290IHRvIGFkbWluaXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZSBjb25zdHJhaW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaXRoZHJldyBjb25zZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBiZSBjb250YWN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGVkIGJ1dCB3aXRoIGxlc3MgdGhhbiBiZXN0IGVmZm9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIHRvIGJlZ2luL2ZpbmlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBpbXBhaXJtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZ25pdGl2ZSBpbXBhaXJtZW50IikpKQoKc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluX290aGVyIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJyZWFzb25fb3RoZXIiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWFzb25fb3RoZXIpKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9vdGhlcl9yZWFzb25fbmMiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW4pICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW5fb3RoZXIpICU+JQogIGZpbHRlcighYXNzZXNzbWVudCAlaW4lIGMoImVsZ19wIiwgImVsZ19jdCIsICJucF9mYWN0IiwgInRlcm0iKSkgJT4lCiAgbXV0YXRlKHJlYXNvbiA9IGlmZWxzZShyZWFzb24gPT0gIk90aGVyIiwgcmVhc29uX290aGVyLCBhcy5jaGFyYWN0ZXIocmVhc29uKSksCiAgICAgICAgIGNvbXBsZXRlX3RleHQgPSBjYXNlX3doZW4oY29tcGxldGUgPT0gMSB+ICJDb21wbGV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgPT0gMiB+ICJOb3QgY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID09IDMgfiAiUGFydGlhbCIpKQpgYGAKClRoZSAqKkF1dGlzbS1TcGVjdHJ1bSBRdW90aWVudCAoQVEpKiosICoqU2NoaXpvdHlwYWwgUGVyc29uYWxpdHkgUXVlc3Rpb25uYWlyZS1CcmllZiAoU1BRLUIpKiogYW5kICoqQmVjayBEZXByZXNzaW9uIEludmVudG9yeS1JSSAoQkRJLUlJKSoqIHdlcmUgYWRkZWQgdG8gdGhlIHN0dWR5IHByb3RvY29sIHBhcnR3YXkgdGhyb3VnaCB0aGUgc3R1ZHkgYW5kIGhhdmVuJ3QgYmVlbiBjb21wbGV0ZWQgZm9yIHNldmVyYWwgcGFydGljaXBhbnRzIGF0IHRoZSBiZWdpbm5pbmcuCgojIyMgQ2FzZQoKVGhlICoqQXV0aXNtIERpYWdub3N0aWMgSW50ZXJ2aWV3LVJldmlzZWQgKEFESS1SKSoqIHdhcyBpbmNsdWRlZCBpbiB0aGUgc3R1ZHkgcHJvdG9jb2wgaW4gdGhlIGV2ZW50IG9mIGFuIGluY29uY2x1c2l2ZSBjbGluaWNhbCBkaWFnbm9zaXMgYW5kIGEgbmVlZCBmb3IgZnVydGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvbGxvd2luZyB0aGUgKipBdXRpc20gRGlhZ25vc3RpYyBPYnNlcnZhdGlvbiBTY2hlZHVsZSwgU2Vjb25kIEVkaXRpb24gKEFET1MtMikqKiAuICAKCmBgYHtyIGNhc2VfYXNzZXNzbWVudF9jb21wbGV0ZX0KY2FzZV9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb25zZW50IiwgImRlbW8iLCAic2NpZDUiLCAic29mYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFoaCIsICJucG1lZCIsICJwbWVkIiwgInVyaW5lIiwgImh3diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZCIsICJ3YXNpIiwgImZuZCIsICJhZGlyIiwgImFkb3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFxIiwgImJwcnMiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFESS1SIiwgIkFET1MtMiIsICJBUSIsICJCUFJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUFEtQiIsICJCREktSUkiLCAiTmljb3RpbmUgRXhwaXJlZCBDTyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SSSIsICJBQkFTLUlJIiwgIkJTRlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb3BzeWNoIiwgIlRBU0lUIEEiLCAiUk1FVCIsICJJUkkiKSkpCgpjYXNlX2NvbXBsZXRlX3Bsb3QgPC0KICBjYXNlX2Fzc2Vzc21lbnRfZGYgJT4lCiAgcGxvdF9seSh4ID0gfmFzc2Vzc21lbnQsIHkgPSB+cmVjb3JkX2lkLCB6ID0gfmNvbXBsZXRlLAogICAgICAgICAgeGdhcCA9IDIsIHlnYXAgPSAyLAogICAgICAgICAgY29sb3JzID0gYygiIzIzODgyMyIsICIjRDIyMjJEIiwgIiNGRkJGMDAiKSwKICAgICAgICAgIHR5cGUgPSAiaGVhdG1hcCIsCiAgICAgICAgICBoZWlnaHQ9MTMwMCwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGU9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjYXNlX2NvbXBsZXRlX3Bsb3QKYGBgCgojIyMgQ29udHJvbAoKYGBge3IgY29udHJvbF9hc3Nlc3NtZW50X2NvbXBsZXRlfQpjb250cm9sX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbnNlbnQiLCAiZGVtbyIsICJzY2lkNSIsICJzb2ZhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWhoIiwgIm5wbWVkIiwgInBtZWQiLCAidXJpbmUiLCAiaHd2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kIiwgIndhc2kiLCAiZm5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXEiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRIiwgIlNQUS1CIiwgIkJESS1JSSIsICJOaWNvdGluZSBFeHBpcmVkIENPIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVJJIiwgIkFCQVMtSUkiLCAiQlNGUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ldXJvcHN5Y2giLCAiVEFTSVQgQSIsICJSTUVUIiwgIklSSSIpKSkKCmNvbnRyb2xfY29tcGxldGVfcGxvdCA8LQogIGNvbnRyb2xfYXNzZXNzbWVudF9kZiAlPiUKICBwbG90X2x5KHggPSB+YXNzZXNzbWVudCwgeSA9IH5yZWNvcmRfaWQsIHogPSB+Y29tcGxldGUsCiAgICAgICAgICB4Z2FwID0gMiwgeWdhcCA9IDIsCiAgICAgICAgICBjb2xvcnMgPSBjKCIjMjM4ODIzIiwgIiNGRkJGMDAiLCAiI0QyMjIyRCIpLAogICAgICAgICAgdHlwZSA9ICJoZWF0bWFwIiwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiY2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2thbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjb250cm9sX2NvbXBsZXRlX3Bsb3QKYGBgCgoKCgojIyBTb2NpYWwgQ29nbml0aW9uIHsudGFic2V0fQoKYGBge3Igc2NvZ19kYXRhZnJhbWV9CnNjb2dfZGYgPC0KICByYmluZCgKICAgIHNwYXNkX3JlZGNhcF9kZiAlPiUKICAgICAgc2VsZWN0KHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwLAogICAgICAgICAgICAgcm1ldF90b3RhbCwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQsIGlyaV9mYWN0b3JfZnMsIGlyaV9mYWN0b3JfZWMsIGlyaV9mYWN0b3JfcGQsIGlyaV90b3RhbCwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZ19lcjQwYW5nX2NvbHVtbnYsIHNjb2dfZXI0MGZlYXJfY29sdW1udywKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsCiAgICAgICAgICAgICBzY29nX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgdGFzaXRfY29ycmVjdF90b3RhbCwgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pLAogICAgc3BpbnNfcmVkY2FwX2RmICU+JQogICAgICBzZWxlY3QocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXAsCiAgICAgICAgICAgICBybWV0X3RvdGFsLCBzY29nMl9ybWV0X3RvdGFsLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9wdCwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzcGVjdGl2ZSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZnMsIHNjb2cyX2lyaV9mYWN0b3JfZmFudGFzeSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMsIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcGQsIHNjb2cyX2lyaV9mYWN0b3JfcGVyc29uYWxfZGlzdHJlc3MsCiAgICAgICAgICAgICBpcmlfdG90YWwsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZzJfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MGFuZ19jb2x1bW52LCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsCiAgICAgICAgICAgICBzY29nX2VyNDBmZWFyX2NvbHVtbncsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LAogICAgICAgICAgICAgc2NvZ19lcjQwbm9lX2NvbHVtbnksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwKICAgICAgICAgICAgIHNjb2dfZXI0MHNhZF9jb2x1bW56LCBzY29nMl9lcjQwc2FkX2NvbHVtbnosCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZzJfZXI0MG1pbGRfY29sdW1uYXAsCiAgICAgICAgICAgICBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwKICAgICAgICAgICAgIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2cyX2VyNDBtZHJ0X2NvbHVtbmFyLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcywgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICB0YXNpdF9jb3JyZWN0X3RvdGFsLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX2xpZXMsCiAgICAgICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSkgJT4lCiAgICAgIG11dGF0ZShybWV0X3RvdGFsID0gaWZlbHNlKGlzLm5hKHJtZXRfdG90YWwpLCBzY29nMl9ybWV0X3RvdGFsLCBybWV0X3RvdGFsKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9wdCksIHNjb2cyX2lyaV9mYWN0b3JfcGVyc3BlY3RpdmUsIGlyaV9mYWN0b3JfcHQpLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9mcyA9IGlmZWxzZShpcy5uYShpcmlfZmFjdG9yX2ZzKSwgc2NvZzJfaXJpX2ZhY3Rvcl9mYW50YXN5LCBpcmlfZmFjdG9yX2ZzKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9lYyksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwgaXJpX2ZhY3Rvcl9lYyksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3BkID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfcGQpLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNvbmFsX2Rpc3RyZXNzLCBpcmlfZmFjdG9yX3BkKSwKICAgICAgICAgICAgIGlyaV90b3RhbCA9IGlmZWxzZShpcy5uYShpcmlfdG90YWwpLCBpcmlfZmFjdG9yX3B0ICsgaXJpX2ZhY3Rvcl9mcyArIGlyaV9mYWN0b3JfZWMgKyBpcmlfZmFjdG9yX3BkLCBpcmlfdG90YWwpLAogICAgICAgICAgICAgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlKSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSksCiAgICAgICAgICAgICBzY29nX2VyNDBhbmdfY29sdW1udiA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBhbmdfY29sdW1udiwgc2NvZ19lcjQwYW5nX2NvbHVtbnYpLAogICAgICAgICAgICAgc2NvZ19lcjQwZmVhcl9jb2x1bW53ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGZlYXJfY29sdW1udywgc2NvZ19lcjQwZmVhcl9jb2x1bW53KSwKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBoYXBfY29sdW1ueCksCiAgICAgICAgICAgICBzY29nX2VyNDBub2VfY29sdW1ueSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwbm9lX2NvbHVtbnkpLAogICAgICAgICAgICAgc2NvZ19lcjQwc2FkX2NvbHVtbnogPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MHNhZF9jb2x1bW56KSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwgc2NvZ19lcjQwX2ZwYV9jb2x1bW5hYSksCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBmX2NvbHVtbmFiID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIpLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBtaWxkX2NvbHVtbmFwKSwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4dHJfY29sdW1uYXEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSksCiAgICAgICAgICAgICBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIpLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzKSwKICAgICAgICAgICAgIHRhc2l0X2NvcnJlY3RfdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdF9jb3JyZWN0X3RvdGFsKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pKSAlPiUKICAgICAgc2VsZWN0KC1jKHNjb2cyX3JtZXRfdG90YWwsCiAgICAgICAgICAgICAgICBzY29nMl9pcmlfZmFjdG9yX3BlcnNwZWN0aXZlLCBzY29nMl9pcmlfZmFjdG9yX2ZhbnRhc3ksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2Vybiwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzb25hbF9kaXN0cmVzcywKICAgICAgICAgICAgICAgIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nMl9lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlLCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICAgICBzY29nMl9lcjQwaGFwX2NvbHVtbngsIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LAogICAgICAgICAgICAgICAgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nMl9lcjQwbWlsZF9jb2x1bW5hcCwKICAgICAgICAgICAgICAgIHNjb2cyX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwbWRydF9jb2x1bW5hciwgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICAgICB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfbGllcywgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSkpCgojIGZpbHRlciBvdXQgcGFydGljaXBhbnRzIHdpdGggTkEgcm93cwpzY29nX2RmIDwtIHNjb2dfZGZbcm93U3Vtcyhpcy5uYShzY29nX2RmKSkgPCAxOCwgXQoKIyBmaWx0ZXIgb3V0IFRBU0lUIHNjb3JlcyB3aXRoIDAKc2NvZ19kZiA8LQogIHNjb2dfZGYgJT4lCiAgbXV0YXRlKHRhc2l0X2NvcnJlY3RfdG90YWwgPSBuYV9pZih0YXNpdF9jb3JyZWN0X3RvdGFsLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCA9IG5hX2lmKHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMgPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20gPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIDApKQpgYGAKCiMjIyBSTUVUCgpUaGUgKipSZWFkaW5nIHRoZSBNaW5kIGluIHRoZSBFeWVzIHRlc3QgKFJNRVQpKiogIGlzIGEgdGVzdCBvZiBzb2NpYWwgc2Vuc2l0aXZpdHkuIFRoZSBwYXJ0aWNpcGFudCBpcyBwcmVzZW50ZWQgd2l0aCBhIHNlcmllcyBvZiAzNiBwaG90b2dyYXBocyBvZiB0aGUgZXllIHJlZ2lvbiBhbmQgYXNrZWQgdG8gY2hvb3NlIHdoaWNoIG9mIDQgd29yZHMgYmVzdCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0b3IgaW4gdGhlIHBob3RvZ3JhcGggaXMgdGhpbmtpbmcgb3IgZmVlbGluZy4KCmBgYHtyIHJtZXRfZGlzdHJpYnV0aW9ufQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoInJtZXRfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicm1ldF90b3RhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUk1FVCBUb3RhbCIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiUk1FVCIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NvcmUiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKIyMjIElSSQoKVGhlICoqSW50ZXJwZXJzb25hbCBSZWFjdGl2aXR5IEluZGV4IChJUkkpKiogaXMgYSAyOCBpdGVtIHNlbGYtcmVwb3J0IG1lYXN1cmUgb2YgY29nbml0aXZlIGFuZCBhZmZlY3RpdmUgZW1wYXRoeS4KCmBgYHtyIGlyaV9kaXN0cmlidXRpb259CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBlcnNwZWN0aXZlLVRha2luZyIsICJGYW50YXN5IiwgIkVtcGF0aGljIENvbmNlcm4iLCAiUGVyc29uYWwgRGlzdHJlc3MiLCAiVG90YWwiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIklSSSBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBUQVNJVC1SCgoqKlRoZSBBd2FyZW5lc3Mgb2YgU29jaWFsIEluZmVyZW5jZSBUZXN0LVJldmlzZWQgKFRBU0lULVIpKiogY29uc2lzdHMgb2YgZW1vdGlvbiBldmFsdWF0aW9uICgqKlBhcnQgMSoqKSwgc29jaWFsIGluZmVyZW5jZSAtIG1pbmltYWwgKCoqUGFydCAyKiopLCBhbmQgc29jaWFsIGluZmVyZW5jZSAtIGVucmljaGVkICgqKlBhcnQgMyoqKS4gSW4gUGFydCAxLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMjggYnJpZWYgdmlkZW8gY2xpcHMgdG8gaWRlbnRpZnkgdGhlIGVtb3Rpb24gZXhwcmVzc2VkIGJ5IHRoZSBhY3Rvci4gSW4gUGFydCAyIGFuZCAzLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMzEgdmlkZW90YXBlZCB2aWduZXR0ZXMgb2Ygc29jaWFsIGludGVyYWN0aW9ucyBpbnZvbHZpbmcgbGllcyBhbmQgc2FyY2FzbSBhbmQgbWFrZXMganVkZ2VtZW50cyByZWdhcmRpbmcgd2hhdCB0aGUgaW5kaXZpZHVhbCBpbiB0aGUgc2NlbmUgYmVsaWV2ZWQgb3Iga25ldywgbWVhbnQgYnkgd2hhdCBoZSBvciBzaGUgc2FpZCwgaW50ZW5kZWQgdG8gZG8sIGFuZCBhY3R1YWxseSBmZWx0LgoKYGBge3IgdGFzaXRfZGlzdHJpYnV0aW9uc30KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpKSAlPiUKICAgICAgICAgIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUGFydCAxIiwgIlBhcnQgMiIsICJQYXJ0IDMgTGllcyIsICJQYXJ0IDMgU2FyY2FzbSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVEFTSVQtUiBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBFUi00MAoKVGhlICoqUGVubiBFbW90aW9uIFJlY29nbml0aW9uIFRhc2stNDAgKEVSLTQwKSoqIGlzIGEgbWVhc3VyZSBvZiBlbW90aW9uYWwgcHJvY2Vzc2luZy4gUGFydGljaXBhbnRzIHJhdGUgdGhlIGVtb3Rpb25hbCB2YWxlbmNlIG9mIDQwIGZhY2VzIGRpc3BsYXlpbmcgaGFwcHksIHNhZCBvciBuZXV0cmFsIGV4cHJlc3Npb25zIG9uIGEgNyBwb2ludCBzY2FsZS4gCgpgYGB7ciBlcjQwX2NvcnJlY3R9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBoYXBfY29sdW1ueCIsICJzY29nX2VyNDBub2VfY29sdW1ueSIsICJzY29nX2VyNDBzYWRfY29sdW1ueiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBtaWxkX2NvbHVtbmFwIiwgInNjb2dfZXI0MGV4dHJfY29sdW1uYXEiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwaGFwX2NvbHVtbngiLCAic2NvZ19lcjQwbm9lX2NvbHVtbnkiLCAic2NvZ19lcjQwc2FkX2NvbHVtbnoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb2dfZXI0MG1pbGRfY29sdW1uYXAiLCAic2NvZ19lcjQwZXh0cl9jb2x1bW5hcSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29ycmVjdCBSZXNwb25zZXMiLCAiQ29ycmVjdCBBbmdlciIsICJDb3JyZWN0IEZlYXIiLCAiQ29ycmVjdCBIYXBweSIsICJDb3JyZWN0IE5ldXRyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ycmVjdCBTYWQiLCAiQ29ycmVjdCBNaWxkIiwgIkNvcnJlY3QgRXh0cmVtZSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRVItNDAgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpBIG1lZGlhbiByZXNwb25zZSB0aW1lIGJlbG93IDEwMDAgc2Vjb25kcyBpbmRpY2F0ZXMgaW5hdHRlbnRpb24gYW5kIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgoKYGBge3IgZXI0MF9ydH0KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUiLCAic2NvZ19lcjQwbWRydF9jb2x1bW5hciIsICJzY29nX2VyNDBleHJ0X2NvbHVtbmFzIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSIsICJzY29nX2VyNDBtZHJ0X2NvbHVtbmFyIiwgInNjb2dfZXI0MGV4cnRfY29sdW1uYXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNvcnJlY3QgUmVzcG9uc2VzIiwgIkNvcnJlY3QgTWlsZCIsICJDb3JyZWN0IEV4dHJlbWUiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVSLTQwIFN1c2JzY2FsZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVkaWFuIFJlc3BvbnNlIFRpbWUgKHNlY29uZHMpIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIE1SSQoKYGBge3IgbXJpX2RhdGFmcmFtZX0KeG5hdF9kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hLCBtcmlfZm9ybV9jb21wbGV0ZSkgJT4lCiAgZmlsdGVyKG1yaV9mb3JtX2NvbXBsZXRlICE9IDIpICU+JQogIHJlbmFtZShkYXRlID0gbXJpX2RvYSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQQVNEIikKCm1yaV9kZiA8LQogIHhuYXRfZGYgJT4lCiAgZ3JvdXBfYnkoc3R1ZHksIGRhdGUpICU+JQogIGNvdW50KCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0b3RhbCA9IGN1bXN1bShuKSkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBiaW5kX3Jvd3MoCiAgICB0YXJnZXRzX2RmICU+JQogICAgICBtdXRhdGUoc3R1ZHkgPSAidGFyZ2V0IikgJT4lCiAgICAgIHJlbmFtZSh0b3RhbCA9IHRhcmdldCwKICAgICAgICAgICAgIGRhdGUgPSBtb250aCkgJT4lCiAgICAgIHNlbGVjdChzdHVkeSwgZGF0ZSwgdG90YWwpKQoKcGFydGljaXBhbnRzX3JlY3J1aXRlZCA8LSBucm93KHhuYXRfZGYpCgptb250aHNfb2Zfc3R1ZHkgPC0gbnJvdygKICBtcmlfZGYgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJ0YXJnZXQiKSAlPiUKICBmaWx0ZXIoIWRhdGUgPT0gIjIwMTgtMDctMzEiKSAlPiUKICBmaWx0ZXIoZGF0ZSA8IGNlaWxpbmdfZGF0ZShTeXMuRGF0ZSgpLCAibW9udGgiKSkKKQoKYXZnX3JlY3J1aXRtZW50IDwtIHJvdW5kKHBhcnRpY2lwYW50c19yZWNydWl0ZWQgLyBtb250aHNfb2Zfc3R1ZHksIGRpZ2l0cyA9IDIpCmBgYAoKVGh1cyBmYXIsICoqYHIgcGFydGljaXBhbnRzX3JlY3J1aXRlZGAqKiBwYXJ0aWNpcGFudHMgaGF2ZSBiZWVuIHNjYW5uZWQuIFRoZSB0YXJnZXQgaXMgdG8gc2NhbiAqKjMuMzMqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoICgqKjQwKiogcGVyIHllYXIpLiBXZSBhcmUgY3VycmVudGx5IGF2ZXJhZ2luZyAqKmByIGF2Z19yZWNydWl0bWVudGAqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoLgoKYGBge3IgbXJpX3Bsb3R9CmEgPC0gbGlzdCgKICB4ID0gdGFpbChtcmlfZGYkZGF0ZSwgbiA9IDEpLAogIHkgPSB0YWlsKG1yaV9kZiR0b3RhbCwgbiA9IDEpLAogIHRleHQgPSBtcmlfZGYkdG90YWwsCiAgeHJlZiA9ICJ4IiwKICB5cmVmID0gInkiLAogIHNob3dhcnJvdyA9IEZBTFNFKQoKbXJpX3Bsb3QgPC0KICBwbG90X2x5KG1yaV9kZiwgCiAgICAgICAgICB4ID0gfmRhdGUsIHkgPSB+dG90YWwsCiAgICAgICAgICB0eXBlPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsCiAgICAgICAgICBjb2xvciA9IH5zdHVkeSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnRGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoYXMuRGF0ZSgiMjAxOC0wNy0zMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXMuRGF0ZSgpICsgMzApKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJyMgb2YgUGFydGljaXBhbnRzIFNjYW5uZWQnLAogICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBjKDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yaV9kZiR0b3RhbFttcmlfZGYkZGF0ZSA8IGx1YnJpZGF0ZTo6Y2VpbGluZ19kYXRlKFN5cy5EYXRlKCksIm1vbnRoIildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDEpKSkpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKbXJpX3Bsb3QKCmBgYAoKCmBgYHtyIHNwaW5zIHogdHJhbnNmb3JtYXRpb24sIGluY2x1ZGU9RkFMU0V9CnNwaW5fbnBfZGYgPC0KIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL3NwaW5fbnBfZGYuY3N2IikKCiN6c2NvcmVfZGYgPSBkYXRhLmZyYW1lKCkKY2FzZXMgPSBzcGluX25wX2RmW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAnY2FzZScsXQpjb250cm9scyA9IHNwaW5fbnBfZGZbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICdjb250cm9sJyxdCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX01BVFJJQ1MgPSAoY2FzZXMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX01BVFJJQ1MgPSAoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX1JNRVQgPSBtZWFuKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9STUVUID0gc2QoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9STUVUID0gKGNhc2VzJHNjb2dfcm1ldF90b3RhbCAtIG1lYW5fUk1FVCkgLyBzZF9STUVUCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9STUVUKQoKbWVhbl9STUVUID0gbWVhbihjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfUk1FVCA9IHNkKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfUk1FVCA9IChjb250cm9scyRzY29nX3JtZXRfdG90YWwgLSBtZWFuX1JNRVQpIC8gc2RfUk1FVAojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfUk1FVCkKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTID0gKGNhc2VzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTID0gKGNvbnRyb2xzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fSVEgPSBtZWFuKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCnNkX0lRID0gc2QoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0lRID0gKGNhc2VzJHd0YXJfc3RkX3Njb3JlIC0gbWVhbl9JUSkgLyBzZF9JUQojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfSVEpCgptZWFuX0lRID0gbWVhbihjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpzZF9JUSA9IHNkKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9JUSA9IChjb250cm9scyR3dGFyX3N0ZF9zY29yZSAtIG1lYW5fSVEpIC8gc2RfSVEKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0lRKQoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfTUFUUklDUyxjb250cm9scyR6c2NvcmVfTUFUUklDUyxjYXNlcyR6c2NvcmVfUk1FVCxjb250cm9scyR6c2NvcmVfUk1FVCxjYXNlcyR6c2NvcmVfSVEsIGNvbnRyb2xzJHpzY29yZV9JUSwgY2FzZXMkenNjb3JlX0JTRlMsY29udHJvbHMkenNjb3JlX0JTRlMpCgp6c2NvcmVfZGY9IHJiaW5kKGNhc2VzLGNvbnRyb2xzKQoKI3NwaW5fbnBfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNzcGluX25wX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMxID0gKGNhc2VzJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMSA9IChjb250cm9scyRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY2FzZXMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMzID0gKGNhc2VzJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyA9IChjb250cm9scyRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzQgPSAoY2FzZXMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM0PSAoY29udHJvbHMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWM1ID0gKGNhc2VzJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNSA9IChjb250cm9scyRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzYgPSAoY2FzZXMkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM2ID0gKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfQlNGU19zZWMxLCBjb250cm9scyR6c2NvcmVfQlNGU19zZWMxLGNhc2VzJHpzY29yZV9CU0ZTX3NlYzIsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIsY2FzZXMkenNjb3JlX0JTRlNfc2VjMywgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyxjYXNlcyR6c2NvcmVfQlNGU19zZWM0LCBjb250cm9scyR6c2NvcmVfQlNGU19zZWM0LGNhc2VzJHpzY29yZV9CU0ZTX3NlYzUsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzUsY2FzZXMkenNjb3JlX0JTRlNfc2VjNiwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNikKenNjb3JlX2RmPSByYmluZChjYXNlcyxjb250cm9scykKCgoKYGBgCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQlNGU19kZi5jc3YiKSU+JQogIAptdXRhdGUoc3R1ZHkgPSAiU1BBU0QiLAogICAgICAgICBncm91cCA9IGNhc2Vfd2hlbihncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ2FzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDb250cm9sIikgJT4lCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKC4pKSAlPiUgICAgICAgCnNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCmJzZnNfYXNkX2Nhc2UgPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKYnNmc19hc2RfY29udHJvbCA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDb250cm9sIikgJT4lCiAgbnJvdygpCgpCU0ZTX2RmJGJzZnNfYXNkX3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWNfZ3JhbmR0b3RhbDEnLCAnYnNmc19zZWNfZ3JhbmR0b3RhbDInKV0sIG5hLnJtPVRSVUUpCkJTRlNfZGZbQlNGU19kZiRic2ZzX2FzZF90b3RhbCA9PTAsJ2JzZnNfYXNkX3RvdGFsJ10gPC0gTkEKCgojQlNGU19kZiRic2ZzX3NlYzdfdG90YWw9cmJpbmQoYnNmc19zZWM3X3lfdG90YWxfN2EsIGJzZnNfc2VjN19uX3RvdGFsXzdiKQoKI0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNCU0ZTX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCgpgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKQUJBU19kZjwtCiAgIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL0FCQVNfZGYuY3N2IikgJT4lCiAgCm11dGF0ZShzdHVkeSA9ICJTUEFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKc2VsZWN0KC1jKHJlZGNhcF9ldmVudF9uYW1lKSkgJT4lCiAgZ3JvdXBfYnkocmVjb3JkX2lkKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAiZG93biIpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJ1cCIpICU+JQogIHNsaWNlKDEpICU+JQogIHVuZ3JvdXAoKQoKYWJhc19hc2RfY2FzZSA8LQogIEFCQVNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgphYmFzX2FzZF9jb250cm9sIDwtCiAgQUJBU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCkFCQVNfZGYkYWJhc19hc2RfdG90YWwgPC0gcm93U3VtcyhBQkFTX2RmWyxjKCdhYmFzX2dhYycsICdhYmFzX2dhYzEnLCAiYWJhc19nYWMyIildLCBuYS5ybT1UUlVFKQpBQkFTX2RmW0FCQVNfZGYkYWJhc19hc2RfdG90YWwgPT0gMCwnYWJhc19hc2RfdG90YWwnXSA8LSBOQSAKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpzcGFzZF9kZW1vX2RmIApjYXNlX2FzZCA9IHNwYXNkX2RlbW9fZGZbc3Bhc2RfZGVtb19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBzcGFzZF9kZW1vX2RmW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSdDb250cm9sJyxdCgptZWFuX01BVFJJQ1NzZCA9IG1lYW4oY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTc2QgPSBzZChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QgPSAoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDU3NkKSAvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWVhbl9NQVRSSUNTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDU3NkID0gc2QoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkID0gKGNhc2VfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1NzZCkvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWF0cmljc19hc2RfenNjb3JlID0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCxjb250cm9sX2FzZCR6c2NvcmVfTUFUUklDU3NkKQoKbWF0cmljc19hc2RfenNjb3JlID0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmCgpjYXNlX2FzZCA9IEJTRlNfZGZbQlNGU19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBCU0ZTX2RmW0JTRlNfZGYkZ3JvdXA9PSdDb250cm9sJyxdCiAKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZCA9IChjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCA9IChjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKI2JzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKI2JzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCwgQlNGU19kZikKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxID0gKGNhc2VfYXNkJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEgPSAoY29udHJvbF9hc2QkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMiA9IChjYXNlX2FzZCRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMyID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMgPSAoY2FzZV9hc2QkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMyA9IChjb250cm9sX2FzZCRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0ID0gKGNhc2VfYXNkJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQ9IChjb250cm9sX2FzZCRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1ID0gKGNhc2VfYXNkJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUgPSAoY29udHJvbF9hc2QkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNiA9IChjYXNlX2FzZCRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM2ID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKCmJzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMyLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMzLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM2LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYpCmJzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CkFCQVNfZGYKCmNhc2VfYXNkID0gQUJBU19kZltBQkFTX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IEFCQVNfZGZbQUJBU19kZiRncm91cD09J0NvbnRyb2wnLF0KCm1lYW5fQUJBU3NkID0gbWVhbihjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCnNkX0FCQVNzZD0gc2QoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkID0gKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsIC0gbWVhbl9BQkFTc2QpIC8gc2RfQUJBU3NkCgptZWFuX0FCQVNzZCA9IG1lYW4oY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpzZF9BQkFTc2Q9IHNkKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0FCQVNzZCA9IChjYXNlX2FzZCRhYmFzX2FzZF90b3RhbCAtIG1lYW5fQUJBU3NkKSAvIHNkX0FCQVNzZAoKCmFiYXNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0FCQVNzZCxjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkKQphYmFzX2FzZF96c2NvcmU9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCAsIEFCQVNfZGYpCiN6c2NvcmVfYXNkPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQUJBU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QsY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKCiNBQkFTX2RmIDwtIHJiaW5kKHNwYXNkX2RlbW9fZGYsQlNGU19kZikKCgpgYGAKCgoKYGBge3J9CgojbWF0cmljcyBzY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9NQVRSSUNTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNSTUVUIFNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX1JNRVQpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAojQmlyY2h3b29kIFNGUyBTY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9CU0ZTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNFc3RpbWF0ZWQgSVEgb2Ygc3BpbnMgdmlvbGluIHBsb3QgCiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0lRKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCmBgYAoKYGBge3J9CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0JTRlMpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpCmBgYAoKIyMgU2NvcmUgRGlzdHJpYnV0aW9ucyAKYGBge3J9CgptYXRyaWNzX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gLTYsIGVuZCA9IDUsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSAoeCA9IH56c2NvcmVfZGYkenNjb3JlX01BVFJJQ1NbenNjb3JlX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2hpc3RvZ3JhbSAoeCA9IH56c2NvcmVfZGYkenNjb3JlX01BVFJJQ1NbenNjb3JlX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5tYXRyaWNzX2FzZF96c2NvcmUkenNjb3JlX01BVFJJQ1NzZFttYXRyaWNzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGFkZF9oaXN0b2dyYW0gKHg9IH5tYXRyaWNzX2FzZF96c2NvcmUkenNjb3JlX01BVFJJQ1NzZFttYXRyaWNzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKICAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTUFUUklDUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptYXRyaWNzX2Rpc3RyaWJ1dGlvbgpgYGAKCgoKCkJTRlMgU2VjdGlvbiAxCmBgYHtyfQpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzFfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uCmBgYAoKCkJTRlMgU2VjdGlvbiAyCmBgYHtyfQpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMyX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uCmBgYApCU0ZTIFNlY3Rpb24gMwpgYGB7cn0KCkJTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMzX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjM19kaXN0cmlidXRpb24KCmBgYAoKCgoKCgpCU0ZTIFNlY3Rpb24gNApgYGB7cn0KQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM0X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbgoKYGBgCgpCU0ZTIFNlY3Rpb24gNQpgYGB7cn0KQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM1X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbgpgYGAKCkJTRlMgU2VjdGlvbiA2CmBgYHtyfQpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDYwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM2X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzZfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uCgpgYGAKCkJTRlMgVG90YWwKYGBge3IgZWNobz1GQUxTRX0KQlNGU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9ODAsIGVuZCA9IDIwMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19kaXN0cmlidXRpb24KCmBgYAoKCmBgYHtyfQoKQUJBU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IC02LCBlbmQgPSA1LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5hYmFzX2FzZF96c2NvcmUkenNjb3JlX0FCQVNzZFthYmFzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIiBDYXNlIFNQSU4tQVNEIikgICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5hYmFzX2FzZF96c2NvcmUkenNjb3JlX0FCQVNzZFthYmFzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFCQVMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKCkFCQVNfZGlzdHJpYnV0aW9uCmBgYCAKCgogIAojIyMgRnJhbWV3aXNlIERpc3BsYWNlbWVudAoKV2UgdXNlIFttcmlxY10oaHR0cHM6Ly9tcmlxYy5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvaW5kZXguaHRtbCkgdG8gb2J0YWluIGltYWdlIHF1YWxpdHkgbWV0cmljcyAoSVFNcykgZm9yIHRoZSBUMXcsIFQydywgYW5kIGZNUkkgc2NhbnMuIEJlbG93IGFyZSBwbG90cyBvZiBmcmFtZXdpc2UgZGlzcGxhY2VtZW50IChGRCksIGEgbWVhc3VyZSBvZiBoZWFkIG1vdGlvbiBhY3Jvc3MgdGltZS4gU3BlY2lmaWNhbGx5LCB0aGUgYXZlcmFnZSBGRCBmb3IgZWFjaCBzY2FuIGFjcm9zcyBhbGwgdGltZXBvaW50cyBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgRkRzIGFib3ZlIGEgdGhyZXNob2xkIG9mICoqMC41IG1tKiogYXJlIHNob3duLgoKYGBge3J9CnNwYXNkX21yaXFjX2JvbGRfZGYgPC0KICByZWFkX3RzdigKICAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BBU0QudHN2IikKICApICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOLUFTRCIsCiAgICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc3ViamVjdF9pZCA9IHBhc3RlKCJTUEFTRCIsIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDEsIDMpLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCA0LCAxMCksIHNlcCA9ICJfIikgJT4lIGdzdWIoIkNNSCIsICJDTVAiLCAuKSwKICAgICAgICAgYWNxdWlzaXRpb24gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAiYWNxLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0gJT4lIGdzdWIoIlxcZCIsICIiLCAuKQogICAgICAgICApICU+JQogIGxlZnRfam9pbihzcGFzZF9yZWRjYXBfZGYgJT4lIHNlbGVjdChyZWNvcmRfaWQsIG1yaV9kb2EpLCBieSA9IGMoInN1YmplY3RfaWQiID0gInJlY29yZF9pZCIpKQoKc3BpbnNfc3ViamVjdHMgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lIAogIHNlbGVjdChyZWNvcmRfaWQpICU+JSAKICB1bmxpc3QoKQoKc3BpbnNfbXJpcWNfYm9sZF9kZiA8LQogcmVhZF90c3YoCiAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BJTlMudHN2IikKICkgJT4lCiBtdXRhdGUoc3R1ZHkgPSAiU1BJTlMiLAogICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgIGZ1bGxfc3ViamVjdF9pZCA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJzdWItKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BOMDEiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpLAogICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHNjYW5fdHlwZSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJ0YXNrLShbWzphbG51bTpdXSspXyIpWywyXSkgJT4lCiBmaWx0ZXIoc3ViamVjdF9pZCAlaW4lIHNwaW5zX3N1YmplY3RzKQoKbXJpcWNfYm9sZF9kZiA8LQogYmluZF9yb3dzKHNwYXNkX21yaXFjX2JvbGRfZGYsIHNwaW5zX21yaXFjX2JvbGRfZGYpICU+JQogbXV0YXRlKHNjYW5fdHlwZSA9IGZhY3RvcihzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInJlc3QiLCAiaW1pIiwgIm9icyIsICJlbXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUmVzdGluZyBTdGF0ZSIsICJJbWl0YXRlIiwgIk9ic2VydmUiLCAiRW1wYXRoaWMgQWNjdXJhY3kiKSkpICU+JQogc2VsZWN0KHN0dWR5LCBzdWJqZWN0X2lkLCBzY2FuX3R5cGUsIGZkX21lYW4sIGZkX3BlcmMsIG1yaV9kb2EpCmBgYAoKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX21lYW4sIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IE1lYW4gRkQ6ICIsIGZkX21lYW4pLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gU2NhbiBUeXBlOiAiLCBzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVhbiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IEZEICU6ICIsIGZkX3BlcmMpLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KG1yaXFjX2JvbGRfZGYgJT4lIG11dGF0ZShzdHVkeT1hcy5mYWN0b3Ioc3R1ZHkpKSwgeCA9IH5tcmlfZG9hLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnNjYW5fdHlwZSwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVyY2VudGFnZSBvZiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50cyBBYm92ZSBUaHJlc2hvbGQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYA==
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.