data pulled: 2024-06-18
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, 155 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=117) |
Control (N=38) |
Overall (N=155) |
| Age (years) |
|
|
|
| Mean (SD) |
21 (± 4.3) |
27 (± 4.8) |
22 (± 5.0) |
| Median [Min, Max] |
20 [15, 35] |
27 [17, 35] |
21 [15, 35] |
| Missing |
0 (0%) |
1 (2.6%) |
1 (0.6%) |
| Sex |
|
|
|
| Female |
50 (43 %) |
16 (42 %) |
66 (43 %) |
| Male |
67 (57 %) |
21 (55 %) |
88 (57 %) |
| Missing |
0 (0%) |
1 (2.6%) |
1 (0.6%) |
| Race |
|
|
|
| Asian |
16 (14 %) |
17 (45 %) |
33 (21 %) |
| Black or African American |
4 (3 %) |
6 (16 %) |
10 (6 %) |
| More than one race |
10 (9 %) |
2 (5 %) |
12 (8 %) |
| Other |
6 (5 %) |
0 (0 %) |
6 (4 %) |
| White |
81 (69 %) |
12 (32 %) |
93 (60 %) |
| Missing |
0 (0%) |
1 (2.6%) |
1 (0.6%) |
| Education (years) |
|
|
|
| Mean (SD) |
13 (± 2.2) |
16 (± 2.1) |
14 (± 2.5) |
| Median [Min, Max] |
12 [9.0, 20] |
16 [11, 20] |
13 [9.0, 20] |
| Missing |
0 (0%) |
1 (2.6%) |
1 (0.6%) |
| Estimated IQ |
|
|
|
| Mean (SD) |
110 (± 15) |
110 (± 14) |
110 (± 14) |
| Median [Min, Max] |
120 [73, 150] |
120 [84, 140] |
120 [73, 150] |
| Missing |
3 (2.6%) |
2 (5.3%) |
5 (3.2%) |
| MATRICS |
|
|
|
| Mean (SD) |
41 (± 11) |
49 (± 12) |
43 (± 12) |
| Median [Min, Max] |
42 [-3.0, 59] |
52 [16, 75] |
44 [-3.0, 75] |
| Missing |
8 (6.8%) |
4 (10.5%) |
12 (7.7%) |
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.
Score Distributions
Birchwood Social Functioning Scale:
A self-report questionnaire designed to reflect the social skills and
performances of patients
BSFS Section 1 -Assess Social Engagement/Withdrawn
with a total score between 0 and 15 ex hours spent alone vs leaving the
house
BSFS Section 2 -Looks at Interpersonal Communication
and Relationships with a total score between 0 and 30 ex having someone
to discuss problems with
BSFS Section 3 -Focuses on Interpersonal Prosocial
activities ex going visiting relatives and going to the movies, with a
total score between 0 and 66
BSFS Section 4 -Looks at patients involvement in
Recreational Activities with a score between 0 and 48 ex cooking and
playing an instrument
BSFS Section 5 -Assess the patients Independence
Performance with a score between 0 and 39 ex preparing and cooking a
meal
BSFS Section 6 -Looks at patience Independence
Competence with a score between 0-39 ex washing own clothes
BSFS Grand Total
Adaptive Behavior Assessment System (ABAS)
-This assessment helps describe a person’s general adaptive behavior
as well as functioning in 11 related adaptive skill areas ex.
communication, self-care and work
MATRICS Score
Intended to provide a relatively brief evaluation of key cognitive
domains relevant to schizophrenia and related disorders, and was
designed to address the following purposes: As an outcome measure for
clinical trials of cognition-enhancing drugs for schizophrenia.
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.
MRI
Thus far, 138 participants have been scanned. The
target is to scan 3.33 participants per month
(40 per year). We are currently averaging
2.6 participants per month.
LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgpzdHVkeV9zZXR0aW5ncyA8LSBldmFsLmNvbmZpZyhmaWxlID0gc2V0dGluZ3NfY2ZnLCBjb25maWcgPSAiU1BBU0QiKQoKaWYgKCFmaWxlLmV4aXN0cyhzcGFzZF9kYXRhX3BhdGgpKXsKICBnZXRfcmVkY2FwKCJTUEFTRCIsIHNldHRpbmdzX2NmZywgc3Bhc2RfZGF0YV9wYXRoKQp9CgpzcGluc19kYXRhX3BhdGggPC0gZ2x1ZShoZXJlKCJkYXRhL2NsaW5pY2FsL3JlZGNhcF9leHBvcnRfU1BJTlNfe2RhdGV9LmNzdiIpKQoKaWYgKCFmaWxlLmV4aXN0cyhzcGluc19kYXRhX3BhdGgpKSB7CiAgICBnZXRfcmVkY2FwKCJTUElOUyIsIHNldHRpbmdzX2NmZywgc3BpbnNfZGF0YV9wYXRoKQp9CmBgYAoKYGBge3IgY2xlYW5fZGF0YX0Kc3Bhc2RfcmVkY2FwX2RmIDwtCiAgcmVhZF9jc3Yoc3Bhc2RfZGF0YV9wYXRoLCBuYSA9IGMoIiIsICJOQSIsICJOSSIsICJJTlYiLCAiTkFTSyIsICJBU0tVIikpICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOLUFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLikpICU+JQogIGZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2xfYXJtXzMiKSAlPiUKICBzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgpzcGluc19yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGluc19kYXRhX3BhdGgpICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOUyIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKICBzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgpzcGluc190b3RhbF9jYXNlIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKc3BpbnNfdG90YWxfY29udHJvbCA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBmaWx0ZXIoZGVtb19hZ2Vfc3R1ZHlfZW50cnkgPCAzNikKCgp0YXJnZXRzX2RmIDwtCiAgcmVhZF9jc3YoaGVyZSgibWV0YWRhdGEiLCAicmVjcnVpdG1lbnRfdGFyZ2V0cy5jc3YiKSkKYGBgCgpUaGlzIHJlcG9ydCBpcyBtZWFudCB0byBwcm92aWRlIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlICoqU29jaWFsIFByb2Nlc3NlcyBJbml0aWF0aXZlIGluIE5ldXJvYmlvbG9neSBvZiBBdXRpc20tc3BlY3RydW0gYW5kIFNjaGl6b3BocmVuaWEtc3BlY3RydW0gRGlzb3JkZXJzIChTUElOLUFTRCkqKiBzdHVkeS4gQWxsIGRhdGEgc3VtbWFyaXplZCBoZXJlIGRlcml2ZXMgZnJvbSB0aGUgU1BJTi1BU0QgcHJvamVjdCBvbiBDQU1IJ3MgUkVEQ2FwIGRhdGFiYXNlLCB0aGUgU1BJTlMgcHJvamVjdCBvbiBBSFJDJ3MgUkVEQ2FwIGRhdGFiYXNlLCBhbmQgVElHUkxhYidzIFhOQVQgZGF0YWJhc2UuIFRoaXMgc3VtbWFyeSBpcyBvbmx5IGFzIGFjY3VyYXRlIGFzIHRoZSBkYXRhIGNhcHR1cmVkIHRoZXJlLiAgCgpGb3IgZWFjaCBvZiB0aGUgcGxvdHMsIHlvdSBjYW4gaG92ZXIgb3ZlciBzZWxlY3RlZCBhcmVhcyB0byBzZWUgbW9yZSBtZXRhZGF0YS4gRHJhZ2dpbmcgYSByZWN0YW5nbGUgb3ZlciBhIHNwZWNpZmljIGFyZWEgb2YgdGhlIHBsb3Qgd2lsbCB6b29tIGluIGFuZCBkb3VibGUgY2xpY2tpbmcgd2lsbCByZXNldCB0byB0aGUgb3JpZ2luYWwgdmlldy4KCiMjIERlbW9ncmFwaGljcyB7LnRhYnNldH0KCkFzIHBhcnQgb2YgdGhlIHN0dWR5IGRlc2lnbiwgb25lIG9mIHRoZSBnb2FscyBpcyB0byBjb2xsZWN0IGNvZ25pdGl2ZSBhbmQgTVIgaW1hZ2luZyBkYXRhIGZyb20gKioxNDAqKiBwYXJ0aWNpcGFudHMgKCoqMTAwIHBhcnRpY2lwYW50cyB3aXRoIGF1dGlzbS1zcGVjdHJ1bSBkaXNvcmRlcnMqKiBhbmQgKio0MCBoZWFsdGh5IGNvbnRyb2xzKiopLiBQYXJ0aWNpcGFudHMgd2hvIGVpdGhlciBkcm9wIG91dCwgYXJlIHdpdGhkcmF3biBwcmlvciB0byBjb21wbGV0aW5nIHRoZSBzdHVkeSwgb3Igd2hvc2UgTVJJIGRhdGEgY2Fubm90IGJlIHVzZWQgd2lsbCBiZSByZXBsYWNlZCB1bnRpbCB0aGlzIGdvYWwgaXMgYWNoaWV2ZWQuICAKClRoZSBzdHVkeSB3aWxsIGFsc28gbGV2ZXJhZ2UgcHJldmlvdXNseSBjb2xsZWN0ZWQgZGF0YSBmcm9tIHRoZSAqKlNvY2lhbCBQcm9jZXNzZXMgSW5pdGlhdGl2ZSBpbiBOZXVyb2Jpb2xvZ3kgb2YgU2NoaXpvcGhyZW5pYXMgKFNQSU5TKSoqIHN0dWR5LCB3aGljaCBjb25zaXN0cyBvZiBhIG1hdGNoaW5nIHByb3RvY29sLiBTUElOUyBpcyBhIG11bHRpLXNpdGUgc3R1ZHkgdGhhdCBjb2xsZWN0ZWQgY29nbml0aXZlIGFuZCBNUiBpbWFnaW5nIGRhdGEgZnJvbSAqKmNsaW5pY2FsbHkgc3RhYmxlIHBhdGllbnRzIHdpdGggc2NoaXpvcGhyZW5pYS1zcGVjdHJ1bSBkaXNvcmRlcnMqKiBhbmQgKipoZWFsdGh5IGNvbnRyb2xzKiogZnJvbSBlYWNoIG9mICoqQ0FNSCAoQ01IKSoqLCAqKlp1Y2tlciBIaWxsc2lkZSBIb3NwaXRhbCAoWkhIKSoqIGFuZCAqKk1hcnlsYW5kIFBzeWNoaWF0cmljIFJlc2VhcmNoIENlbnRlciAoTVJDKSoqLgoKIyMjIFNQSU4tQVNECgpgYGAge3Igc3Bhc2RfZGVtb19kYXRhZnJhbWV9CnNwYXNkX2RlbW9fZGYgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd2FzaV93YWlzX2ZzaXEsIHdhc2lfZnNpcTRfY3MsIHdhc2lfZnNpcTJfY3MsIG5wX2NvbXBvc2l0ZV90c2NvcmUsCiAgICAgICAgIGhhbmRfbGF0ZXJhbGl0eV9xdW90aWVudCkgJT4lCiAgbXV0YXRlKHNleCA9IGZhY3RvcihkZW1vX3NleF9iaXJ0aCwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwgMiwgMyksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIsICJJbnRlcnNleCIpKSwKICAgICAgICAgcmFjZSA9IGNhc2Vfd2hlbihkZW1vX3JhY2VfX183X21peGVkID09IDEgfiAiTW9yZSB0aGFuIG9uZSByYWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18xX3doaXRlID09IDEgfiAiV2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzJfYmxhY2sgPT0gMSB+ICJCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18zX25hdGl2ZSA9PSAxIH4gIkFtZXJpY2FuIEluZGlhbi9BbGFza2EgTmF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX180X2FzaWFuID09IDEgfiAiQXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIgPT0gMSB+ICJIYXdhaWlhbiBvciBQYWNpZmljIElzbGFuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX182X290aGVyID09IDEgfiAiT3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzhfdW5rbm93biA9PSAxIH4gIlVua25vd24gb3Igbm90IHJlcG9ydGVkIikgJT4lCiAgICAgICAgICAgZmFjdG9yKC4pLAogICAgICAgICBpcSA9IGlmZWxzZShpcy5uYSh3YXNpX2ZzaXE0X2NzKSwgaWZlbHNlKGlzLm5hKHdhc2lfd2Fpc19mc2lxKSwgd2FzaV9mc2lxMl9jcywgd2FzaV93YWlzX2ZzaXEpLCB3YXNpX2ZzaXE0X2NzKSkgICU+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+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCgoKCmBgYHtyIHNwaW5zIHogdHJhbnNmb3JtYXRpb24sIGluY2x1ZGU9RkFMU0V9CnNwaW5fbnBfZGYgPC0KIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL3NwaW5fbnBfZGYuY3N2IikKCiN6c2NvcmVfZGYgPSBkYXRhLmZyYW1lKCkKY2FzZXMgPSBzcGluX25wX2RmW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAnY2FzZScsXQpjb250cm9scyA9IHNwaW5fbnBfZGZbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICdjb250cm9sJyxdCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX01BVFJJQ1MgPSAoY2FzZXMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX01BVFJJQ1MgPSAoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX1JNRVQgPSBtZWFuKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9STUVUID0gc2QoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9STUVUID0gKGNhc2VzJHNjb2dfcm1ldF90b3RhbCAtIG1lYW5fUk1FVCkgLyBzZF9STUVUCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9STUVUKQoKbWVhbl9STUVUID0gbWVhbihjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfUk1FVCA9IHNkKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfUk1FVCA9IChjb250cm9scyRzY29nX3JtZXRfdG90YWwgLSBtZWFuX1JNRVQpIC8gc2RfUk1FVAojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfUk1FVCkKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTID0gKGNhc2VzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTID0gKGNvbnRyb2xzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fSVEgPSBtZWFuKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCnNkX0lRID0gc2QoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0lRID0gKGNhc2VzJHd0YXJfc3RkX3Njb3JlIC0gbWVhbl9JUSkgLyBzZF9JUQojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfSVEpCgptZWFuX0lRID0gbWVhbihjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpzZF9JUSA9IHNkKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9JUSA9IChjb250cm9scyR3dGFyX3N0ZF9zY29yZSAtIG1lYW5fSVEpIC8gc2RfSVEKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0lRKQoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfTUFUUklDUyxjb250cm9scyR6c2NvcmVfTUFUUklDUyxjYXNlcyR6c2NvcmVfUk1FVCxjb250cm9scyR6c2NvcmVfUk1FVCxjYXNlcyR6c2NvcmVfSVEsIGNvbnRyb2xzJHpzY29yZV9JUSwgY2FzZXMkenNjb3JlX0JTRlMsY29udHJvbHMkenNjb3JlX0JTRlMpCgp6c2NvcmVfZGY9IHJiaW5kKGNhc2VzLGNvbnRyb2xzKQoKI3NwaW5fbnBfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNzcGluX25wX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMxID0gKGNhc2VzJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMSA9IChjb250cm9scyRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY2FzZXMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMzID0gKGNhc2VzJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyA9IChjb250cm9scyRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzQgPSAoY2FzZXMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM0PSAoY29udHJvbHMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWM1ID0gKGNhc2VzJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNSA9IChjb250cm9scyRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzYgPSAoY2FzZXMkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM2ID0gKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfQlNGU19zZWMxLCBjb250cm9scyR6c2NvcmVfQlNGU19zZWMxLGNhc2VzJHpzY29yZV9CU0ZTX3NlYzIsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIsY2FzZXMkenNjb3JlX0JTRlNfc2VjMywgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyxjYXNlcyR6c2NvcmVfQlNGU19zZWM0LCBjb250cm9scyR6c2NvcmVfQlNGU19zZWM0LGNhc2VzJHpzY29yZV9CU0ZTX3NlYzUsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzUsY2FzZXMkenNjb3JlX0JTRlNfc2VjNiwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNikKenNjb3JlX2RmPSByYmluZChjYXNlcyxjb250cm9scykKCgoKYGBgCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQlNGU19kZi5jc3YiKSU+JQogIAptdXRhdGUoc3R1ZHkgPSAiU1BBU0QiLAogICAgICAgICBncm91cCA9IGNhc2Vfd2hlbihncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKC4pKSAlPiUgICAgICAgCnNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCmJzZnNfYXNkX2Nhc2UgPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKYnNmc19hc2RfY29udHJvbCA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDb250cm9sIikgJT4lCiAgbnJvdygpCgoKYnNmc19wcmVwYW4gPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihic2ZzX2RvYSA8ICIyMDIyLTA2LTA3IiklPiUKICBucm93KCkKCmJzZnNfZHVycGFuIDwtCiAgQlNGU19kZiAlPiUKICBmaWx0ZXIoYnNmc19kb2EgPiAiMjAyMi0wNy0xMSIpJT4lCiAgbnJvdygpCgoKI0JTRlNfZGYkYnNmc19wcmVwYW4gPC0gKEJTRlNfZGZbJzIwMjItMDYtMDcnXSkKCkJTRlNfZGZfcGFuIDwtIEJTRlNfZGYgJT4lIGFzLmRhdGEuZnJhbWUgJT4lCiAgbXV0YXRlKGJzZnNfcHJlcGFuID0gaWZlbHNlKEJTRlNfZGYkYnNmc19kb2EgPCAiMjAyMC0wMy0xNSIsICJwcmVwYW4iLCAib3RoZXIiKSkKQlNGU19kZl9wYW5baXMubmEoQlNGU19kZl9wYW4kYnNmc19wcmVwYW4pLCAiYnNmc19wcmVwYW4iXSA8LSAib3RoZXIiCgojQlNGU19kZltCU0ZTX2RmJGJzZnNfcHJlcGFuID09MCwnYnNmc19wcmVwYW4nXSA8LSBOQQoKCgpCU0ZTX2RmJGJzZnNfYXNkX3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWNfZ3JhbmR0b3RhbDEnLCAnYnNmc19zZWNfZ3JhbmR0b3RhbDInKV0sIG5hLnJtPVRSVUUpCkJTRlNfZGZbQlNGU19kZiRic2ZzX2FzZF90b3RhbCA9PTAsJ2JzZnNfYXNkX3RvdGFsJ10gPC0gTkEKCgoKI0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsPXJiaW5kKGJzZnNfc2VjN195X3RvdGFsXzdhLCBic2ZzX3NlYzdfbl90b3RhbF83YikKCiNCU0ZTX2RmJGJzZnNfc2VjN190b3RhbCA8LSByb3dTdW1zKEJTRlNfZGZbLGMoJ2JzZnNfc2VjN195X3RvdGFsXzdhJywgJ2JzZnNfc2VjN19uX3RvdGFsXzdiJyldLCBuYS5ybT1UUlVFKQojQlNGU19kZltCU0ZTX2RmJGJzZnNfc2VjN190b3RhbCA9PTAsJ2JzZnNfc2VjN190b3RhbCddIDwtIE5BCgoKYGBgCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCkFCQVNfZGY8LQogICByZWFkX2NzdigKICIvc2NyYXRjaC9uc2hhcm1hL1NQSU4tQVNEcmRvYy9BQkFTX2RmLmNzdiIpICU+JQogIAptdXRhdGUoc3R1ZHkgPSAiU1BBU0QiLAogICAgICAgICBncm91cCA9IGNhc2Vfd2hlbihncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIikgJT4lCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKC4pKSAlPiUgICAgICAgCnNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCmFiYXNfYXNkX2Nhc2UgPC0KICBBQkFTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKYWJhc19hc2RfY29udHJvbCA8LQogIEFCQVNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDb250cm9sIikgJT4lCiAgbnJvdygpCgpBQkFTX2RmJGFiYXNfYXNkX3RvdGFsIDwtIHJvd1N1bXMoQUJBU19kZlssYygnYWJhc19nYWMnLCAnYWJhc19nYWMxJywgImFiYXNfZ2FjMiIpXSwgbmEucm09VFJVRSkKQUJBU19kZltBQkFTX2RmJGFiYXNfYXNkX3RvdGFsID09IDAsJ2FiYXNfYXNkX3RvdGFsJ10gPC0gTkEgCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Bhc2RfZGVtb19kZiAKY2FzZV9hc2QgPSBzcGFzZF9kZW1vX2RmW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSdDYXNlJyxdCmNvbnRyb2xfYXNkID0gc3Bhc2RfZGVtb19kZltzcGFzZF9kZW1vX2RmJGdyb3VwPT0nQ29udHJvbCcsXQoKbWVhbl9NQVRSSUNTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDU3NkID0gc2QoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfTUFUUklDU3NkID0gKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1NzZCkgLyBzZF9NQVRSSUNTc2QKI3pzY29yZV9hc2QgPSBjYmluZCh6c2NvcmVfYXNkLCBjb250cm9sX2FzZCR6c2NvcmVfTUFUUklDU3NkKQoKCm1lYW5fTUFUUklDU3NkID0gbWVhbihjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCnNkX01BVFJJQ1NzZCA9IHNkKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCA9IChjYXNlX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlIC0gbWVhbl9NQVRSSUNTc2QpLyBzZF9NQVRSSUNTc2QKI3pzY29yZV9hc2QgPSBjYmluZCh6c2NvcmVfYXNkLCBjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkKQoKCm1hdHJpY3NfYXNkX3pzY29yZSA9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QsY29udHJvbF9hc2QkenNjb3JlX01BVFJJQ1NzZCkKCm1hdHJpY3NfYXNkX3pzY29yZSA9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKQlNGU19kZgoKY2FzZV9hc2QgPSBCU0ZTX2RmW0JTRlNfZGYkZ3JvdXA9PSdDYXNlJyxdCmNvbnRyb2xfYXNkID0gQlNGU19kZltCU0ZTX2RmJGdyb3VwPT0nQ29udHJvbCcsXQogCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2QgPSAoY2FzZV9hc2QkYnNmc19hc2RfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2QgPSAoY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCiNic2ZzX2FzZF96c2NvcmU9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9CU0ZTc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2QpCiNic2ZzX2FzZF96c2NvcmU9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKCiN6c2NvcmVfYXNkPWNiaW5kKHpzY29yZV9hc2QsIEJTRlNfZGYpCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMSA9IChjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMxID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIgPSAoY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMiA9IChjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMzID0gKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMgPSAoY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNCA9IChjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM0PSAoY29udHJvbF9hc2QkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNSA9IChjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM1ID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYgPSAoY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNiA9IChjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCgpic2ZzX2FzZF96c2NvcmU9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMSwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMxLGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMiwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMyLGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMywgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMzLGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM0LGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNSwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM1LGNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNiwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM2KQpic2ZzX2FzZF96c2NvcmU9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKYGBgCgoKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpBQkFTX2RmCgpjYXNlX2FzZCA9IEFCQVNfZGZbQUJBU19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBBQkFTX2RmW0FCQVNfZGYkZ3JvdXA9PSdDb250cm9sJyxdCgptZWFuX0FCQVNzZCA9IG1lYW4oY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpzZF9BQkFTc2Q9IHNkKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0FCQVNzZCA9IChjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCAtIG1lYW5fQUJBU3NkKSAvIHNkX0FCQVNzZAoKbWVhbl9BQkFTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKc2RfQUJBU3NkPSBzZChjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9BQkFTc2QgPSAoY2FzZV9hc2QkYWJhc19hc2RfdG90YWwgLSBtZWFuX0FCQVNzZCkgLyBzZF9BQkFTc2QKCgphYmFzX2FzZF96c2NvcmU9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9BQkFTc2QsY29udHJvbF9hc2QkenNjb3JlX0FCQVNzZCkKYWJhc19hc2RfenNjb3JlPSByYmluZChjYXNlX2FzZCxjb250cm9sX2FzZCkKCiN6c2NvcmVfYXNkPWNiaW5kKHpzY29yZV9hc2QgLCBBQkFTX2RmKQojenNjb3JlX2FzZD0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0FCQVNzZCxjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkLGNhc2VfYXNkJHpzY29yZV9CU0ZTc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2QpCgojQUJBU19kZiA8LSByYmluZChzcGFzZF9kZW1vX2RmLEJTRlNfZGYpCgoKYGBgCgoKCmBgYHtyfQoKI21hdHJpY3Mgc2NvcmUgb2Ygc3BpbnMgdmlvbGluIHBsb3QKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfTUFUUklDUykpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkgCgojUk1FVCBTY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9STUVUKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKI0JpcmNod29vZCBTRlMgU2NvcmUgb2Ygc3BpbnMgdmlvbGluIHBsb3QKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfQlNGUykpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkgCgojRXN0aW1hdGVkIElRIG9mIHNwaW5zIHZpb2xpbiBwbG90IAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9JUSkpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkgCgpgYGAKCmBgYHtyfQojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9CU0ZTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKQpgYGAKCiMjIFNjb3JlIERpc3RyaWJ1dGlvbnMgCgoKIyMjIEJpcmNod29vZCBTb2NpYWwgRnVuY3Rpb25pbmcgU2NhbGU6CkEgc2VsZi1yZXBvcnQgcXVlc3Rpb25uYWlyZSBkZXNpZ25lZCB0byByZWZsZWN0IHRoZSBzb2NpYWwgc2tpbGxzIGFuZCBwZXJmb3JtYW5jZXMgb2YgcGF0aWVudHMKCgoqKkJTRlMgU2VjdGlvbiAxKioKLUFzc2VzcyBTb2NpYWwgRW5nYWdlbWVudC9XaXRoZHJhd24gd2l0aCBhIHRvdGFsIHNjb3JlIGJldHdlZW4gMCBhbmQgMTUgZXggaG91cnMgc3BlbnQgYWxvbmUgdnMgbGVhdmluZyB0aGUgaG91c2UKYGBge3J9CkJTRlNfc2VjMV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzFfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMxX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjMV9kaXN0cmlidXRpb24KYGBgCgoKIApgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojKipTZWN0aW9uIDE6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiMgQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDEgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIAoKQlNGU19zZWMxX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzFfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMxX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzFfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMxX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMxX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjMV9kaXN0cmlidXRpb24KCmBgYAoKCgoqKkJTRlMgU2VjdGlvbiAyKioKLUxvb2tzIGF0IEludGVycGVyc29uYWwgQ29tbXVuaWNhdGlvbiBhbmQgUmVsYXRpb25zaGlwcyB3aXRoIGEgdG90YWwgc2NvcmUgYmV0d2VlbiAwIGFuZCAzMCBleCBoYXZpbmcgc29tZW9uZSB0byBkaXNjdXNzIHByb2JsZW1zIHdpdGggCmBgYHtyfQpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMyX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uCmBgYAoKCiAKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KICMqKlNlY3Rpb24gMjogUHJlIGFuZCBQb3N0IFBhbmRlbWljKioKICMtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDMgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMyX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAicHJlcGFuIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09InByZXBhbiJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbgoKYGBgCgoKCgoKKipCU0ZTIFNlY3Rpb24gMyoqCi1Gb2N1c2VzIG9uIEludGVycGVyc29uYWwgUHJvc29jaWFsIGFjdGl2aXRpZXMgZXggZ29pbmcgdmlzaXRpbmcgcmVsYXRpdmVzIGFuZCBnb2luZyB0byB0aGUgbW92aWVzLCB3aXRoIGEgdG90YWwgc2NvcmUgYmV0d2VlbiAwIGFuZCA2NgpgYGB7cn0KCkJTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMzX3RvdGFsW0JTRlNfZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzNfdG90YWxbQlNGU19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWMzX2Rpc3RyaWJ1dGlvbgoKYGBgCgoKCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojKipTZWN0aW9uIDM6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiMgLUNvbXBhcmVzIHRoZSBzY29yZXMgb2Ygc2VjdGlvbiAzIG9uIHRoZSBCaXJjaHdvb2QgQXNzZXNtZW50IHByaW9yIHRvIHRoZSBDb3ZpZC0xOSBQYW5kZW1pYyB2cyBBZnRlciB0aGUgUGFuZGVtaWMgYmV0d2VlbiBTUElOLUFTRCBhbmQgU1BJTlMgU3R1ZGllcyAKQlNGU19zZWMzX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjM190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjM19kaXN0cmlidXRpb24KCiMgZ2dwbG90KHNwaW5fbnBfZGYsIGFlcyh4ID0gZGlhZ25vc3RpY19ncm91cCwgeSA9IGJzZnNfc2VjM190b3RhbCkpICsKIyAgIGdlb21fYm94cGxvdCgpCiMgZ2dwbG90KEJTRlNfZGZfcGFuLCBhZXMoeCA9IGdyb3VwLCB5ID0gYnNmc19zZWMzX3RvdGFsKSkgKwojICAgZ2VvbV9ib3hwbG90KCkgKwojICAgZmFjZXRfZ3JpZCgufmJzZnNfcHJlcGFuKQoKIyBTUEFTRF9zZWMzIDwtIEJTRlNfZGZfcGFuWyxjKDI5OjUwLCAxMjMsIDEyNCldCiMgbGlicmFyeShyZXNoYXBlKQojIFNQQVNEX3NlYzNfbWVsdCA8LSBtZWx0KFNQQVNEX3NlYzMsIG1lYXN1cmUudmFycyA9IDE6MjIpCiMgCiMgYWxsc2VjMyA8LSBnZ3Bsb3QoU1BBU0Rfc2VjM19tZWx0LCBhZXMoeCA9IGdyb3VwLCB5ID0gdmFsdWUsIGZpbGwgPSBncm91cCkpICsKIyAgIGdlb21fYm94cGxvdCgpKwojICAgZmFjZXRfZ3JpZChic2ZzX3ByZXBhbn52YXJpYWJsZSkgKwojICAgeWxpbSgtMSwgNCkKIyAKIyBhbGxzZWMzCiMgCiMgKFNQQVNEX0JTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KIyBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAojICAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiMgICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjM19xM19zcG9ydHNbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQojICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiMgICAgICAgICAgZm9udCA9IHQsCiMgICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKIyAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiMgICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkpCiMgCiMgc3BpbnNfc2VsZWN0IDwtIHNwaW5fbnBfZGYgJT4lIHNlbGVjdChic2ZzX3NlYzFfdG90YWwsIGJzZnNfc2VjMl90b3RhbCwgYnNmc19zZWMzX3RvdGFsLCBic2ZzX3NlYzRfdG90YWwsIGJzZnNfc2VjNV90b3RhbCwgYnNmc19zZWM2X3RvdGFsKQojIAojIHNwYXNkX3NlbGVjdCA8LSBCU0ZTX2RmX3BhbiAlPiUgc2VsZWN0KGdyb3VwLGJzZnNfc2VjMV90b3RhbCwgYnNmc19zZWMyX3RvdGFsLCBic2ZzX3NlYzNfdG90YWwsIGJzZnNfc2VjNF90b3RhbCwgYnNmc19zZWM1X3RvdGFsLCBic2ZzX3NlYzZfdG90YWwpCiMgc3Bhc2Rfc2VsZWN0IDwtIHNwYXNkX3NlbGVjdFtjb21wbGV0ZS5jYXNlcyhzcGFzZF9zZWxlY3QpLF0KIyAKIyBzcGluLnBjYSA8LSBlcFBDQShzcGluc19zZWxlY3QsIERFU0lHTiA9IHNwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCkKIyBzcGFzZC5wY2EgPC0gZXBQQ0Eoc3Bhc2Rfc2VsZWN0WywtMV0sIERFU0lHTiA9IHNwYXNkX3NlbGVjdCRncm91cCkKCgoKCgoKYGBgCgoKCgoKCioqQlNGUyBTZWN0aW9uIDQqKgotTG9va3MgYXQgcGF0aWVudHMgaW52b2x2ZW1lbnQgaW4gUmVjcmVhdGlvbmFsIEFjdGl2aXRpZXMgd2l0aCBhIHNjb3JlIGJldHdlZW4gMCBhbmQgNDggIGV4IGNvb2tpbmcgYW5kIHBsYXlpbmcgYW4gaW5zdHJ1bWVudCAKYGBge3J9CkJTRlNfc2VjNF9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM0X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM0X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNF90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNF9kaXN0cmlidXRpb24KCmBgYAoKCiAKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyMqKlNlY3Rpb24gNDogUHJlIGFuZCBQb3N0IFBhbmRlbWljKioKICMtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDMgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApCU0ZTX3NlYzRfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM0X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAicHJlcGFuIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNF90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09InByZXBhbiJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbgoKCmBgYAoKCgoKKipCU0ZTIFNlY3Rpb24gNSoqCi1Bc3Nlc3MgdGhlIHBhdGllbnRzIEluZGVwZW5kZW5jZSBQZXJmb3JtYW5jZSB3aXRoIGEgc2NvcmUgYmV0d2VlbiAwIGFuZCAzOSAgZXggcHJlcGFyaW5nIGFuZCBjb29raW5nIGEgbWVhbApgYGB7cn0KQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM1X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbgpgYGAKCgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyoqU2VjdGlvbiA1OiBQcmUgYW5kIFBvc3QgUGFuZGVtaWMqKgogIy1Db21wYXJlcyB0aGUgc2NvcmVzIG9mIHNlY3Rpb24gMyBvbiB0aGUgQmlyY2h3b29kIEFzc2VzbWVudCBwcmlvciB0byB0aGUgQ292aWQtMTkgUGFuZGVtaWMgdnMgQWZ0ZXIgdGhlIFBhbmRlbWljIGJldHdlZW4gU1BJTi1BU0QgYW5kIFNQSU5TIFN0dWRpZXMgCkJTRlNfc2VjNV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM1X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM1X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzVfZGlzdHJpYnV0aW9uCgpgYGAKCgoqKkJTRlMgU2VjdGlvbiA2KioKLUxvb2tzIGF0IHBhdGllbmNlIEluZGVwZW5kZW5jZSBDb21wZXRlbmNlIHdpdGggYSBzY29yZSBiZXR3ZWVuIDAtMzkgZXggd2FzaGluZyBvd24gY2xvdGhlcyAKYGBge3J9CkJTRlNfc2VjNl9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gNjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzZfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM2X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM2X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNl9kaXN0cmlidXRpb24KCmBgYAoKKipCU0ZTIEdyYW5kIFRvdGFsKioKYGBge3IgZWNobz1GQUxTRX0KQlNGU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9ODAsIGVuZCA9IDIwMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19kaXN0cmlidXRpb24KCmBgYAoKCgogIAojIyMgQWRhcHRpdmUgQmVoYXZpb3IgQXNzZXNzbWVudCBTeXN0ZW0gKEFCQVMpCi1UaGlzIGFzc2Vzc21lbnQgaGVscHMgZGVzY3JpYmUgYSBwZXJzb24ncyBnZW5lcmFsIGFkYXB0aXZlIGJlaGF2aW9yIGFzIHdlbGwgYXMgZnVuY3Rpb25pbmcgaW4gMTEgcmVsYXRlZCBhZGFwdGl2ZSBza2lsbCBhcmVhcyAKZXguIGNvbW11bmljYXRpb24sIHNlbGYtY2FyZSBhbmQgd29yayAKCmBgYHtyfQoKQUJBU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDgwLCBlbmQgPSA0MDAsIHNpemUgPSA4KSkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5BQkFTX2RmJGFiYXNfYXNkX3RvdGFsW0FCQVNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIiBDYXNlIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QUJBU19kZiRhYmFzX2FzZF90b3RhbFtBQkFTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JSAKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBQkFTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCgpBQkFTX2Rpc3RyaWJ1dGlvbgpgYGAgCgoKIyMjIE1BVFJJQ1MgU2NvcmUgCgpJbnRlbmRlZCB0byBwcm92aWRlIGEgcmVsYXRpdmVseSBicmllZiBldmFsdWF0aW9uIG9mIGtleSBjb2duaXRpdmUgZG9tYWlucyByZWxldmFudCB0byBzY2hpem9waHJlbmlhIGFuZCByZWxhdGVkIGRpc29yZGVycywgYW5kIHdhcyBkZXNpZ25lZCB0byBhZGRyZXNzIHRoZSBmb2xsb3dpbmcgcHVycG9zZXM6IEFzIGFuIG91dGNvbWUgbWVhc3VyZSBmb3IgY2xpbmljYWwgdHJpYWxzIG9mIGNvZ25pdGlvbi1lbmhhbmNpbmcgZHJ1Z3MgZm9yIHNjaGl6b3BocmVuaWEuCmBgYHtyfQoKbWF0cmljc19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDAsIGVuZCA9IDYwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkbnBfY29tcG9zaXRlX3RzY29yZVtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRucF9jb21wb3NpdGVfdHNjb3JlW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5zcGFzZF9kZW1vX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmVbc3Bhc2RfZGVtb19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUgCiAgYWRkX2JveHBsb3QgKHk9IH5zcGFzZF9kZW1vX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmVbc3Bhc2RfZGVtb19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAogICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNQVRSSUNTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCm1hdHJpY3NfZGlzdHJpYnV0aW9uCmBgYAoKICAKIyMgRnJhbWV3aXNlIERpc3BsYWNlbWVudAoKV2UgdXNlIFttcmlxY10oaHR0cHM6Ly9tcmlxYy5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvaW5kZXguaHRtbCkgdG8gb2J0YWluIGltYWdlIHF1YWxpdHkgbWV0cmljcyAoSVFNcykgZm9yIHRoZSBUMXcsIFQydywgYW5kIGZNUkkgc2NhbnMuIEJlbG93IGFyZSBwbG90cyBvZiBmcmFtZXdpc2UgZGlzcGxhY2VtZW50IChGRCksIGEgbWVhc3VyZSBvZiBoZWFkIG1vdGlvbiBhY3Jvc3MgdGltZS4gU3BlY2lmaWNhbGx5LCB0aGUgYXZlcmFnZSBGRCBmb3IgZWFjaCBzY2FuIGFjcm9zcyBhbGwgdGltZXBvaW50cyBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgRkRzIGFib3ZlIGEgdGhyZXNob2xkIG9mICoqMC41IG1tKiogYXJlIHNob3duLgoKYGBge3J9CnNwYXNkX21yaXFjX2JvbGRfZGYgPC0KICByZWFkX3RzdigKICAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BBU0QudHN2IikKICApICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOLUFTRCIsCiAgICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc3ViamVjdF9pZCA9IHBhc3RlKCJTUEFTRCIsIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDEsIDMpLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCA0LCAxMCksIHNlcCA9ICJfIikgJT4lIGdzdWIoIkNNSCIsICJDTVAiLCAuKSwKICAgICAgICAgYWNxdWlzaXRpb24gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAiYWNxLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0gJT4lIGdzdWIoIlxcZCIsICIiLCAuKQogICAgICAgICApICU+JQogIGxlZnRfam9pbihzcGFzZF9yZWRjYXBfZGYgJT4lIHNlbGVjdChyZWNvcmRfaWQsIG1yaV9kb2EpLCBieSA9IGMoInN1YmplY3RfaWQiID0gInJlY29yZF9pZCIpKQoKc3BpbnNfc3ViamVjdHMgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lIAogIHNlbGVjdChyZWNvcmRfaWQpICU+JSAKICB1bmxpc3QoKQoKc3BpbnNfbXJpcWNfYm9sZF9kZiA8LQogcmVhZF90c3YoCiAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BJTlMudHN2IikKICkgJT4lCiBtdXRhdGUoc3R1ZHkgPSAiU1BJTlMiLAogICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgIGZ1bGxfc3ViamVjdF9pZCA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJzdWItKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BOMDEiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpLAogICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHNjYW5fdHlwZSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJ0YXNrLShbWzphbG51bTpdXSspXyIpWywyXSkgJT4lCiBmaWx0ZXIoc3ViamVjdF9pZCAlaW4lIHNwaW5zX3N1YmplY3RzKQoKbXJpcWNfYm9sZF9kZiA8LQogYmluZF9yb3dzKHNwYXNkX21yaXFjX2JvbGRfZGYsIHNwaW5zX21yaXFjX2JvbGRfZGYpICU+JQogbXV0YXRlKHNjYW5fdHlwZSA9IGZhY3RvcihzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInJlc3QiLCAiaW1pIiwgIm9icyIsICJlbXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUmVzdGluZyBTdGF0ZSIsICJJbWl0YXRlIiwgIk9ic2VydmUiLCAiRW1wYXRoaWMgQWNjdXJhY3kiKSkpICU+JQogc2VsZWN0KHN0dWR5LCBzdWJqZWN0X2lkLCBzY2FuX3R5cGUsIGZkX21lYW4sIGZkX3BlcmMsIG1yaV9kb2EpCmBgYAoKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX21lYW4sIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IE1lYW4gRkQ6ICIsIGZkX21lYW4pLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gU2NhbiBUeXBlOiAiLCBzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVhbiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IEZEICU6ICIsIGZkX3BlcmMpLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KG1yaXFjX2JvbGRfZGYgJT4lIG11dGF0ZShzdHVkeT1hcy5mYWN0b3Ioc3R1ZHkpKSwgeCA9IH5tcmlfZG9hLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnNjYW5fdHlwZSwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVyY2VudGFnZSBvZiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50cyBBYm92ZSBUaHJlc2hvbGQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKIyMgTVJJCgpgYGB7ciBtcmlfZGF0YWZyYW1lfQoKIHhuYXRfZGYgPC0Kc3Bhc2RfcmVkY2FwX2RmICU+JQpzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hLCBtcmlfZm9ybV9jb21wbGV0ZSkgJT4lCmZpbHRlcihtcmlfZm9ybV9jb21wbGV0ZSAhPSAyKSAlPiUKcmVuYW1lKGRhdGUgPSBtcmlfZG9hKSAlPiUKbXV0YXRlKHN0dWR5ID0gIlNQQVNEIikKCm1yaV9kZiA8LQp4bmF0X2RmICU+JQpncm91cF9ieShzdHVkeSwgZGF0ZSkgJT4lCmNvdW50KCkgJT4lCnVuZ3JvdXAoKSAlPiUKbXV0YXRlKHRvdGFsID0gY3Vtc3VtKG4pKSAlPiUKc2VsZWN0KC1uKSAlPiUKYmluZF9yb3dzKAogIHRhcmdldHNfZGYgJT4lCiAgICBtdXRhdGUoc3R1ZHkgPSAidGFyZ2V0IikgJT4lCiAgICByZW5hbWUodG90YWwgPSB0YXJnZXQsCiAgICAgICAgICAgZGF0ZSA9IG1vbnRoKSAlPiUKICAgIHNlbGVjdChzdHVkeSwgZGF0ZSwgdG90YWwpKQoKcGFydGljaXBhbnRzX3JlY3J1aXRlZCA8LSBucm93KHhuYXRfZGYpCgptb250aHNfb2Zfc3R1ZHkgPC0gbnJvdygKbXJpX2RmICU+JQpmaWx0ZXIoc3R1ZHkgPT0gInRhcmdldCIpICU+JQpmaWx0ZXIoIWRhdGUgPT0gIjIwMTgtMDctMzEiKSAlPiUKZmlsdGVyKGRhdGUgPCBjZWlsaW5nX2RhdGUoU3lzLkRhdGUoKSwgIm1vbnRoIikpCikKCmF2Z19yZWNydWl0bWVudCA8LSByb3VuZChwYXJ0aWNpcGFudHNfcmVjcnVpdGVkIC8gbW9udGhzX29mX3N0dWR5LCBkaWdpdHMgPSAyKQpgYGAKClRodXMgZmFyLCAqKmByIHBhcnRpY2lwYW50c19yZWNydWl0ZWRgKiogcGFydGljaXBhbnRzIGhhdmUgYmVlbiBzY2FubmVkLiBUaGUgdGFyZ2V0IGlzIHRvIHNjYW4gKiozLjMzKiogcGFydGljaXBhbnRzIHBlciBtb250aCAoKio0MCoqIHBlciB5ZWFyKS4gV2UgYXJlIGN1cnJlbnRseSBhdmVyYWdpbmcgKipgciBhdmdfcmVjcnVpdG1lbnRgKiogcGFydGljaXBhbnRzIHBlciBtb250aC4KCgpgYGB7ciBtcmlfcGxvdH0KYSA8LSBsaXN0KAogIHggPSB0YWlsKG1yaV9kZiRkYXRlLCBuID0gMSksCiAgeSA9IHRhaWwobXJpX2RmJHRvdGFsLCBuID0gMSksCiAgdGV4dCA9IG1yaV9kZiR0b3RhbCwKICB4cmVmID0gIngiLAogIHlyZWYgPSAieSIsCiAgc2hvd2Fycm93ID0gRkFMU0UpCgptcmlfcGxvdCA8LQogIHBsb3RfbHkobXJpX2RmLCAKICAgICAgICAgIHggPSB+ZGF0ZSwgeSA9IH50b3RhbCwKICAgICAgICAgIHR5cGU9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywKICAgICAgICAgIGNvbG9yID0gfnN0dWR5KSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdEYXRlJywKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gYyhhcy5EYXRlKCIyMDE4LTA3LTMxIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5cy5EYXRlKCkgKyAzMCkpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnIyBvZiBQYXJ0aWNpcGFudHMgU2Nhbm5lZCcsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJpX2RmJHRvdGFsW21yaV9kZiRkYXRlIDwgbHVicmlkYXRlOjpjZWlsaW5nX2RhdGUoU3lzLkRhdGUoKSwibW9udGgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMSkpKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptcmlfcGxvdAoKYGBgCg==
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.