Last Updated: 2024-08-03
Print Date: 2025-07-12
TABLE OF CONTENTS
Utilize the Table of Contents (TOC) menu on the left to scroll
through the different sections and help navigate this report. You can
click on the title to go directly to the section.
Considerations:
Terminology - The terms activity, workout, and exercise may be used
interchangeably in this context, even though they have distinct
meanings.
Data Assumptions - The data used for analyses assumes each set of
exercise is performed to Rep Max (RM), which isn’t always the case,
particularly if the individual isn’t aiming to perform the set to RM.
Assuming each set of exercise is performed to Rep Max helps standardize
data and provide clear insights into maximal strength, which is
beneficial for benchmarking and tracking progress. However, it can also
lead to inaccuracies, potential overtraining, and misleading data if not
all exercises are performed to failure. Balancing the use of 1RM
assumptions with realistic training practices is essential for accurate
performance assessment and effective training programming.
STATS TO STANDARDS
Integrating Performance Metrics with Mark Rippetoe Strength
Standards
Performance measures are evaluated to match standards. This section
combines practical workout data analysis with Mark Rippetoe’s Strength
Standards (see TOC Menu). The standards are essential for evaluating and
contextualizing individual fitness achievements against standardized
criteria.
For a higher quality of personal performance comparison, we define
specific criteria to match the standards presented by Mark. Should we
choose, we can specify our criteria for Flat Bench Dumbbell Chest Press
or Incline Bench Dumbbell Chest Press, each likely requiring different
weights and numbers of reps for execution. To note Mark Rippetoe’s
training utilizes the barbell as the instrument for growth. By
explaining in detail the Bench Press in his Starting Strength book , we know
the strength standard is measured via the flat bench. Therefore, we
specify Flat Bench Barbell Chest Press in our criteria to compare with
Mark Rippetoe’s 1RM Male Bench Press Standards.
1RM Table - Avg L2W & ATH
The following table reports the average one-repetition maximum
(1RM) for each individual across each specified exercise (“Selected
Criteria”) over the last two weeks (L2W). The data for the last two
weeks serves as a benchmark for the next workout. As the saying goes,
“You’re only as good as your last.”
The table also reports highest 1RM over all time (ATH) for each
selected criterion, accompanied by the last date the highest 1RM was
achieved.
The 1RM is calculated based on weight executed per set and the
number of reps, using the 1RM Conversion Table.
Data is derived from measures entered in the “Ken Does
Fitness.xlsm Workbook.”
All calculations assume the standard barbell (Olympic barbell)
weight of 45 pounds (20.4 kg).
Keep in mind there are many variables affecting performance. One of
these variables includes grip (wide, alternating, overhand, etc.). One
individual may use alternating grips (left underhand/right overhand, or
vice-versa) when performing deadlifts to maximize weight execution.
Another individual might utilize an overhand grip. Someone else may
perform a combination of alternating grip and overhand grip. The
following datasets and figures do not account for these differences.
L2W & ATH - Side By Side
Performance measures for Average 1RM Last 2 Weeks (L2W) and Highest
1RM All Time (ATH) are merged into one plot for side-by-side comparison.
This visualization helps reach higher performance by highlighting recent
performance and identifying personal bests, thereby fostering healthy
competition and motivating consistent progress.
This combined plot allows for an easy comparison of recent
performance and all-time bests, providing a clear visual representation
of each individual’s progress and potential. Understanding these metrics
can help identify areas for improvement and set goals to surpass their
personal bests, ultimately leveling up performance.
Using Average 1RM Last 2 Weeks (L2W) for training purposes is more
effective than comparing Highest 1RM Last 2 Weeks to 1RM All Time High
(ATH). This is because the average 1RM over the last two weeks provides
a more consistent and realistic measure of current strength levels,
which can be influenced by various factors such as fatigue, recovery,
and daily performance variability. Relying solely on the highest 1RM may
not accurately reflect true performance capability and can lead to
unrealistic training loads and potential overtraining.
Male Bench Press Standards, Avg 1RM L2W & 1RM ATH
Name
|
Average 1RM (lbs)
|
Date Range L2W
|
Category Level L2W
|
1RM ATH (lbs)
|
Date ATH
|
Category Level ATH
|
Avg BW L2W (lbs)
|
Date Range
|
Alex
|
185.83
|
2024-07-18 to 2024-07-31
|
Cat. II
|
228.40
|
2024-01-13
|
Cat. III
|
175.00
|
2024-07-18 to 2024-07-31
|
Josh
|
213.15
|
2024-04-25 to 2024-05-08
|
Cat. III
|
253.09
|
2023-09-13
|
Cat. III
|
190.00
|
2024-05-24 to 2024-06-06
|
Kendrick
|
152.71
|
2024-07-18 to 2024-07-31
|
Cat. II
|
174.70
|
2024-02-07
|
Cat. III
|
133.46
|
2024-07-18 to 2024-07-31
|
Male Deadlift Standards, Avg 1RM L2W & 1RM ATH
Name
|
Average 1RM (lbs)
|
Date Range L2W
|
Category Level L2W
|
1RM ATH (lbs)
|
Date ATH
|
Category Level ATH
|
Avg BW L2W (lbs)
|
Date Range
|
Alex
|
224.51
|
2024-07-18 to 2024-07-31
|
Cat. I
|
261.63
|
2023-12-17
|
Cat. I
|
175.00
|
2024-07-18 to 2024-07-31
|
Josh
|
236.38
|
2023-10-27 to 2023-11-09
|
Cat. I
|
275.28
|
2023-10-18
|
Cat. I
|
190.00
|
2024-05-24 to 2024-06-06
|
Kendrick
|
219.21
|
2024-07-18 to 2024-07-31
|
Cat. I
|
267.44
|
2024-02-14
|
Cat. II
|
133.46
|
2024-07-18 to 2024-07-31
|
Male Press Standards, Avg 1RM L2W & 1RM ATH
Name
|
Average 1RM (lbs)
|
Date Range L2W
|
Category Level L2W
|
1RM ATH (lbs)
|
Date ATH
|
Category Level ATH
|
Avg BW L2W (lbs)
|
Date Range
|
Alex
|
106.09
|
2024-06-29 to 2024-07-12
|
Cat. I
|
110.47
|
2024-07-12
|
Cat. II
|
175.00
|
2024-07-18 to 2024-07-31
|
Kendrick
|
72.33
|
2024-07-13 to 2024-07-26
|
Cat. I
|
87.21
|
2024-01-02
|
Cat. I
|
133.46
|
2024-07-18 to 2024-07-31
|
Male Squat Standards, Avg 1RM L2W & 1RM ATH
Name
|
Average 1RM (lbs)
|
Date Range L2W
|
Category Level L2W
|
1RM ATH (lbs)
|
Date ATH
|
Category Level ATH
|
Avg BW L2W (lbs)
|
Date Range
|
Alex
|
185.75
|
2024-07-02 to 2024-07-15
|
Cat. I
|
191.86
|
2024-07-15
|
Cat. I
|
175.00
|
2024-07-18 to 2024-07-31
|
Kendrick
|
173.99
|
2024-07-13 to 2024-07-26
|
Cat. I
|
207.87
|
2024-02-12
|
Cat. II
|
133.46
|
2024-07-18 to 2024-07-31
|
STRENGTH STANDARDS
Strength Standards provide valuable benchmarks for assessing an
individual’s performance in key strength exercises that are widely
practiced in fitness and strength training. These standards categorize
performance levels based on either amount of weight executed relative to
bodyweight, or repetitions executed, and are segmented by gender and
experience levels. By comparing an individual’s performance against
these established standards, trainers and athletes can identify
strengths and weaknesses in their training regimens, set realistic
goals, and measure progress in a structured manner.
Strength Standards Overview
Several strength standards are readily available online:
Finding accurate strength standards depends on the demographic,
exercise type, and required accuracy. Each has its pros and cons: some
cater to specific demographics, others focus on certain exercises, and
their credibility affects reliability. Usability and comprehensive data
for benchmarking are crucial, as are regular updates to reflect current
trends. Considering these factors helps trainers and athletes choose the
best standards for assessing and improving performance.
Standards Categories
The standards compiled are separated into categories, as shown in the
following table, making it easy to determine which exercise to use as a
benchmark.
Categories
|
Categories
|
Push Ups
|
Romanian Deadlift
|
Bench Press
|
T Bar Row
|
Incline Bench Press
|
Press
|
Pull Ups
|
Barbell Shoulder Press
|
Lat Pulldown
|
Dumbbell Shoulder Press
|
Deadlift
|
Military Press
|
MARK RIPPETOE’S STANDARDS
Mark Rippetoe’s Strength Standard: 1 Rep Max By Bodyweight.
Here we present Mark Rippetoe’s Strength Standards to benchmark
individual performance against established criteria for primary strength
exercises. These standards are instrumental in evaluating an
individual’s lifting capabilities in relation to their bodyweight and
training experience. By doing so, we can effectively gauge progress,
pinpoint areas that need improvement, and tailor training programs to
better meet the specific strength goals of each individual.
The exercises use the technique described in “Starting Strength:
Basic Barbell Training, 3rd ed.” The Bluebook may be purchased through
The Aasgaard Company online store and on Amazon in various mediums
(paperback, Kindle, audio). All lifts are performed with the barbell, as
indicated by the book title.
To properly utilize these standards, it is recommended to review
“Starting Strength: Basic Barbell Training” and “Practical
Programming for Strength Training.” The most recent and relevant 3rd editions
(2012) are available on their website, as well as in different mediums
on Amazon. You can download online book samples to determine if Starting
Strength suits your needs.
Strength Standard
|
Category
|
Male Bench Press Std 1RM By Bodyweight Mark Rippetoe
|
Bench Press
|
Male Deadlift Std 1RM By Bodyweight Mark Rippetoe
|
Deadlift
|
Male Press Std 1RM By Bodyweight Mark Rippetoe
|
Press
|
Male Squat Std 1RM By Bodyweight Mark Rippetoe
|
Squat
|
There are five Starting Strength Standards, with the Power Clean
excluded in this report. Each of the four remaining Standards is
presented below, followed by a plot to visualize performances for
comparison and motivation.
Male Bench Press Standards
Bodyweight (lb)
|
Cat. I
|
Cat. II
|
Cat. III
|
Cat. IV
|
Cat. V
|
114
|
84
|
107
|
130
|
179
|
222
|
123
|
91
|
116
|
142
|
194
|
242
|
132
|
98
|
125
|
153
|
208
|
260
|
148
|
109
|
140
|
172
|
234
|
291
|
165
|
119
|
152
|
187
|
255
|
319
|
181
|
128
|
164
|
201
|
275
|
343
|
198
|
135
|
173
|
213
|
289
|
362
|
220
|
142
|
183
|
225
|
306
|
381
|
242
|
149
|
190
|
232
|
316
|
395
|
275
|
153
|
196
|
239
|
325
|
407
|
319
|
156
|
199
|
244
|
333
|
416
|
320+
|
159
|
204
|
248
|
340
|
425
|

Male Deadlift Standards
Bodyweight (lb)
|
Cat. I
|
Cat. II
|
Cat. III
|
Cat. IV
|
Cat. V
|
114
|
97
|
179
|
204
|
299
|
387
|
123
|
105
|
194
|
222
|
320
|
414
|
132
|
113
|
209
|
239
|
342
|
438
|
148
|
126
|
234
|
269
|
380
|
482
|
165
|
137
|
254
|
293
|
411
|
518
|
181
|
148
|
274
|
315
|
438
|
548
|
198
|
156
|
289
|
333
|
457
|
567
|
220
|
164
|
305
|
351
|
479
|
586
|
242
|
172
|
318
|
363
|
490
|
596
|
275
|
176
|
326
|
373
|
499
|
602
|
319
|
180
|
333
|
381
|
506
|
608
|
320+
|
183
|
340
|
388
|
512
|
617
|

Male Press Standards
Bodyweight (lb)
|
Cat. I
|
Cat. II
|
Cat. III
|
Cat. IV
|
Cat. V
|
114
|
53
|
72
|
90
|
107
|
129
|
123
|
57
|
78
|
98
|
116
|
141
|
132
|
61
|
84
|
105
|
125
|
151
|
148
|
69
|
94
|
119
|
140
|
169
|
165
|
75
|
102
|
129
|
153
|
186
|
181
|
81
|
110
|
138
|
164
|
218
|
198
|
85
|
116
|
146
|
173
|
234
|
220
|
89
|
122
|
155
|
183
|
255
|
242
|
93
|
127
|
159
|
189
|
264
|
275
|
96
|
131
|
164
|
194
|
272
|
319
|
98
|
133
|
167
|
199
|
278
|
320+
|
100
|
136
|
171
|
203
|
284
|

Male Squat Standards
Bodyweight (lb)
|
Cat. I
|
Cat. II
|
Cat. III
|
Cat. IV
|
Cat. V
|
114
|
78
|
144
|
174
|
240
|
320
|
123
|
84
|
155
|
190
|
259
|
346
|
132
|
91
|
168
|
205
|
278
|
369
|
148
|
101
|
188
|
230
|
313
|
410
|
165
|
110
|
204
|
250
|
342
|
445
|
181
|
119
|
220
|
269
|
367
|
479
|
198
|
125
|
232
|
285
|
387
|
504
|
220
|
132
|
244
|
301
|
409
|
532
|
242
|
137
|
255
|
311
|
423
|
551
|
275
|
141
|
261
|
319
|
435
|
567
|
319
|
144
|
267
|
326
|
445
|
580
|
320+
|
147
|
272
|
332
|
454
|
593
|

REFERENCES
LS0tDQp0aXRsZTogIkZpdG5lc3MgU3RhdHMgVXBkYXRlIg0KYXV0aG9yOiAnQXV0aG9yOiBLZW5kcmljayBUaGFtJw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgIyBjb2xsYXBzZWQ6IG5vDQogICAgICBjb2xsYXBzZWQ6IHllcyAgIyBUaGlzIG1ha2VzIHRoZSBzdWItc2VjdGlvbnMgYXBwZWFyIG9ubHkgd2hlbiB0aGUgcHJpbWFyeSBzZWN0aW9uIGlzIGV4cGFuZGVkDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICAgIHBsYWNlbWVudDogdG9wDQogICAgICB0b2Nfc3VidHJlZTogeWVzICAjIEVuc3VyZXMgdGhhdCBzdWItc2VjdGlvbnMgYXJlIGhpZGRlbiB1bnRpbCB0aGUgcHJpbWFyeSBzZWN0aW9uIGlzIGNsaWNrZWQNCiAgICAjIGNvZGVfZm9sZGluZzogaGlkZSAgICMgSGlkZSB0aGUgY29kZSBieSBkZWZhdWx0DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgIyBBZGQgYSBidXR0b24gdG8gZG93bmxvYWQgdGhlIFIgY29kZQ0KLS0tDQoNCkxhc3QgVXBkYXRlZDogMjAyNC0wOC0wMw0KDQpQcmludCBEYXRlOiBgciBTeXMuRGF0ZSgpYA0KDQo8IS0tICMgUk1EIFNldHVwIC0tPg0KDQo8c3R5bGU+DQoNCi8qIFJlZHVjZSB0aGUgZm9udCBzaXplIG9mIHRoZSBUT0MgKi8NCnsNCiAgZm9udC1zaXplOiAwLjkwZW07IC8qIEFkanVzdCB0aGUgc2l6ZSBhcyBuZWVkZWQgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgYW5kIHNwYWNpbmcgdG8gYWxsIGZpZ3VyZXMgKi8NCmltZyB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQogIHBhZGRpbmc6IDVweDsgLyogQWRkIHBhZGRpbmcgYXJvdW5kIHRoZSBmaWd1cmVzICovDQogIGJvcmRlci1yYWRpdXM6IDVweDsgLyogQWRkIHJvdW5kZWQgY29ybmVycyB0byB0aGUgYm9yZGVyICovDQogIGRpc3BsYXk6IGJsb2NrOyAvKiBFbnN1cmUgdGhlIGltYWdlIGlzIHRyZWF0ZWQgYXMgYSBibG9jayBlbGVtZW50IHRvIHJlc3BlY3QgbWFyZ2luICovDQogIG1hcmdpbi1ib3R0b206IDIwcHg7IC8qIEFkZCBib3R0b20gbWFyZ2luIHRvIGVhY2ggaW1hZ2UgZm9yIHNwYWNpbmcgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgdG8gYWxsIHRhYmxlcyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAvKiBDb2xsYXBzZSBib3JkZXJzIGludG8gYSBzaW5nbGUgYm9yZGVyICovDQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQogIG1hcmdpbi1ib3R0b206IDIwcHg7IC8qIEFkZCBib3R0b20gbWFyZ2luIHRvIGVhY2ggdGFibGUgZm9yIHNwYWNpbmcgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgdG8gdGFibGUgY2VsbHMgKi8NCnRoLCB0ZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlIGZvciB0YWJsZSBjZWxscyAqLw0KICBwYWRkaW5nOiA4cHg7IC8qIEFkZCBwYWRkaW5nIGluc2lkZSB0aGUgdGFibGUgY2VsbHMgKi8NCiAgdGV4dC1hbGlnbjogbGVmdDsgLyogQWxpZ24gdGV4dCB0byB0aGUgbGVmdCB3aXRoaW4gdGFibGUgY2VsbHMgKi8NCn0NCg0KDQovKiBFbnN1cmluZyBhbGwgY29sdW1uIGhlYWRlcnMgYXJlIGFsaWduZWQgdG8gdGhlIGxlZnQgKi8NCnRhYmxlLmthYmxlLXRhYmxlIHRoLCB0YWJsZS5rYWJsZS10YWJsZSB0ZCB7DQogICB0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7DQp9DQoNCg0KLyogQXBwbHkgc3R5bGVzIHRvIGFsbCBoZWFkZXJzICovDQp0aCB7DQogIHBvc2l0aW9uOiBzdGlja3k7IC8qIEVuc3VyZSBoZWFkZXJzIHN0aWNrIHdoZW4gc2Nyb2xsaW5nICovDQogIHRvcDogMDsgLyogUG9zaXRpb24gaGVhZGVycyBhdCB0aGUgdG9wICovDQogIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7IC8qIEJhY2tncm91bmQgY29sb3IgZm9yIGhlYWRlcnMgKi8NCiAgei1pbmRleDogOTk5OyAvKiBFbnN1cmUgaGVhZGVycyBzdGF5IG9uIHRvcCBvZiBvdGhlciBlbGVtZW50cyAqLw0KfQ0KDQovKiBBcHBseSBzdHlsZXMgdG8gYWxsIHRhYmxlcyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAvKiBDb2xsYXBzZSBib3JkZXJzIGludG8gYSBzaW5nbGUgYm9yZGVyICovDQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQp9DQoNCi8qIEFwcGx5IHN0eWxlcyB0byB0YWJsZSBjZWxscyAqLw0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgZm9yIHRhYmxlIGNlbGxzICovDQogIHBhZGRpbmc6IDhweDsgLyogQWRkIHBhZGRpbmcgaW5zaWRlIHRoZSB0YWJsZSBjZWxscyAqLw0KICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBBbGlnbiB0ZXh0IHRvIHRoZSBsZWZ0IHdpdGhpbiB0YWJsZSBjZWxscyAqLw0KfQ0KDQovKiBTdHlsZSB0YWJsZXMgd2l0aCBhbHRlcm5hdGluZyBzdHJpcGVkIHJvd3MgKi8NCnRhYmxlIHsNCiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCiAgd2lkdGg6IDEwMCU7DQp9DQoNCnRoLCB0ZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQogIHRleHQtYWxpZ246IGxlZnQ7DQogIHBhZGRpbmc6IDhweDsNCn0NCg0KLyogQWRkIGFsdGVybmF0aW5nIGJhY2tncm91bmQgY29sb3JzIHRvIHRhYmxlIHJvd3MgKi8NCnRyOm50aC1jaGlsZChldmVuKSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7DQp9DQoNCnRyOm50aC1jaGlsZChvZGQpIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgLyogV2hpdGUgYmFja2dyb3VuZCBmb3Igb2RkIHJvd3MgKi8NCn0NCg0KPC9zdHlsZT4NCg0KYGBge3IgZGVmYXVsdF9jaHVua19vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQ0KIyBTZXQgcmVwb3NpdG9yeSBhbmQgZGVmYXVsdCBjaHVuayBvcHRpb25zDQpvcHRpb25zKHJlcG9zID0gYyhDUkFOID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCjwhLS0gDQpPcHRpb25zIHN1Y2ggYXMgZWNobywgbWVzc2FnZSwgd2FybmluZywgcmVzdWx0cywgaW5jbHVkZSwgZXZhbCwgY2FjaGUsIGFuZCBtb3JlLiANCg0KLSBlY2hvOiBTaG93IG9yIGhpZGUgY29kZSBpbiB0aGUgb3V0cHV0IChlY2hvID0gRkFMU0UgaGlkZXMgdGhlIGNvZGUpLg0KLSBtZXNzYWdlOiBTaG93IG9yIGhpZGUgbWVzc2FnZXMgaW4gdGhlIG91dHB1dCAobWVzc2FnZSA9IEZBTFNFIHN1cHByZXNzZXMgbWVzc2FnZXMpLg0KLSB3YXJuaW5nOiBTaG93IG9yIGhpZGUgd2FybmluZ3MgaW4gdGhlIG91dHB1dCAod2FybmluZyA9IEZBTFNFIHN1cHByZXNzZXMgd2FybmluZ3MpLg0KLSByZXN1bHRzOiBDb250cm9sIGhvdyByZXN1bHRzIGFyZSBzaG93bjoNCiAgLSAnbWFya3VwJzogRGlzcGxheSByZXN1bHRzIGFzIHRoZXkgYXJlLg0KICAtICdhc2lzJzogSW5jbHVkZSByZXN1bHRzIGFzIHJhdyBIVE1MIG9yIExhVGVYLg0KICAtICdoaWRlJzogSGlkZSByZXN1bHRzIGZyb20gb3V0cHV0Lg0KLSBpbmNsdWRlOiBJbmNsdWRlIG9yIGV4Y2x1ZGUgYm90aCBjb2RlIGFuZCByZXN1bHRzIGZyb20gdGhlIG91dHB1dCAoaW5jbHVkZSA9IEZBTFNFIGV4Y2x1ZGVzIGV2ZXJ5dGhpbmcpLg0KLSBldmFsOiBFdmFsdWF0ZSB0aGUgY29kZSBjaHVuayBvciBub3QgKGV2YWwgPSBGQUxTRSBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbikuDQotIGNhY2hlOiBDYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2h1bmsgdG8gc3BlZWQgdXAgcmVuZGVyaW5nIChjYWNoZSA9IFRSVUUgZW5hYmxlcyBjYWNoaW5nKS4NCi0gZmlnLmNhcDogQWRkIGEgY2FwdGlvbiB0byBncmFwaGljYWwgb3V0cHV0cy4NCi0gb3V0LndpZHRoL291dC5oZWlnaHQ6IFNldCB0aGUgb3V0cHV0IHNpemUgb2YgcGxvdHMuDQotIGNvbGxhcHNlOiBDb25jYXRlbmF0ZSB0ZXh0dWFsIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrLg0KLSB0aWR5OiBUaWR5IHVwIHRoZSBkaXNwbGF5IG9mIGNvZGUgb3IgcmVzdWx0cyAodGlkeSA9IFRSVUUgdGlkaWVzIHRoZSBvdXRwdXQpLg0KLS0+DQoNCmBgYHtyIHBhY2thZ2VzX2FuZF9saWJyYXJpZXMsIGV2YWw9VFJVRX0NCg0KIyBMaXN0IG9mIGFsbCByZXF1aXJlZCBsaWJyYXJpZXMNCnJlcXVpcmVkX2xpYnJhcmllcyA8LSBjKCJnZ3Bsb3QyIiwgInN0cmluZ3IiLCAicmVhZHhsIiwgImRwbHlyIiwgImx1YnJpZGF0ZSIsICJobXMiLCAib3Blbnhsc3giLCAid3JpdGV4bCIsICJybWFya2Rvd24iLCAia25pdHIiLCAia2FibGVFeHRyYSIsICJnZ25ld3NjYWxlIiwgImdyaWRFeHRyYSIpDQoNCiMgZ2dwbG90MiAgICAgZm9yICdkZWNsYXJhdGl2ZWx5JyBjcmVhdGluZyBncmFwaGljcywgYmFzZWQgb24gIlRoZSBHcmFtbWFyIG9mIEdyYXBoaWNzIi4gDQojIHN0cmluZ3IgICAgIGZvciB3b3JraW5nIHdpdGggc3RyaW5ncywgaS5lLiwgY2hhcmFjdGVyIGRhdGEuDQojIHJlYWR4bCAgICAgIGZvciByZWFkaW5nIEV4Y2VsIGZpbGVzIGJ5IHByb3ZpZGluZyBhIHdheSB0byByZWFkIHhscyBhbmQgeGxzeCBmaWxlcyBpbnRvIFIgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgc29mdHdhcmUuDQojIGRwbHlyICAgICAgIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgcHJvdmlkaW5nIGEgY29uc2lzdGVudCBzZXQgb2YgdmVyYnMgdGhhdCBoZWxwIHlvdSBzb2x2ZSB0aGUgbW9zdCBjb21tb24gZGF0YSBtYW5pcHVsYXRpb24gY2hhbGxlbmdlcy4NCiMgbHVicmlkYXRlICAgZm9yIHdvcmtpbmcgd2l0aCBkYXRlcyBhbmQgdGltZXMgaW4gUi4NCiMgaG1zICAgICAgICAgZm9yIHN0b3JpbmcgdGltZS1vZi1kYXkgdmFsdWVzIGFuZCBpbnRlcmZhY2luZyB0aGVzZSB2YWx1ZXMgd2l0aCBiYXNlIFIncyBkYXRlLXRpbWUgY2xhc3Nlcy4NCiMgb3Blbnhsc3ggICAgZm9yIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byBNaWNyb3NvZnQgRXhjZWwgLnhsc3ggZmlsZXMuIEl0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIGp1c3QgaGFuZGxpbmcgZGF0YTsgaXQgYWxzbyBhbGxvd3MgeW91IHRvIG1vZGlmeSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIEV4Y2VsIGZpbGUgaXRzZWxmLg0KIyB3cml0ZXhsICAgICBmb3IgYSBmYXN0IGFuZCBwb3J0YWJsZSB3YXkgdG8gd3JpdGUgZGF0YSBmcmFtZXMgdG8gRXhjZWwgLnhsc3ggZmlsZXMsIGZvY3VzaW5nIHNvbGVseSBvbiB3cml0aW5nIGRhdGEgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzLg0KIyBybWFya2Rvd24gICBmb3IgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiBmcm9tIFIuIEl0IGludGVncmF0ZXMgdGhlIGNvcmUgc3ludGF4IG9mIG1hcmtkb3duIChhIHNpbXBsZSBtYXJrdXAgbGFuZ3VhZ2UpIHdpdGggUiBjb2RlLCBhbGxvd2luZyBmb3IgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgcmVwb3J0cyB0byByZWZsZWN0IGRhdGEgY2hhbmdlcyBhbmQgYW5hbHlzaXMgdXBkYXRlcy4NCiMga25pdHIgICAgICAgZm9yIHVzaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIGthYmxlKCkgdG8gZm9ybWF0IGRhdGFmcmFtZXMgYXMgbWFya2Rvd24gdGFibGVzLiANCiMga2FibGVFeHRyYSAgZm9yIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yIHN0eWxpbmcgdGFibGVzIHN1Y2ggYXMgZGlzcGxheWluZyBjb2x1bW5zIGV2ZW5seQ0KIyBnZ25ld3NjYWxlICBmb3IgY3JlYXRpbmcgbmV3IGNvbG9yIHBhbGV0dGVzIGFuZCBtb3JlDQojIGdyaWRFeHRyYQ0KDQojIENoZWNrIHdoaWNoIGxpYnJhcmllcyBhcmUgbm90IGluc3RhbGxlZA0KaW5zdGFsbGVkX2xpYnMgPC0gcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpDQpsaWJyYXJpZXNfdG9faW5zdGFsbCA8LSByZXF1aXJlZF9saWJyYXJpZXNbIXJlcXVpcmVkX2xpYnJhcmllcyAlaW4lIGluc3RhbGxlZF9saWJzXQ0KDQojIEluc3RhbGwgbWlzc2luZyBsaWJyYXJpZXMNCmlmKGxlbmd0aChsaWJyYXJpZXNfdG9faW5zdGFsbCkgPiAwKSB7DQogIGluc3RhbGwucGFja2FnZXMobGlicmFyaWVzX3RvX2luc3RhbGwpDQp9DQoNCiMgTG9hZCBhbGwgcmVxdWlyZWQgbGlicmFyaWVzDQpsYXBwbHkocmVxdWlyZWRfbGlicmFyaWVzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpgYGANCg0KYGBge3IgbG9hZCBLREZfUl9NYXJrZG93biwgZXZhbD1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KIyBMb2FkIHRoZSBzYXZlZCB3b3Jrc3BhY2UNCndvcmtzcGFjZV9maWxlIDwtICJDOi9Vc2Vycy9rZW5kci9PbmVEcml2ZS9Eb2N1bWVudHMvRGF0YSBBbmFseXRpY3MvS2VuRG9lc0ZpdG5lc3MvV29ya3NwYWNlL0tERiBXb3Jrc3BhY2UuUkRhdGEiDQppZiAoZmlsZS5leGlzdHMod29ya3NwYWNlX2ZpbGUpKSB7DQogIGxvYWQod29ya3NwYWNlX2ZpbGUpDQogIGNhdCgiV29ya3NwYWNlIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKQ0KICAjIENoZWNrIGlmIGEgc3BlY2lmaWMgb2JqZWN0IGV4aXN0cyBpbiB0aGUgbG9hZGVkIHdvcmtzcGFjZQ0KICBpZiAoZXhpc3RzKCJuYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYiKSkgew0KICAgIGNhdCgiT2JqZWN0ICduYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYnIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKQ0KICB9IGVsc2Ugew0KICAgIGNhdCgiT2JqZWN0ICduYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYnIGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuXG4iKQ0KICB9DQp9IGVsc2Ugew0KICBjYXQoIldvcmtzcGFjZSBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aDogIiwgd29ya3NwYWNlX2ZpbGUsICJcbiIpDQp9DQoNCmBgYA0KDQojIFRBQkxFIE9GIENPTlRFTlRTIA0KVXRpbGl6ZSB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgbWVudSBvbiB0aGUgbGVmdCB0byBzY3JvbGwgdGhyb3VnaCB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGFuZCBoZWxwIG5hdmlnYXRlIHRoaXMgcmVwb3J0LiBZb3UgY2FuIGNsaWNrIG9uIHRoZSB0aXRsZSB0byBnbyBkaXJlY3RseSB0byB0aGUgc2VjdGlvbi4NCg0KKipDb25zaWRlcmF0aW9uczoqKiANCg0KVGVybWlub2xvZ3kgLSBUaGUgdGVybXMgYWN0aXZpdHksIHdvcmtvdXQsIGFuZCBleGVyY2lzZSBtYXkgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgaW4gdGhpcyBjb250ZXh0LCBldmVuIHRob3VnaCB0aGV5IGhhdmUgZGlzdGluY3QgbWVhbmluZ3MuDQoNCkRhdGEgQXNzdW1wdGlvbnMgLSBUaGUgZGF0YSB1c2VkIGZvciBhbmFseXNlcyBhc3N1bWVzIGVhY2ggc2V0IG9mIGV4ZXJjaXNlIGlzIHBlcmZvcm1lZCB0byBSZXAgTWF4IChSTSksIHdoaWNoIGlzbid0IGFsd2F5cyB0aGUgY2FzZSwgcGFydGljdWxhcmx5IGlmIHRoZSBpbmRpdmlkdWFsIGlzbid0IGFpbWluZyB0byBwZXJmb3JtIHRoZSBzZXQgdG8gUk0uIEFzc3VtaW5nIGVhY2ggc2V0IG9mIGV4ZXJjaXNlIGlzIHBlcmZvcm1lZCB0byBSZXAgTWF4IGhlbHBzIHN0YW5kYXJkaXplIGRhdGEgYW5kIHByb3ZpZGUgY2xlYXIgaW5zaWdodHMgaW50byBtYXhpbWFsIHN0cmVuZ3RoLCB3aGljaCBpcyBiZW5lZmljaWFsIGZvciBiZW5jaG1hcmtpbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzLiBIb3dldmVyLCBpdCBjYW4gYWxzbyBsZWFkIHRvIGluYWNjdXJhY2llcywgcG90ZW50aWFsIG92ZXJ0cmFpbmluZywgYW5kIG1pc2xlYWRpbmcgZGF0YSBpZiBub3QgYWxsIGV4ZXJjaXNlcyBhcmUgcGVyZm9ybWVkIHRvIGZhaWx1cmUuIEJhbGFuY2luZyB0aGUgdXNlIG9mIDFSTSBhc3N1bXB0aW9ucyB3aXRoIHJlYWxpc3RpYyB0cmFpbmluZyBwcmFjdGljZXMgaXMgZXNzZW50aWFsIGZvciBhY2N1cmF0ZSBwZXJmb3JtYW5jZSBhc3Nlc3NtZW50IGFuZCBlZmZlY3RpdmUgdHJhaW5pbmcgcHJvZ3JhbW1pbmcuDQoNCiMgU1RBVFMgVE8gU1RBTkRBUkRTDQoNCioqSW50ZWdyYXRpbmcgUGVyZm9ybWFuY2UgTWV0cmljcyB3aXRoIE1hcmsgUmlwcGV0b2UgU3RyZW5ndGggU3RhbmRhcmRzKiogDQoNClBlcmZvcm1hbmNlIG1lYXN1cmVzIGFyZSBldmFsdWF0ZWQgdG8gbWF0Y2ggc3RhbmRhcmRzLiBUaGlzIHNlY3Rpb24gY29tYmluZXMgcHJhY3RpY2FsIHdvcmtvdXQgZGF0YSBhbmFseXNpcyB3aXRoIE1hcmsgUmlwcGV0b2UncyBTdHJlbmd0aCBTdGFuZGFyZHMgKHNlZSBUT0MgTWVudSkuIFRoZSBzdGFuZGFyZHMgYXJlIGVzc2VudGlhbCBmb3IgZXZhbHVhdGluZyBhbmQgY29udGV4dHVhbGl6aW5nIGluZGl2aWR1YWwgZml0bmVzcyBhY2hpZXZlbWVudHMgYWdhaW5zdCBzdGFuZGFyZGl6ZWQgY3JpdGVyaWEuDQoNCkZvciBhIGhpZ2hlciBxdWFsaXR5IG9mIHBlcnNvbmFsIHBlcmZvcm1hbmNlIGNvbXBhcmlzb24sIHdlIGRlZmluZSBzcGVjaWZpYyBjcml0ZXJpYSB0byBtYXRjaCB0aGUgc3RhbmRhcmRzIHByZXNlbnRlZCBieSBNYXJrLiBTaG91bGQgd2UgY2hvb3NlLCB3ZSBjYW4gc3BlY2lmeSBvdXIgY3JpdGVyaWEgZm9yIEZsYXQgQmVuY2ggRHVtYmJlbGwgQ2hlc3QgUHJlc3Mgb3IgSW5jbGluZSBCZW5jaCBEdW1iYmVsbCBDaGVzdCBQcmVzcywgZWFjaCBsaWtlbHkgcmVxdWlyaW5nIGRpZmZlcmVudCB3ZWlnaHRzIGFuZCBudW1iZXJzIG9mIHJlcHMgZm9yIGV4ZWN1dGlvbi4gVG8gbm90ZSBNYXJrIFJpcHBldG9lJ3MgdHJhaW5pbmcgdXRpbGl6ZXMgdGhlIGJhcmJlbGwgYXMgdGhlIGluc3RydW1lbnQgZm9yIGdyb3d0aC4gQnkgZXhwbGFpbmluZyBpbiBkZXRhaWwgdGhlIEJlbmNoIFByZXNzIGluIGhpcyBTdGFydGluZyBTdHJlbmd0aCBib29rIFteMV0sIHdlIGtub3cgdGhlIHN0cmVuZ3RoIHN0YW5kYXJkIGlzIG1lYXN1cmVkIHZpYSB0aGUgZmxhdCBiZW5jaC4gVGhlcmVmb3JlLCB3ZSBzcGVjaWZ5IEZsYXQgQmVuY2ggQmFyYmVsbCBDaGVzdCBQcmVzcyBpbiBvdXIgY3JpdGVyaWEgdG8gY29tcGFyZSB3aXRoIE1hcmsgUmlwcGV0b2UncyAxUk0gTWFsZSBCZW5jaCBQcmVzcyBTdGFuZGFyZHMuDQoNCiMjIDFSTSBUYWJsZSAtIEF2ZyBMMlcgJiBBVEggDQoNCi0gVGhlIGZvbGxvd2luZyB0YWJsZSByZXBvcnRzIHRoZSBhdmVyYWdlIG9uZS1yZXBldGl0aW9uIG1heGltdW0gKDFSTSkgZm9yIGVhY2ggaW5kaXZpZHVhbCBhY3Jvc3MgZWFjaCBzcGVjaWZpZWQgZXhlcmNpc2UgKCJTZWxlY3RlZCBDcml0ZXJpYSIpIG92ZXIgdGhlIGxhc3QgdHdvIHdlZWtzIChMMlcpLiBUaGUgZGF0YSBmb3IgdGhlIGxhc3QgdHdvIHdlZWtzIHNlcnZlcyBhcyBhIGJlbmNobWFyayBmb3IgdGhlIG5leHQgd29ya291dC4gQXMgdGhlIHNheWluZyBnb2VzLCAiWW91J3JlIG9ubHkgYXMgZ29vZCBhcyB5b3VyIGxhc3QuIg0KDQotIFRoZSB0YWJsZSBhbHNvIHJlcG9ydHMgaGlnaGVzdCAxUk0gb3ZlciBhbGwgdGltZSAoQVRIKSBmb3IgZWFjaCBzZWxlY3RlZCBjcml0ZXJpb24sIGFjY29tcGFuaWVkIGJ5IHRoZSBsYXN0IGRhdGUgdGhlIGhpZ2hlc3QgMVJNIHdhcyBhY2hpZXZlZC4NCg0KLSBUaGUgMVJNIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2VpZ2h0IGV4ZWN1dGVkIHBlciBzZXQgYW5kIHRoZSBudW1iZXIgb2YgcmVwcywgdXNpbmcgdGhlIDFSTSBDb252ZXJzaW9uIFRhYmxlW14yXS4NCg0KLSBEYXRhIGlzIGRlcml2ZWQgZnJvbSBtZWFzdXJlcyBlbnRlcmVkIGluIHRoZSAiS2VuIERvZXMgRml0bmVzcy54bHNtIFdvcmtib29rW14zXS4iDQoNCi0gQWxsIGNhbGN1bGF0aW9ucyBhc3N1bWUgdGhlIHN0YW5kYXJkIGJhcmJlbGwgKE9seW1waWMgYmFyYmVsbCkgd2VpZ2h0IG9mIDQ1IHBvdW5kcyAoMjAuNCBrZykuDQoNCktlZXAgaW4gbWluZCB0aGVyZSBhcmUgbWFueSB2YXJpYWJsZXMgYWZmZWN0aW5nIHBlcmZvcm1hbmNlLiBPbmUgb2YgdGhlc2UgdmFyaWFibGVzIGluY2x1ZGVzIGdyaXAgKHdpZGUsIGFsdGVybmF0aW5nLCBvdmVyaGFuZCwgZXRjLikuIE9uZSBpbmRpdmlkdWFsIG1heSB1c2UgYWx0ZXJuYXRpbmcgZ3JpcHMgKGxlZnQgdW5kZXJoYW5kL3JpZ2h0IG92ZXJoYW5kLCBvciB2aWNlLXZlcnNhKSB3aGVuIHBlcmZvcm1pbmcgZGVhZGxpZnRzIHRvIG1heGltaXplIHdlaWdodCBleGVjdXRpb24uIEFub3RoZXIgaW5kaXZpZHVhbCBtaWdodCB1dGlsaXplIGFuIG92ZXJoYW5kIGdyaXAuIFNvbWVvbmUgZWxzZSBtYXkgcGVyZm9ybSBhIGNvbWJpbmF0aW9uIG9mIGFsdGVybmF0aW5nIGdyaXAgYW5kIG92ZXJoYW5kIGdyaXAuIFRoZSBmb2xsb3dpbmcgZGF0YXNldHMgYW5kIGZpZ3VyZXMgZG8gbm90IGFjY291bnQgZm9yIHRoZXNlIGRpZmZlcmVuY2VzLg0KDQojIyBJbmRpdmlkdWFsIFBlcmZvcm1hbmNlIFRhYmxlcw0KDQpgYGB7ciBpbmRpdmlkdWFsX3RhYmxlX3BlcmZvcm1hbmNlX3RvX21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzLCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggdW5pcXVlIG5hbWUgYW5kIGdlbmVyYXRlIGEgdGFibGUgZm9yIGVhY2gNCmZvciAoaSBpbiBzZXFfYWxvbmcodW5pcXVlKGRpc3BsYXlfcGVyZm9ybWFuY2Vfb25fbWFya19yaXBwZXRvZV9zdGFuZGFyZHMkTmFtZSkpKSB7DQogIA0KICBuYW1lIDwtIHVuaXF1ZShkaXNwbGF5X3BlcmZvcm1hbmNlX29uX21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzJE5hbWUpW2ldDQogIA0KICAjIEFkZCB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrIHRvIHByb2Nlc3Mgb25seSAiQWxleCIsICJLZW5kcmljayIsIG9yICJKb3NoIg0KICAgaWYgKG5hbWUgJWluJSBjKCJBbGV4IiwgIktlbmRyaWNrIiwgIkpvc2giKSkgew0KICANCiAgIyBBZGQgdGhpcyBjb25kaXRpb25hbCBjaGVjayB0byBwcm9jZXNzIG9ubHkgIkFsZXgiIG9yIG90aGVyLg0KICAjIGlmIChuYW1lID09ICJBbGV4Iikgew0KICANCiAgICAjIEZpbHRlciB0aGUgcmVzdWx0cyBmb3IgdGhlIGN1cnJlbnQgbmFtZQ0KICAgIGluZGl2aWR1YWxfcGVyZm9ybWFuY2UgPC0gZGlzcGxheV9wZXJmb3JtYW5jZV9vbl9tYXJrX3JpcHBldG9lX3N0YW5kYXJkcyAlPiUNCiAgICAgIGZpbHRlcihOYW1lID09IG5hbWUpICU+JQ0KICAgICAgc2VsZWN0KC1OYW1lKSAgIyBSZW1vdmUgdGhlICJOYW1lIiBjb2x1bW4gZm9yIHRoZSB0YWJsZQ0KICAgIA0KICAgICMgUHJpbnQgdGhlIHNlY3Rpb24gaGVhZGVyDQogICAgY2F0KHBhc3RlMCgiXG5cbjxoND4iLCBuYW1lLCAiIC0gMVJNIFBlcmZvcm1hbmNlIDwvaDQ+XG5cbiIpKQ0KICAgIA0KICAgICMgVXNlIGthYmxlIGFuZCBrYWJsZUV4dHJhIGZvciBmb3JtYXR0aW5nIG9mIHRhYmxlIG91dHB1dA0KICAgIGthYmxlKGluZGl2aWR1YWxfcGVyZm9ybWFuY2UsICJodG1sIiwgYWxpZ24gPSAnbCcpICU+JSANCiAgICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFRSVUUpICU+JQ0KICAgICAgY29sdW1uX3NwZWMoMTpuY29sKGluZGl2aWR1YWxfcGVyZm9ybWFuY2UpLCB3aWR0aCA9ICJhdXRvIikgJT4lDQogICAgICBwcmludCgpICAjIFByaW50IGVhY2ggdGFibGUNCiAgICANCiAgICBjYXQoIlxuXG4iKQ0KICB9DQp9DQoNCmBgYA0KDQojIyAxUk0gUGxvdHMgLSBQZXJmb3JtYW5jZSBPdmVyIFN0YW5kYXJkcyANClBlcmZvcm1hbmNlIGlzIHBsb3R0ZWQgb3ZlciBNYXJrIFJpcHBldG9lJ3MgU3RyZW5ndGggU3RhbmRhcmRzLg0KDQpTb21lIGNvbnNpZGVyYXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHBsb3RzOg0KDQotIEF2ZXJhZ2UgMVJNIGZvciBlYWNoIGluZGl2aWR1YWwgaXMgYmFzZWQgb24gZGF0YSBmcm9tIHRoZSBsYXN0IDIgd2Vla3MgKEwyVykuIEFzIHByZXNlbnRlZCBpbiB0aGUgMVJNIFRhYmxlIGFib3ZlLCBkYXRlIHJhbmdlcyBiZXR3ZWVuIGVhY2ggaW5kaXZpZHVhbCBkaWZmZXIsIHJhbmdpbmcgZnJvbSBhIGZldyB3ZWVrcyB0byBzZXZlcmFsIG1vbnRocyBvciBldmVuIHllYXJzLiBEZXNwaXRlIHRoZXNlIGRpZmZlcmVuY2VzLCB0aGlzIHBsb3QgaXMgc3RpbGwgYmVuZWZpY2lhbCBmb3IgY29tcGFyaW5nIHBlcmZvcm1hbmNlIGFtb25nIGluZGl2aWR1YWxzLCBmb3N0ZXJpbmcgZnJpZW5kbHkgY29tcGV0aXRpb24sIGFuZCBtb3RpdmF0aW5nIGFjdGlvbiB0b3dhcmQgaGlnaGVyIHBlcmZvcm1hbmNlLg0KDQotIEhpZ2hlc3QgMVJNIChBVEggLSBBbGwgVGltZSBIaWdocykgZm9yIGVhY2ggaW5kaXZpZHVhbCBpcyBiYXNlZCBvbiBkYXRhIGZyb20gYWxsIGVudHJpZXMuDQoNCi0gQXZlcmFnZSBCb2R5d2VpZ2h0IHJlcHJlc2VudHMgZGF0YSBmcm9tIHRoZSBsYXN0IDIgd2Vla3Mgb2YgZW50cmllcyBmb3IgZWFjaCBpbmRpdmlkdWFsLiBUaGUgZm9sbG93aW5nIHBsb3RzIGFuZCBDYXRlZ29yeSBMZXZlbHMgdXNlIEF2ZXJhZ2UgQm9keXdlaWdodCBmb3IgYm90aCBBdmVyYWdlIDFSTSBMMlcgYW5kIEFUSCBleGVjdXRpb25zLiBTZXBhcmF0ZSBjYWxjdWxhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIG9idGFpbiBCb2R5d2VpZ2h0IGF0IHRoZSB0aW1lIHdoZW4gQXZlcmFnZSAxUk0gTDJXIHdhcyBleGVjdXRlZCBhbmQgQm9keXdlaWdodCB3aGVuIEFUSCAxUk0gd2FzIGV4ZWN1dGVkLg0KDQotIFRoZSBkYXRlIGFuZCBkYXRlIHJhbmdlcyBmb3IgQXZlcmFnZSBCb2R5d2VpZ2h0IChsYnMpIGFuZCAxUk0gc3RhdGlzdGljcyBtYXkgbm90IGFsaWduLiBGb3IgZXhhbXBsZTogDQogICAgLSBEYXRlIFJhbmdlIGZvciBBdmVyYWdlIDFSTSBMMlc6IDIwMjMtMTAtMjcgdG8gMjAyMy0xMS0wOQkJDQogICAgLSBEYXRlIGZvciBBVEggMVJNOiAyMDIzLTEwLTE4CQ0KICAgIC0gRGF0ZSBSYW5nZSBmb3IgQXZlcmFnZSBCb2R5d2VpZ2h0IEwyVzogMjAyNC0wNS0yNCB0byAyMDI0LTA2LTA2DQogICAgLSBGdXJ0aGVyIGNhbGN1bGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYWxpZ24gdGhlIGRhdGUgcmFuZ2VzIGJldHdlZW4gYm9keXdlaWdodCBhbmQgcGVyZm9ybWFuY2UsIGFsbG93aW5nIGdyZWF0ZXIgcmVsaWFiaWxpdHkgaW4gdGhlIDFSTSB3ZWlnaHQgZXhlY3V0aW9uLXRvLWJvZHl3ZWlnaHQgcmF0aW8uDQoNCiMjIEwyVyAmIEFUSCAtIFNpZGUgQnkgU2lkZSANClBlcmZvcm1hbmNlIG1lYXN1cmVzIGZvciBBdmVyYWdlIDFSTSBMYXN0IDIgV2Vla3MgKEwyVykgYW5kIEhpZ2hlc3QgMVJNIEFsbCBUaW1lIChBVEgpIGFyZSBtZXJnZWQgaW50byBvbmUgcGxvdCBmb3Igc2lkZS1ieS1zaWRlIGNvbXBhcmlzb24uIFRoaXMgdmlzdWFsaXphdGlvbiBoZWxwcyByZWFjaCBoaWdoZXIgcGVyZm9ybWFuY2UgYnkgaGlnaGxpZ2h0aW5nIHJlY2VudCBwZXJmb3JtYW5jZSBhbmQgaWRlbnRpZnlpbmcgcGVyc29uYWwgYmVzdHMsIHRoZXJlYnkgZm9zdGVyaW5nIGhlYWx0aHkgY29tcGV0aXRpb24gYW5kIG1vdGl2YXRpbmcgY29uc2lzdGVudCBwcm9ncmVzcy4NCg0KVGhpcyBjb21iaW5lZCBwbG90IGFsbG93cyBmb3IgYW4gZWFzeSBjb21wYXJpc29uIG9mIHJlY2VudCBwZXJmb3JtYW5jZSBhbmQgYWxsLXRpbWUgYmVzdHMsIHByb3ZpZGluZyBhIGNsZWFyIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGluZGl2aWR1YWwncyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsLiBVbmRlcnN0YW5kaW5nIHRoZXNlIG1ldHJpY3MgY2FuIGhlbHAgaWRlbnRpZnkgYXJlYXMgZm9yIGltcHJvdmVtZW50IGFuZCBzZXQgZ29hbHMgdG8gc3VycGFzcyB0aGVpciBwZXJzb25hbCBiZXN0cywgdWx0aW1hdGVseSBsZXZlbGluZyB1cCBwZXJmb3JtYW5jZS4NCg0KVXNpbmcgQXZlcmFnZSAxUk0gTGFzdCAyIFdlZWtzIChMMlcpIGZvciB0cmFpbmluZyBwdXJwb3NlcyBpcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIGNvbXBhcmluZyBIaWdoZXN0IDFSTSBMYXN0IDIgV2Vla3MgdG8gMVJNIEFsbCBUaW1lIEhpZ2ggKEFUSCkuIFRoaXMgaXMgYmVjYXVzZSB0aGUgYXZlcmFnZSAxUk0gb3ZlciB0aGUgbGFzdCB0d28gd2Vla3MgcHJvdmlkZXMgYSBtb3JlIGNvbnNpc3RlbnQgYW5kIHJlYWxpc3RpYyBtZWFzdXJlIG9mIGN1cnJlbnQgc3RyZW5ndGggbGV2ZWxzLCB3aGljaCBjYW4gYmUgaW5mbHVlbmNlZCBieSB2YXJpb3VzIGZhY3RvcnMgc3VjaCBhcyBmYXRpZ3VlLCByZWNvdmVyeSwgYW5kIGRhaWx5IHBlcmZvcm1hbmNlIHZhcmlhYmlsaXR5LiBSZWx5aW5nIHNvbGVseSBvbiB0aGUgaGlnaGVzdCAxUk0gbWF5IG5vdCBhY2N1cmF0ZWx5IHJlZmxlY3QgdHJ1ZSBwZXJmb3JtYW5jZSBjYXBhYmlsaXR5IGFuZCBjYW4gbGVhZCB0byB1bnJlYWxpc3RpYyB0cmFpbmluZyBsb2FkcyBhbmQgcG90ZW50aWFsIG92ZXJ0cmFpbmluZy4gDQoNCmBgYHtyIGF2Z18xcm1fX2wyd19hbmRfYXRoXzFybV9vbl9zdGFuZGFyZHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIEVuc3VyZSB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyBhcmUgbG9hZGVkDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIERlZmluZSBjb2xvciBwYWxldHRlcw0KY29sb3JfcGFsZXR0ZV9sMncgPC0gYygiQWxleCAtIEF2ZyBMMlciID0gIiMxZjc3YjQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIktlbmRyaWNrIC0gQXZnIEwyVyIgPSAiI2ZmN2YwZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiTHVjaWVuIC0gQXZnIEwyVyIgPSAiIzk0NjdiZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiSm9zaCAtIEF2ZyBMMlciID0gIiM4YzU2NGIiKQ0KY29sb3JfcGFsZXR0ZV9hdGggPC0gYygiQWxleCAtIEFUSCIgPSAiIzJjYTAyYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiS2VuZHJpY2sgLSBBVEgiID0gIiNkNjI3MjgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkx1Y2llbiAtIEFUSCIgPSAiI2UzNzdjMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiSm9zaCAtIEFUSCIgPSAiIzdmN2Y3ZiIpDQoNCiMgTG9hZCB0aGUgc3RhbmRhcmRzIHRhYmxlcyBhbmQgc3RvcmUgdGhlbSBpbiBhIGxpc3QNCnN0YW5kYXJkc190YWJsZXMgPC0gbGlzdCgNCiAgIm1hbGVfYmVuY2hfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9iZW5jaF9wcmVzc19zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfZGVhZGxpZnRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9kZWFkbGlmdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9wcmVzc19zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfc3F1YXRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9zcXVhdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZQ0KKQ0KDQojIEZ1bmN0aW9uIHRvIGZpbmQgY2F0ZWdvcnkgbGV2ZWwNCmZpbmRfY2F0ZWdvcnlfbGV2ZWwgPC0gZnVuY3Rpb24od2VpZ2h0LCBidywgc3RhbmRhcmRzX3RhYmxlKSB7DQogIHN0YW5kYXJkcyA8LSBzdGFuZGFyZHNfdGFibGVzW1tzdGFuZGFyZHNfdGFibGVdXQ0KICBpZiAoaXMubnVsbChzdGFuZGFyZHMpKSB7DQogICAgc3RvcCgiU3RhbmRhcmRzIHRhYmxlIG5vdCBmb3VuZC4iKQ0KICB9DQogIA0KICByb3VuZGVkX2J3IDwtIHN0YW5kYXJkcyAlPiUgZmlsdGVyKGBCb2R5d2VpZ2h0YCA+PSBidykgJT4lIHNsaWNlKDEpICU+JSBwdWxsKGBCb2R5d2VpZ2h0YCkNCiAgY2F0ZWdvcmllcyA8LSBzdGFuZGFyZHMgJT4lIGZpbHRlcihgQm9keXdlaWdodGAgPT0gcm91bmRlZF9idykNCiAgDQogIGNhdGVnb3J5IDwtIGlmZWxzZSh3ZWlnaHQgPCBjYXRlZ29yaWVzJGBDYXQgIElgLCAiQmVsb3cgQ2F0LiBJIiwNCiAgICAgICAgICAgICAgIGlmZWxzZSh3ZWlnaHQgPCBjYXRlZ29yaWVzJGBDYXQgIElJYCwgIkNhdC4gSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBJSUlgLCAiQ2F0LiBJSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBJVmAsICJDYXQuIElJSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBWYCwgIkNhdC4gSVYiLCAiQ2F0LiBWIikpKSkpDQogIHJldHVybihjYXRlZ29yeSkNCn0NCg0KIyBEZWZpbmUgYSBmdW5jdGlvbiB0byBhZGQgZGF0YSBwb2ludHMgdG8gZXhpc3RpbmcgcGxvdHMNCmFkZF9ib2R5d2VpZ2h0X2FuZF8xcm1fdG9fcGxvdCA8LSBmdW5jdGlvbihleGlzdGluZ19wbG90LCBwZXJmb3JtYW5jZV9kYXRhLCB0YWJsZV9hdmdfYm9keXdlaWdodHNfbGFzdF8yd2ssIHN0YW5kYXJkc190YWJsZSkgew0KICAjIEZpbHRlciBhbmQgam9pbiB0aGUgZGF0YQ0KICBjb21iaW5lZF9kYXRhIDwtIHBlcmZvcm1hbmNlX2RhdGEgJT4lDQogICAgaW5uZXJfam9pbih0YWJsZV9hdmdfYm9keXdlaWdodHNfbGFzdF8yd2ssIGJ5ID0gIk5hbWUiKSAlPiUNCiAgICBtdXRhdGUoYEF2ZXJhZ2UgMVJNIChsYnMpYCA9IGFzLm51bWVyaWMoYEF2ZXJhZ2UgMVJNIChsYnMpYCksDQogICAgICAgICAgIGBIaWdoZXN0IDFSTSBBbGwgVGltZSAobGJzKWAgPSBhcy5udW1lcmljKGBIaWdoZXN0IDFSTSBBbGwgVGltZSAobGJzKWApKSAlPiUNCiAgICBmaWx0ZXIoIWlzLm5hKGBBdmVyYWdlIDFSTSAobGJzKWApICYgYEF2ZXJhZ2UgMVJNIChsYnMpYCAhPSAiTm8gZGF0YSBhdmFpbGFibGUiKSAlPiUNCiAgICBtdXRhdGUoTmFtZV9BdmdfTDJXID0gcGFzdGUoTmFtZSwgIi0gQXZnIEwyVyIpLCANCiAgICAgICAgICAgTmFtZV9BVEggPSBwYXN0ZShOYW1lLCAiLSBBVEgiKSwNCiAgICAgICAgICAgQ2F0ZWdvcnlfTGV2ZWxfTDJXID0gbWFwcGx5KGZpbmRfY2F0ZWdvcnlfbGV2ZWwsIGBBdmVyYWdlIDFSTSAobGJzKWAsIGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgLCBNb3JlQXJncyA9IGxpc3Qoc3RhbmRhcmRzX3RhYmxlID0gc3RhbmRhcmRzX3RhYmxlKSksDQogICAgICAgICAgIENhdGVnb3J5X0xldmVsX0FUSCA9IG1hcHBseShmaW5kX2NhdGVnb3J5X2xldmVsLCBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLCBgQXZlcmFnZV9Cb2R5d2VpZ2h0X0xhc3RfMldrYCwgTW9yZUFyZ3MgPSBsaXN0KHN0YW5kYXJkc190YWJsZSA9IHN0YW5kYXJkc190YWJsZSkpKQ0KDQogICMgQWRkIHBvaW50cyB0byB0aGUgZXhpc3RpbmcgcGxvdA0KICB1cGRhdGVkX3Bsb3QgPC0gZXhpc3RpbmdfcGxvdCArDQogICAgZ2VvbV9wb2ludChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2ssIHkgPSBgQXZlcmFnZSAxUk0gKGxicylgLCBjb2xvciA9IE5hbWVfQXZnX0wyVywgZmlsbCA9IE5hbWVfQXZnX0wyVyksIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDQsIHNoYXBlID0gMjEsIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gQXZlcmFnZV9Cb2R5d2VpZ2h0X0xhc3RfMldrLCB5ID0gYEhpZ2hlc3QgMVJNIEFsbCBUaW1lIChsYnMpYCwgY29sb3IgPSBOYW1lX0FUSCwgZmlsbCA9IE5hbWVfQVRIKSwgDQogICAgICAgICAgICAgICBzaXplID0gNCwgc2hhcGUgPSAyNCwgY29sb3IgPSAiYmxhY2siKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JfcGFsZXR0ZV9sMncsIGNvbG9yX3BhbGV0dGVfYXRoKSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JfcGFsZXR0ZV9sMncsIGNvbG9yX3BhbGV0dGVfYXRoKSkgKw0KICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLCBmaWxsID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMikpICsNCiAgICBsYWJzKGNvbG9yID0gIk5hbWUiLCBmaWxsID0gIk5hbWUiKSArDQogICAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwgIyBEZWNyZWFzZSBsZWdlbmQgdGV4dCBzaXplDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksICMgRGVjcmVhc2UgbGVnZW5kIHRpdGxlIHNpemUNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNSwgImNtIikpICMgRGVjcmVhc2UgbGVnZW5kIGtleSBzaXplDQoNCiAgIyBDcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sdW1ucw0KICB0YWJsZV9kYXRhIDwtIGNvbWJpbmVkX2RhdGEgJT4lDQogICAgc2VsZWN0KE5hbWUsIA0KICAgICAgICAgICBgQXZlcmFnZSAxUk0gKGxicylgLCANCiAgICAgICAgICAgYERhdGUgUmFuZ2UgKExhc3QgMiBXZWVrcylgLCANCiAgICAgICAgICAgQ2F0ZWdvcnlfTGV2ZWxfTDJXLA0KICAgICAgICAgICBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLCANCiAgICAgICAgICAgYExhc3QgRGF0ZSBIaWdoZXN0IDFSTSBBbGwgVGltZWAsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9BVEgsDQogICAgICAgICAgIGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgLCANCiAgICAgICAgICAgRGF0ZV9SYW5nZSkgJT4lDQogICAgcmVuYW1lKA0KICAgICAgICBgRGF0ZSBSYW5nZSBMMldgID0gYERhdGUgUmFuZ2UgKExhc3QgMiBXZWVrcylgLA0KICAgICAgICBgMVJNIEFUSCAobGJzKWAgPSBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLA0KICAgICAgICBgRGF0ZSBBVEhgID0gYExhc3QgRGF0ZSBIaWdoZXN0IDFSTSBBbGwgVGltZWAsDQogICAgICAgIGBBdmcgQlcgTDJXIChsYnMpYCA9IGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgDQogICAgICAgICkNCiAgDQogICMgVXBkYXRlIHRhYmxlIGZ1cnRoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbnMNCiAgdGFibGVfZGF0YSA8LSB0YWJsZV9kYXRhICU+JQ0KICAgIHNlbGVjdChOYW1lLCANCiAgICAgICAgICAgYEF2ZXJhZ2UgMVJNIChsYnMpYCwgDQogICAgICAgICAgIGBEYXRlIFJhbmdlIEwyV2AsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9MMlcsDQogICAgICAgICAgIGAxUk0gQVRIIChsYnMpYCwgDQogICAgICAgICAgIGBEYXRlIEFUSGAsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9BVEgsDQogICAgICAgICAgIGBBdmcgQlcgTDJXIChsYnMpYCwgDQogICAgICAgICAgYERhdGVfUmFuZ2VgDQogICAgICAgICAgICkNCg0KICAjIFN1YnN0aXR1dGUgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXMgaW4gY29sdW1uIG5hbWVzDQogIGNvbG5hbWVzKHRhYmxlX2RhdGEpIDwtIGdzdWIoIl8iLCAiICIsIGNvbG5hbWVzKHRhYmxlX2RhdGEpKQ0KDQogICMgUHJpbnQgdGhlIGNvbWJpbmVkIHRhYmxlIHVzaW5nIGtuaXRyOjprYWJsZQ0KICB0YWJsZV9odG1sIDwtIGthYmxlKHRhYmxlX2RhdGEsIGZvcm1hdCA9ICJodG1sIiwgZXNjYXBlID0gRkFMU0UsIGFsaWduID0gJ2wnKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxOm5jb2wodGFibGVfZGF0YSksIGV4dHJhX2NzcyA9ICJ0ZXh0LWFsaWduOiBsZWZ0OyIpDQoNCiAgcmV0dXJuKGxpc3QocGxvdCA9IHVwZGF0ZWRfcGxvdCwgdGFibGUgPSB0YWJsZV9odG1sLCB0YWJsZV9kYXRhID0gdGFibGVfZGF0YSkpDQp9DQoNCiMgUmV0cmlldmUgZXhpc3RpbmcgcGxvdHMgYW5kIHRpdGxlcw0KZXhpc3RpbmdfcGxvdHMgPC0gcGxvdHNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZQ0KcGxvdF90aXRsZXMgPC0gbmFtZXMoZXhpc3RpbmdfcGxvdHMpDQoNCiMgTWFwIHBsb3QgdGl0bGVzIHRvIHN0YW5kYXJkcyB0YWJsZSBuYW1lcw0KcGxvdF90b19zdGFuZGFyZHNfdGFibGUgPC0gbGlzdCgNCiAgIk1hbGUgQmVuY2ggUHJlc3MgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiID0gIm1hbGVfYmVuY2hfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiLA0KICAiTWFsZSBEZWFkbGlmdCBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSIgPSAibWFsZV9kZWFkbGlmdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSIsDQogICJNYWxlIFByZXNzIFN0ZCAxUk0gQnkgQm9keXdlaWdodCBNYXJrIFJpcHBldG9lIiA9ICJtYWxlX3ByZXNzX3N0ZF8xcm1fYnlfYm9keXdlaWdodF9tYXJrX3JpcHBldG9lIiwNCiAgIk1hbGUgU3F1YXQgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiID0gIm1hbGVfc3F1YXRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiDQopDQoNCiMgSXRlcmF0ZSB0aHJvdWdoIGVhY2ggc3RhbmRhcmQgYW5kIGFkZCBkYXRhIHBvaW50cyB0byB0aGUgZXhpc3RpbmcgcGxvdHMNCmZvciAocGxvdF90aXRsZSBpbiBwbG90X3RpdGxlcykgew0KICAjIEZpbHRlciBwZXJmb3JtYW5jZSBkYXRhIGZvciB0aGUgY3VycmVudCBzdGFuZGFyZA0KICBwZXJmb3JtYW5jZV9kYXRhIDwtIGZpbHRlcihwZXJmb3JtYW5jZV9vbl9tYXJrX3JpcHBldG9lX3N0YW5kYXJkcywgYFN0cmVuZ3RoIFN0YW5kYXJkYCA9PSBwbG90X3RpdGxlKQ0KICANCiAgIyBHZXQgdGhlIGV4aXN0aW5nIHBsb3QNCiAgZXhpc3RpbmdfcGxvdCA8LSBleGlzdGluZ19wbG90c1tbcGxvdF90aXRsZV1dDQogIA0KICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyBzdGFuZGFyZHMgdGFibGUgbmFtZQ0KICBzdGFuZGFyZHNfdGFibGUgPC0gcGxvdF90b19zdGFuZGFyZHNfdGFibGVbW3Bsb3RfdGl0bGVdXQ0KICANCiAgIyBBZGQgYm9keXdlaWdodCBhbmQgMVJNIGRhdGEgcG9pbnRzIHRvIHRoZSBleGlzdGluZyBwbG90DQogIHJlc3VsdCA8LSBhZGRfYm9keXdlaWdodF9hbmRfMXJtX3RvX3Bsb3QoZXhpc3RpbmdfcGxvdCwgcGVyZm9ybWFuY2VfZGF0YSwgdGFibGVfYXZnX2JvZHl3ZWlnaHRzX2xhc3RfMndrLCBzdGFuZGFyZHNfdGFibGUpDQogIA0KICBjbGVhbl90aXRsZSA8LSAoc3ViKCIgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiLCAiIFN0YW5kYXJkcywgQXZnIDFSTSBMMlcgJiAxUk0gQVRIIiwgcGxvdF90aXRsZSkpDQogIGNhdChwYXN0ZTAoIlxuXG48aDQ+IiwgY2xlYW5fdGl0bGUsICI8L2g0PlxuXG4iKSkNCg0KICAjIFByaW50IHRoZSB1cGRhdGVkIHBsb3QNCiAgcHJpbnQocmVzdWx0JHBsb3QpDQogIA0KICAjIFByaW50IHRoZSB0YWJsZQ0KICBwcmludChyZXN1bHQkdGFibGUpDQogIA0KICAjIFNhdmUgdGhlIHBsb3QNCiAgIyBwbG90X2ZpbGVuYW1lIDwtIHBhc3RlMCgicGxvdHMvYXZnXzFybV9sMndfYW5kX2F0aF8xcm1fb25fXyIsIHRvbG93ZXIoZ3N1YigiICIsICJfIiwgcGxvdF90aXRsZSkpLCAiXyIsIFN5cy5EYXRlKCksICIucG5nIikNCiAgIyBnZ3NhdmUocGxvdF9maWxlbmFtZSwgcGxvdCA9IHJlc3VsdCRwbG90LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3KQ0KICANCiAgIyBTYXZlIHRoZSB0YWJsZSBkYXRhIHRvIENTVg0KICAjIHRhYmxlX2ZpbGVuYW1lIDwtIHBhc3RlMCgidGFibGVzL2F2Z18xcm1fbDJ3X2FuZF9hdGhfMXJtX29uXyIsIHRvbG93ZXIoZ3N1YigiICIsICJfIiwgcGxvdF90aXRsZSkpLCAiXyIsIFN5cy5EYXRlKCksICIuY3N2IikNCiAgIyB3cml0ZS5jc3YocmVzdWx0JHRhYmxlX2RhdGEsIGZpbGUgPSB0YWJsZV9maWxlbmFtZSwgcm93Lm5hbWVzID0gRkFMU0UpDQp9DQoNCmBgYA0KDQojIFNUUkVOR1RIIFNUQU5EQVJEUw0KDQpTdHJlbmd0aCBTdGFuZGFyZHMgcHJvdmlkZSB2YWx1YWJsZSBiZW5jaG1hcmtzIGZvciBhc3Nlc3NpbmcgYW4gaW5kaXZpZHVhbCdzIHBlcmZvcm1hbmNlIGluIGtleSBzdHJlbmd0aCBleGVyY2lzZXMgdGhhdCBhcmUgd2lkZWx5IHByYWN0aWNlZCBpbiBmaXRuZXNzIGFuZCBzdHJlbmd0aCB0cmFpbmluZy4gVGhlc2Ugc3RhbmRhcmRzIGNhdGVnb3JpemUgcGVyZm9ybWFuY2UgbGV2ZWxzIGJhc2VkIG9uIGVpdGhlciBhbW91bnQgb2Ygd2VpZ2h0IGV4ZWN1dGVkIHJlbGF0aXZlIHRvIGJvZHl3ZWlnaHQsIG9yIHJlcGV0aXRpb25zIGV4ZWN1dGVkLCBhbmQgYXJlIHNlZ21lbnRlZCBieSBnZW5kZXIgYW5kIGV4cGVyaWVuY2UgbGV2ZWxzLiBCeSBjb21wYXJpbmcgYW4gaW5kaXZpZHVhbCdzIHBlcmZvcm1hbmNlIGFnYWluc3QgdGhlc2UgZXN0YWJsaXNoZWQgc3RhbmRhcmRzLCB0cmFpbmVycyBhbmQgYXRobGV0ZXMgY2FuIGlkZW50aWZ5IHN0cmVuZ3RocyBhbmQgd2Vha25lc3NlcyBpbiB0aGVpciB0cmFpbmluZyByZWdpbWVucywgc2V0IHJlYWxpc3RpYyBnb2FscywgYW5kIG1lYXN1cmUgcHJvZ3Jlc3MgaW4gYSBzdHJ1Y3R1cmVkIG1hbm5lci4NCg0KIyMgU3RyZW5ndGggU3RhbmRhcmRzIE92ZXJ2aWV3IA0KDQpTZXZlcmFsIHN0cmVuZ3RoIHN0YW5kYXJkcyBhcmUgcmVhZGlseSBhdmFpbGFibGUgb25saW5lOg0KDQotIEV4UnggU3RyZW5ndGggU3RhbmRhcmRzOiA8aHR0cHM6Ly9leHJ4Lm5ldC9UZXN0aW5nL1dlaWdodExpZnRpbmcvU3RyZW5ndGhTdGFuZGFyZHM+DQotIFN0cmVuZ3RoTGV2ZWwuY29tIFN0cmVuZ3RoIFN0YW5kYXJkczogPGh0dHBzOi8vc3RyZW5ndGhsZXZlbC5jb20vc3RyZW5ndGgtc3RhbmRhcmRzPg0KLSBTeW1tZXRyaWMgU3RyZW5ndGg6IDxodHRwczovL3N5bW1ldHJpY3N0cmVuZ3RoLmNvbS8+DQotIE1hcmsgUmlwcGV0b2UncyBTdHJlbmd0aCBTdGFuZGFyZHM6IDxodHRwczovL3N0YXJ0aW5nc3RyZW5ndGguY29tL2ZpbGVzL3N0YW5kYXJkcy5wZGY+DQoNCkZpbmRpbmcgYWNjdXJhdGUgc3RyZW5ndGggc3RhbmRhcmRzIGRlcGVuZHMgb24gdGhlIGRlbW9ncmFwaGljLCBleGVyY2lzZSB0eXBlLCBhbmQgcmVxdWlyZWQgYWNjdXJhY3kuIEVhY2ggaGFzIGl0cyBwcm9zIGFuZCBjb25zOiBzb21lIGNhdGVyIHRvIHNwZWNpZmljIGRlbW9ncmFwaGljcywgb3RoZXJzIGZvY3VzIG9uIGNlcnRhaW4gZXhlcmNpc2VzLCBhbmQgdGhlaXIgY3JlZGliaWxpdHkgYWZmZWN0cyByZWxpYWJpbGl0eS4gVXNhYmlsaXR5IGFuZCBjb21wcmVoZW5zaXZlIGRhdGEgZm9yIGJlbmNobWFya2luZyBhcmUgY3J1Y2lhbCwgYXMgYXJlIHJlZ3VsYXIgdXBkYXRlcyB0byByZWZsZWN0IGN1cnJlbnQgdHJlbmRzLiBDb25zaWRlcmluZyB0aGVzZSBmYWN0b3JzIGhlbHBzIHRyYWluZXJzIGFuZCBhdGhsZXRlcyBjaG9vc2UgdGhlIGJlc3Qgc3RhbmRhcmRzIGZvciBhc3Nlc3NpbmcgYW5kIGltcHJvdmluZyBwZXJmb3JtYW5jZS4NCg0KIyMgU3RhbmRhcmRzIENhdGVnb3JpZXMgIA0KVGhlIHN0YW5kYXJkcyBjb21waWxlZCBhcmUgc2VwYXJhdGVkIGludG8gY2F0ZWdvcmllcywgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgbWFraW5nIGl0IGVhc3kgdG8gZGV0ZXJtaW5lIHdoaWNoIGV4ZXJjaXNlIHRvIHVzZSBhcyBhIGJlbmNobWFyay4NCg0KYGBge3Igc3RyZW5ndGhfc3RhbmRhcmRzX3NoZWV0X25hbWVzLCBldmFsPVRSVUUsIHJlc3VsdHM9J21hcmt1cCd9DQoNCiMgUHJpbnQgdGhlIGRhdGEgZnJhbWUgdXNpbmcga25pdHI6OmthYmxlDQprbml0cjo6a2FibGUobmFtZXNfc3Vic2V0X3N0cmVuZ3RoX3N0YW5kYXJkc19nc3ViX2RmLCBmb3JtYXQgPSAibWFya2Rvd24iLCBjb2wubmFtZXMgPSBjKCJDYXRlZ29yaWVzIiwgIkNhdGVnb3JpZXMiKSkgJT4lDQogIGNvbHVtbl9zcGVjKDE6Miwgd2lkdGggPSBjb2xfd2lkdGgsIGV4dHJhX2NzcyA9ICJ0ZXh0LWFsaWduOiBsZWZ0OyIpDQoNCmBgYA0KDQojIE1BUksgUklQUEVUT0UnUyBTVEFOREFSRFMNCg0KTWFyayBSaXBwZXRvZSdzIFN0cmVuZ3RoIFN0YW5kYXJkOiAxIFJlcCBNYXggQnkgQm9keXdlaWdodC4gIA0KDQpIZXJlIHdlIHByZXNlbnQgTWFyayBSaXBwZXRvZSdzIFN0cmVuZ3RoIFN0YW5kYXJkc1teNF0gdG8gYmVuY2htYXJrIGluZGl2aWR1YWwgcGVyZm9ybWFuY2UgYWdhaW5zdCBlc3RhYmxpc2hlZCBjcml0ZXJpYSBmb3IgcHJpbWFyeSBzdHJlbmd0aCBleGVyY2lzZXMuIFRoZXNlIHN0YW5kYXJkcyBhcmUgaW5zdHJ1bWVudGFsIGluIGV2YWx1YXRpbmcgYW4gaW5kaXZpZHVhbCdzIGxpZnRpbmcgY2FwYWJpbGl0aWVzIGluIHJlbGF0aW9uIHRvIHRoZWlyIGJvZHl3ZWlnaHQgYW5kIHRyYWluaW5nIGV4cGVyaWVuY2UuIEJ5IGRvaW5nIHNvLCB3ZSBjYW4gZWZmZWN0aXZlbHkgZ2F1Z2UgcHJvZ3Jlc3MsIHBpbnBvaW50IGFyZWFzIHRoYXQgbmVlZCBpbXByb3ZlbWVudCwgYW5kIHRhaWxvciB0cmFpbmluZyBwcm9ncmFtcyB0byBiZXR0ZXIgbWVldCB0aGUgc3BlY2lmaWMgc3RyZW5ndGggZ29hbHMgb2YgZWFjaCBpbmRpdmlkdWFsLg0KDQpUaGUgZXhlcmNpc2VzIHVzZSB0aGUgdGVjaG5pcXVlIGRlc2NyaWJlZCBpbiAiU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcsIDNyZCBlZC4iIFRoZSBCbHVlYm9vayBtYXkgYmUgcHVyY2hhc2VkIHRocm91Z2ggVGhlIEFhc2dhYXJkIENvbXBhbnkgb25saW5lIHN0b3JlW141XSBhbmQgb24gQW1hem9uIGluIHZhcmlvdXMgbWVkaXVtcyAocGFwZXJiYWNrLCBLaW5kbGUsIGF1ZGlvKS4gQWxsIGxpZnRzIGFyZSBwZXJmb3JtZWQgd2l0aCB0aGUgYmFyYmVsbCwgYXMgaW5kaWNhdGVkIGJ5IHRoZSBib29rIHRpdGxlLg0KDQpUbyBwcm9wZXJseSB1dGlsaXplIHRoZXNlIHN0YW5kYXJkcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gcmV2aWV3ICJTdGFydGluZyBTdHJlbmd0aDogQmFzaWMgQmFyYmVsbCBUcmFpbmluZyJbXjZdIGFuZCAiUHJhY3RpY2FsIFByb2dyYW1taW5nIGZvciBTdHJlbmd0aCBUcmFpbmluZy4iW142XSBUaGUgbW9zdCByZWNlbnQgYW5kIHJlbGV2YW50IDNyZCBlZGl0aW9ucyAoMjAxMikgYXJlIGF2YWlsYWJsZSBvbiB0aGVpciB3ZWJzaXRlLCBhcyB3ZWxsIGFzIGluIGRpZmZlcmVudCBtZWRpdW1zIG9uIEFtYXpvbi4gWW91IGNhbiBkb3dubG9hZCBvbmxpbmUgYm9vayBzYW1wbGVzIHRvIGRldGVybWluZSBpZiBTdGFydGluZyBTdHJlbmd0aCBzdWl0cyB5b3VyIG5lZWRzLg0KDQpgYGB7ciBtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0LCBldmFsPVRSVUUsIHJlc3VsdHM9J21hcmt1cCd9DQoNCiMgQ29kZSBleHRyYWN0cyBhbmQgcmVmaW5lcyBhIHN1YnNldCBvZiBkYXRhIHJlbGF0ZWQgdG8gIk1hcmsgUmlwcGV0b2UiIHN0YW5kYXJkcyBmcm9tIGEgYnJvYWRlciBkYXRhc2V0LCBtYWtpbmcgaXQgbW9yZSBhY2Nlc3NpYmxlIGFuZCBlYXNpZXIgdG8gd29yayB3aXRoIGJ5IGNsZWFuaW5nIHVwIHRoZSBjYXRlZ29yeSBuYW1lcyBmb3IgZnVydGhlciBhbmFseXNpcyBvciByZXBvcnRpbmcNCg0KIyBzdWJzZXQoKSBmaWx0ZXJzIHJvd3MgZnJvbSB0aGUgbmFtZWRfcmFuZ2VzIGRhdGFmcmFtZS4NCiMgZ3JlcGwoKSBjaGVja3MgZWFjaCBlbnRyeSBpbiB0aGUgIlN0cmVuZ3RoIFN0YW5kYXJkIiBjb2x1bW4gZm9yIHRoZSBzdWJzdHJpbmcgDQptYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0IDwtIHN1YnNldChuYW1lZF9yYW5nZXMsIGdyZXBsKCJNYXJrX1JpcHBldG9lIiwgYFN0cmVuZ3RoIFN0YW5kYXJkYCkpDQoNCiMgUGlwZSBPcGVyYXRvciAoJT4lKSBpcyB1c2VkIHRvIHBhc3MgdGhlIHJlc3VsdCBvZiBvbmUgZnVuY3Rpb24gdG8gdGhlIG5leHQuIEl0IGhlbHBzIGluIHdyaXRpbmcgY2xlYW5lciBhbmQgbW9yZSByZWFkYWJsZSBjb2RlLCBlc3BlY2lhbGx5IHdoZW4gcGVyZm9ybWluZyBtdWx0aXBsZSBvcGVyYXRpb25zIG9uIGEgZGF0YXNldC4NCiMgZ3N1YigiXyIsICIgIiwgQ2F0ZWdvcnkgU2hlZXQpIHJlcGxhY2VzIHVuZGVyc2NvcmVzIChfKSB3aXRoIHNwYWNlcyBpbiB0aGUgQ2F0ZWdvcnkgU2hlZXQgY29sdW1uLg0KIyBOZXcgY29sdW1uIGlzIGNyZWF0ZWQuIA0KbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCA8LSBtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0ICU+JQ0KICBtdXRhdGUoYENhdGVnb3J5IE5hbWVgID0gZ3N1YigiXyIsICIgIiwgYENhdGVnb3J5IFNoZWV0YCkpDQoNCiMgRGlzcGxheSB0aGUgbW9kaWZpZWQgJ1N0cmVuZ3RoIFN0YW5kYXJkJyBjb2x1bW4gd2l0aCBzcGFjZXMgaW5zdGVhZCBvZiB1bmRlcnNjb3Jlcw0KZGlzcGxheV9tYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0IDwtIG1hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QgJT4lDQogIG11dGF0ZShgU3RyZW5ndGggU3RhbmRhcmRgID0gZ3N1YigiXyIsICIgIiwgYFN0cmVuZ3RoIFN0YW5kYXJkYCkpICU+JQ0KICBzZWxlY3QoLWBDYXRlZ29yeSBTaGVldGApICAjIFRoaXMgZXhjbHVkZXMgdGhlICdDYXRlZ29yeSBTaGVldCcgY29sdW1uDQoNCiMgVGhlIFZpZXcgZnVuY3Rpb24gaXMgdXNlZCB0byBvcGVuIHRoZSByYXdfZGF0YSBkYXRhZnJhbWUgaW4gdGhlIFJTdHVkaW8gZGF0YSB2aWV3ZXIgZm9yIGludGVyYWN0aXZlIGV4cGxvcmF0aW9uLg0KVmlldyhtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0KSAjUnVuIHRoaXMgbGluZSBvZiBjb2RlIHRvIHZpZXcgdGFibGUuIA0KDQojIFByaW50IGZvciByZWZlcmVuY2UuIA0KIyBwcmludChtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0KQ0KIyBwcmludChkaXNwbGF5X21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QpDQoNCiMgRGVmaW5lIHRoZSByYXRpb3MgYW5kIHRvdGFsIHdpZHRoIGZvciBjb2x1bW4gd2lkdGhzDQp0b3RhbF93aWR0aCA8LSAxMDANCnJhdGlvX3N0cmVuZ3RoX3N0YW5kYXJkcyA8LSAyDQpyYXRpb19jYXRlZ29yeSA8LSAxLjI1DQp0b3RhbF9yYXRpbyA8LSByYXRpb19zdHJlbmd0aF9zdGFuZGFyZHMgKyByYXRpb19jYXRlZ29yeQ0KDQojIENhbGN1bGF0ZSB0aGUgY29sdW1uIHdpZHRocw0Kd2lkdGhfc3RyZW5ndGhfc3RhbmRhcmRzIDwtIChyYXRpb19zdHJlbmd0aF9zdGFuZGFyZHMgLyB0b3RhbF9yYXRpbykgKiB0b3RhbF93aWR0aA0Kd2lkdGhfY2F0ZWdvcnkgPC0gKHJhdGlvX2NhdGVnb3J5IC8gdG90YWxfcmF0aW8pICogdG90YWxfd2lkdGgNCg0KIyBQcmludCB0aGUgZGF0YWZyYW1lIHVzaW5nIGthYmxlIGZvciBhIG5pY2VseSBmb3JtYXR0ZWQgbWFya2Rvd24gdGFibGUuDQprYWJsZShkaXNwbGF5X21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QsIGZvcm1hdCA9ICJodG1sIiwgY29sLm5hbWVzID0gYygiU3RyZW5ndGggU3RhbmRhcmQiLCAiQ2F0ZWdvcnkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IHBhc3RlMCh3aWR0aF9zdHJlbmd0aF9zdGFuZGFyZHMsICIlIikpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IHBhc3RlMCh3aWR0aF9jYXRlZ29yeSwgIiUiKSkNCg0KDQpgYGANCg0KVGhlcmUgYXJlIGZpdmUgU3RhcnRpbmcgU3RyZW5ndGggU3RhbmRhcmRzLCB3aXRoIHRoZSBQb3dlciBDbGVhbiBleGNsdWRlZCBpbiB0aGlzIHJlcG9ydC4gRWFjaCBvZiB0aGUgZm91ciByZW1haW5pbmcgU3RhbmRhcmRzIGlzIHByZXNlbnRlZCBiZWxvdywgZm9sbG93ZWQgYnkgYSBwbG90IHRvIHZpc3VhbGl6ZSBwZXJmb3JtYW5jZXMgZm9yIGNvbXBhcmlzb24gYW5kIG1vdGl2YXRpb24uDQoNCmBgYHtyIG1hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX3RhYmxlc19hbmRfcGxvdHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIEtlZXAgZmlnLndpZHRoPTEwIGZvciBQREYgZGlzcGxheSAodmlhIGJyb3dzZXIgPiBTYXZlIEFzIFBERikuIFdoaWxlIGZpZy53aWR0aD05IChpbnN0ZWFkIG9mIDEwKSBmaXRzIHdpZHRoIG9mIG91dHB1dCwgc2F2aW5nIGFzIFBERiB3aXRoIGZpZy53aWR0aD05IHdpbGwgcmVzdWx0IGluIHNtYWxsIGZpZ3VyZTsgd2lkdGg9MTAgd2lsbCBmaWxsIHRoZSBQREYgcGFnZS4NCg0KIyBMb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcyBpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKSAjIEVuc3VyZSBrYWJsZUV4dHJhIGlzIGxvYWRlZCBmb3Igc3R5bGluZw0KDQojIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGdncGxvdCBmb3IgZWFjaCBkYXRhIGZyYW1lDQpnZW5lcmF0ZV9nZ3Bsb3QgPC0gZnVuY3Rpb24oZGF0YSwgY2F0ZWdvcnlfbmFtZSwgbWFya19yaXBwZXRvZV9zdHJlbmd0aF9zdGFuZGFyZCkgew0KICBkYXRhX251bWJlciA8LSBkYXRhICU+JQ0KICAgIG11dGF0ZShCb2R5d2VpZ2h0ID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOV0iLCAiIiwgQm9keXdlaWdodCkpKQ0KDQogICMgUmVuYW1lIGNvbHVtbnMgdG8gcmVtb3ZlIGRvdWJsZSBwZXJpb2RzDQogIGNvbG5hbWVzKGRhdGFfbnVtYmVyKSA8LSBnc3ViKCJcXC5cXC4iLCAiLiAiLCBjb2xuYW1lcyhkYXRhX251bWJlcikpDQoNCiAgIyBQcmludCBjb2x1bW4gbmFtZXMgZm9yIGRlYnVnZ2luZw0KICAjIHByaW50KGNvbG5hbWVzKGRhdGFfbnVtYmVyKSkNCiAgICANCiAgZ2dwbG90KGRhdGFfbnVtYmVyLCBhZXMoeCA9IEJvZHl3ZWlnaHQpKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJYCwgeW1heCA9IGBDYXQuIElJYCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJSWAsIHltYXggPSBgQ2F0LiBJSUlgKSwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJSUlgLCB5bWF4ID0gYENhdC4gSVZgKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMikgKw0KICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gYENhdC4gSVZgLCB5bWF4ID0gYENhdC4gVmApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBWYCwgeW1heCA9IEluZiksIGZpbGwgPSAicHVycGxlIiwgYWxwaGEgPSAwLjIpICsNCiAgICANCiAgICAjIEZpbGwgdGhlIHJlbWFpbmluZyBub24tY29sb3JlZCBwYXJ0DQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSAtSW5mLCB5bWF4ID0gYENhdC4gSWApLCBmaWxsID0gImdyYXkiLCBhbHBoYSA9IDAuMikgKw0KICAgIA0KICAgICMgQ3JlYXRlIGxpbmVzDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSWApLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgQ2F0LiBJSWApLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSUlJYCksIGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSVZgKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgQ2F0LiBWYCksIGNvbG9yID0gInB1cnBsZSIsIHNpemUgPSAxKSArDQogICAgDQogICAgIyBTZXQgbGFiZWxzDQogICAgbGFicygNCiAgICAgIHggPSAiQm9keXdlaWdodCAobGIpIiwNCiAgICAgIHkgPSAiMVJNIFdlaWdodCBMb2FkIEV4ZWN1dGlvbiIsDQogICAgICB0aXRsZSA9IHBhc3RlKCJNYWxlIiwgY2F0ZWdvcnlfbmFtZSwgIlN0YW5kYXJkcyIpLA0KICAgICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBTdHJlbmd0aCBTdGFuZGFyZHMgQWNyb3NzIEV4cGVyaWVuY2UgTGV2ZWxzIiwNCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlOiIsIG1hcmtfcmlwcGV0b2Vfc3RyZW5ndGhfc3RhbmRhcmQpICMgQ2hhbmdlIFNvdXJjZSBpbmZvIFBSTg0KICAgICkgKw0KICAgIA0KICAgICMgQWRkIG1vcmUgbWFya2VycyBvbiB0aGUgeS1heGlzIGF0IGluY3JlbWVudHMgb2YgMjANCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDk5OSwgYnkgPSAyMCkpICsNCiAgICAjIEFkZCBtb3JlIG1hcmtlcnMgb24gdGhlIHgtYXhpcyBhdCBpbmNyZW1lbnRzIG9mIDEwDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA5OTksIGJ5ID0gMTApKSArDQogICAgDQogICAgIyBBZGQgdGV4dCBsYWJlbHMgZm9yIHNraWxsIGxldmVscyB3aXRoIG1hdGNoaW5nIGNvbG9ycw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1pbihgQ2F0LiBJYCksIGxhYmVsID0gIiIpLCBjb2xvciA9ICJkaW1ncmF5Iiwgdmp1c3QgPSAtMSkgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1heChgQ2F0LiBJYCksIGxhYmVsID0gIkNhdC4gSSIpLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHZqdXN0ID0gLTEpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSBtYXgoQm9keXdlaWdodCksIHkgPSBtYXgoYENhdC4gSUlgKSwgbGFiZWwgPSAiQ2F0LiBJSSIpLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCB2anVzdCA9IC0xKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gbWF4KEJvZHl3ZWlnaHQpLCB5ID0gbWF4KGBDYXQuIElJSWApLCBsYWJlbCA9ICJDYXQuIElJSSIpLCBjb2xvciA9ICJkYXJrb3JhbmdlIiwgdmp1c3QgPSAtMSkgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1heChgQ2F0LiBJVmApLCBsYWJlbCA9ICJDYXQuIElWIiksIGNvbG9yID0gImRhcmtyZWQiLCB2anVzdCA9IC0xKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gbWF4KEJvZHl3ZWlnaHQpLCB5ID0gbWF4KGBDYXQuIFZgKSwgbGFiZWwgPSAiQ2F0LiBWIiksIGNvbG9yID0gInB1cnBsZSIsIHZqdXN0ID0gLTEpICsNCiAgICANCiAgICAjIEN1c3RvbWl6ZSB0aGVtZQ0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLA0KICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDEyKSwNCiAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImNtIikNCiAgICApDQp9DQoNCiMgTGlzdHMgdG8gc3RvcmUgdGhlIHBsb3RzIGFuZCB0YWJsZXMNCnBsb3RzX2xpc3Rfc3RyZW5ndGhfc3RhbmRhcmRzX21hcmtfcmlwcGV0b2UgPC0gbGlzdCgpDQp0YWJsZXNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZSA8LSBsaXN0KCkNCg0KIyBDaGVjayBhbmQgY3JlYXRlIHRoZSAncGxvdHMnIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0DQppZiAoIWRpci5leGlzdHMoInBsb3RzIikpIHsNCiAgZGlyLmNyZWF0ZSgicGxvdHMiKQ0KfQ0KDQojIENoZWNrIGFuZCBjcmVhdGUgdGhlICd0YWJsZXMnIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0DQppZiAoIWRpci5leGlzdHMoInRhYmxlcyIpKSB7DQogIGRpci5jcmVhdGUoInRhYmxlcyIpDQp9DQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggbmFtZWQgcmFuZ2UgZnJvbSB0aGUgZmlsdGVyZWQgbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCBkYXRhZnJhbWUNCmZvciAoaSBpbiAxOm5yb3cobWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCkpIHsNCiAgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UgPC0gbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCRgU3RyZW5ndGggU3RhbmRhcmRgW2ldDQogIGNhdGVnb3J5X25hbWUgPC0gbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCRgQ2F0ZWdvcnkgTmFtZWBbaV0NCiAgDQogICMgTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBuYW1lZCByYW5nZQ0KICBkYXRhX2ZyYW1lIDwtIHJlYWRXb3JrYm9vayhzdHJlbmd0aF9zdGFuZGFyZHMsIG5hbWVkUmVnaW9uID0gc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIA0KICAjIENoZWNrIGlmIHRoZSAnQm9keXdlaWdodCcgY29sdW1uIGV4aXN0cyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBpZiAoISJCb2R5d2VpZ2h0IiAlaW4lIGNvbG5hbWVzKGRhdGFfZnJhbWUpKSB7DQogICAgY2F0KHBhc3RlKCJTa2lwcGluZyIsIHN0cmVuZ3RoX3N0YW5kYXJkX25hbWVkX3JhbmdlLCAiLSAnQm9keXdlaWdodCcgY29sdW1uIG1pc3NpbmcuXG4iKSkNCiAgICBuZXh0DQogIH0NCg0KICAjIEVuc3VyZSBjb2x1bW4gbmFtZXMgYXJlIHRyaW1tZWQgb2Ygd2hpdGVzcGFjZQ0KICBjb2xuYW1lcyhkYXRhX2ZyYW1lKSA8LSB0cmltd3MoY29sbmFtZXMoZGF0YV9mcmFtZSkpDQoNCiAgIyBSZW5hbWUgY29sdW1ucyB0byByZW1vdmUgZG91YmxlIHBlcmlvZHMgZm9yIGJvdGggdGFibGUgYW5kIHBsb3QNCiAgY29sbmFtZXMoZGF0YV9mcmFtZSkgPC0gZ3N1YigiXFwuXFwuIiwgIi4gIiwgY29sbmFtZXMoZGF0YV9mcmFtZSkpDQoNCiAgIyBGb3JtYXQgdGhlIHRpdGxlIG9mIHRoZSBwbG90IGFuZCBoZWFkIG9mIHRoZSB0YWJsZSB1c2luZyB0aGUgY2xlYW5lZCBjYXRlZ29yeSBuYW1lDQogIGZvcm1hdHRlZF9oZWFkZXIgPC0gZ3N1YigiXyIsICIgIiwgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIGZvcm1hdHRlZF9oZWFkZXIgPC0gKHN1YigiIFN0ZCAxUk0gQnkgQm9keXdlaWdodCBNYXJrIFJpcHBldG9lIiwgIiBTdGFuZGFyZHMiLCBmb3JtYXR0ZWRfaGVhZGVyKSkNCiAgDQogICMgR2VuZXJhdGUgdGhlIHBsb3QNCiAgcGxvdCA8LSBnZW5lcmF0ZV9nZ3Bsb3QoZGF0YV9mcmFtZSwgY2F0ZWdvcnlfbmFtZSwgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIA0KICAjIFByaW50IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCByYW5nZSBhcyBhIG1hcmtkb3duIGhlYWRlcg0KICBjYXQocGFzdGUwKCJcblxuPGgzPiAiLCBmb3JtYXR0ZWRfaGVhZGVyLCAiPC9oMz5cbiIpKQ0KICANCiAgIyBSZW5hbWUgJ0JvZHl3ZWlnaHQnIGNvbHVtbiB0byAnQm9keXdlaWdodCAobGIpJw0KICBuYW1lcyhkYXRhX2ZyYW1lKVtuYW1lcyhkYXRhX2ZyYW1lKSA9PSAiQm9keXdlaWdodCJdIDwtICJCb2R5d2VpZ2h0IChsYikiDQoNCiAgIyBQcmludCB0aGUgcGxvdA0KICBwcmludChwbG90KQ0KDQogICMgU2F2ZSB0aGUgcGxvdCB0byB0aGUgbGlzdA0KICBwbG90c19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1tmb3JtYXR0ZWRfaGVhZGVyXV0gPC0gcGxvdA0KDQogICMgT3V0cHV0IHRoZSBkYXRhIGZyYW1lIGFzIGEgbWFya2Rvd24gdGFibGUgd2l0aCBldmVuIGNvbHVtbiB3aWR0aHMNCiAgcHJpbnQoDQogICAgdGFibGVfaHRtbCA8LSBrYWJsZShkYXRhX2ZyYW1lLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSAlPiUNCiAgICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgICAgY29sdW1uX3NwZWMoMTpuY29sKGRhdGFfZnJhbWUpLCB3aWR0aCA9IHBhc3RlMCgxMDAgLyBuY29sKGRhdGFfZnJhbWUpLCAiJSIpKQ0KICApDQogIA0KICAjIFNhdmUgdGhlIHRhYmxlIHRvIHRoZSBsaXN0DQogIHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1tmb3JtYXR0ZWRfaGVhZGVyXV0gPC0gdGFibGVfaHRtbA0KDQogICMgT3B0aW9uYWxseSBzYXZlIHRoZSBwbG90IGFuZCB0YWJsZQ0KICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoInBsb3RzLyIsIHRvbG93ZXIoc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpLCAiLnBuZyIpLCBwbG90ID0gcGxvdCwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOCkNCg0KICAjIFNhdmUgdGhlIGRhdGEgZnJhbWUgYXMgYSBDU1YgZmlsZQ0KICB3cml0ZS5jc3YoZGF0YV9mcmFtZSwgZmlsZSA9IHBhc3RlMCgidGFibGVzLyIsIHRvbG93ZXIoc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpLCAiLmNzdiIpLCByb3cubmFtZXMgPSBGQUxTRSkNCn0NCg0KIyBFeGFtcGxlIG9mIGhvdyB0byByZWNhbGwgYW5kIHByaW50IGEgc3BlY2lmaWMgcGxvdCBhbmQgdGFibGUgZnJvbSB0aGUgbGlzdHMNCiMgcHJpbnQocGxvdHNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZVtbIk1hbGUgQmVuY2ggUHJlc3MgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiXV0pDQojIHByaW50KHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lKQ0KIyBwcmludCh0YWJsZXNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZVsiTWFsZSBCZW5jaCBQcmVzcyBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSJdKQ0KIyBjYXQoYXMuY2hhcmFjdGVyKHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1siTWFsZSBCZW5jaCBQcmVzcyBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSJdXSkpDQoNCmBgYA0KDQojIFJFRkVSRU5DRVMgDQoNCjwhLS0gDQpUaGVyZSBhcmUgbXVsdGlwbGUgcmVmZXJlbmNlcyBhYm92ZSBmb3IgdGhlIHNhbWUgbm90YXRpb24gYmVsb3cuIFIgaGFzIGRlZmF1bHQgc2V0dGluZ3MgdG8gYXNzaWduIG9uZSBub3RhdGlvbiBwZXIgcmVmZXJlbmNlLCB3aGlsZSBrZWVwaW5nIHRoZSBvcmRlciB5b3UgaGF2ZSBkZXNpZ25lZC4gRm9yIGV4YW1wbGUgaWYgW140XSBpcyB1c2VkIGF0IGxlYXN0IHR3aWNlLCBpdCB3aWxsIGFwcGVhciBhcyBbXjRdIGFuZCBbXjVdIGluIHRoZSBrbml0IHByb2R1Y3QuIFRoZSBmb2xsb3dpbmcgbnVtYmVycyB3aWxsIGJ1bXAgdXAuIFNhbWUgZ29lcyBmb3IgT25lIFJlcCBNYXggQ2FsY3VsYXRvciBbXjEwXSwgd2hpY2ggYXQgdGltZSBvZiByZXZpZXcgcHJpbnRzIGFzIFteMTFdIGFuZCBbXjE0XS4NCi0tPg0KDQpbXjFdOiBSaXBwZXRvZSwgTS4gKDIwMTcpLiAqU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcgKDNyZCBlZC4pLiogVGhlIEFhc2dhYXJkIENvbXBhbnkuIFJldHJpZXZlZCBmcm9tIDxodHRwczovL2Fhc2dhYXJkY28uY29tL3N0b3JlL2Jvb2tzLXBvc3RlcnMtZHZkL2Jvb2tzL3N0YXJ0aW5nLXN0cmVuZ3RoLWJhc2ljLWJhcmJlbGwtdHJhaW5pbmcvPi4NCg0KW14yXTogU3RyZW5ndGggTGV2ZWwuIChuLmQuKS4gKk9uZSBSZXAgTWF4IENhbGN1bGF0b3IuKiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly9zdHJlbmd0aGxldmVsLmNvbS9vbmUtcmVwLW1heC1jYWxjdWxhdG9yPi4NCg0KW14zXTogVGhhbSwgSy4gKDIwMjQpLiAqS2VuIERvZXMgRml0bmVzcyBGaW5hbC54bHNtLiogUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vMWRydi5tcy94L3MhQXNZWVpBOW5MOGxmOHliVE54bFctMmM2c0RYQj9lPUtMZmhUND4uDQoNClteNF06IFJpcHBldG9lLCBNLiAoMjAxMikuICpTdHJlbmd0aCBTdGFuZGFyZHMuKiBTdGFydGluZyBTdHJlbmd0aC4gUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vc3RhcnRpbmdzdHJlbmd0aC5jb20vZmlsZXMvc3RhbmRhcmRzLnBkZj4uDQoNClteNV06IFJpcHBldG9lLCBNLiAoMjAxNykuICpTdGFydGluZyBTdHJlbmd0aDogQmFzaWMgQmFyYmVsbCBUcmFpbmluZyAoM3JkIGVkLikuKiBUaGUgQWFzZ2FhcmQgQ29tcGFueS4gUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vYWFzZ2FhcmRjby5jb20vc3RvcmUvYm9va3MtcG9zdGVycy1kdmQvYm9va3Mvc3RhcnRpbmctc3RyZW5ndGgtYmFzaWMtYmFyYmVsbC10cmFpbmluZy8+Lg0KDQpbXjZdOiBSaXBwZXRvZSwgTS4gKDIwMTcpLiAqU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcsIDNyZCBFZGl0aW9uKiBieSBNYXJrIFJpcHBldG9lLiBBdmFpbGFibGUgYXQgPGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vU3RhcnRpbmctU3RyZW5ndGgtTWFyay1SaXBwZXRvZS1lYm9vay9kcC9CMDA2WEpSNVpBL3JlZj1zcl8xXzE/Y3JpZD0yMTUyMVlYQktYNEFJJmRpYj1leUoySWpvaU1TSjkuMXFUZWhfOERKaHFEbXhycmFqbWpUYkxpUXotd1BhS09pZmdpNzg3TTdXdXJOeHdVd0tWYmhRYWRKRXc4V2R1MnlnRFA4WDBEMjNZNXhHcUVaQUoyTDVsdUV3MGd2Q0lJeXVUbXVnWVpfYlJtRzM1aHFMUlBsYk95UXg0ZTVwUmYyd1ZvR25zUVB6RlFFZkVPbHJoaUhLcDhCU1dDdVFrZjJSRUxGS1NPTFFPNDlGcThZNTdQVV9NdVBtOWdlOTFVY0MzZWJtQ1o4cENXSG1xYlVVUk42dHlvY0RULUNSM1phUUFLUEpYbm1ZUHNvY0NQNGp6NFlfUVRMRTFoZWNzazhWdXVnZjNISUJqQldrT1ZNWkZtU0RsUzl1alZ4cUY0dlJxQzdHc1ZKbHcuXzlqTnBscGQ5TDZQUEZ6azdXTUMtblNEZldYUGhtY2tGaWlhTVN3YUN5bz4uDQoNClteNl06IFJpcHBldG9lLCBNLiAqUHJhY3RpY2FsIFByb2dyYW1taW5nIGZvciBTdHJlbmd0aCBUcmFpbmluZywgM3JkIEVkaXRpb24qIGJ5IE1hcmsgUmlwcGV0b2UuIEF2YWlsYWJsZSBhdCA8aHR0cHM6Ly93d3cuYW1hem9uLmNvbS9QcmFjdGljYWwtUHJvZ3JhbW1pbmctU3RyZW5ndGgtVHJhaW5pbmctUmlwcGV0b2UtZWJvb2svZHAvQjAwSVU4WUVUVy9yZWY9c3JfMV8yP2NyaWQ9MjE1MjFZWEJLWDRBSSZkaWI9ZXlKMklqb2lNU0o5LjFxVGVoXzhESmhxRG14cnJham1qVGJMaVF6LXdQYUtPaWZnaTc4N003V3VyTnh3VXdLVmJoUWFkSkV3OFdkdTJ5Z0RQOFgwRDIzWTV4R3FFWkFKMkw1bHVFdzBndkNJSXl1VG11Z1laX2JSbUczNWhxTFJQbGJPeVF4NGU1cFJmMndWb0duc1FQekZRRWZFT2xyaGlIS3A4QlNXQ3VRa2YyUkVMRktTT0xRTzQ5RnE4WTU3UFVfTXVQbTlnZTkxVWNDM2VibUNaOHBDV0htcWJVVVJONnR5b2NEVC1DUjNaYVFBS1BKWG5tWVBzb2NDUDRqejRZX1FUTEUxaGVjc2s4VnV1Z2YzSElCakJXa09WTVpGbVNEbFM5dWpWeHFGNHZScUM3R3NWSmx3Ll85ak5wbHBkOUw2UFBGems3V01DLW5TRGZXWFBobWNrRmlpYU1Td2FDeW8+Lg==