Quitting from lines 16-98 (appendix_I.Rmd)
Eliminate duplicate responses
First, we will check if the duplicated responses were consistent. If not, we will retain the response in which EDC use was marked as “Yes.” The reason is that the respondent who answered No may not be aware of EDC use in the clinical trial. If the responses are concordant, then the 2nd response will be removed. We will use the following code segment for this.
In the first segment, we make a data frame of duplicated trials with serial numbers of responses.
In the second segment, we make a data frame for the first responses and then merge it with the data frame comprising of a list of duplicated trials. For each row, we make a variable that selects the serial of response with the EDC use response = Yes if there is a discordance. The final two code chunks make a data frame with trials for which a single response has been obtained.
Statistical Analysis Plan
Participation Statistics
The following table shows the statistics related to participation in the survey. The number of investigators who were contacted is different from the number of trials as for a trial more than one investigator may have been contacted.
Table 1 : Participation StatisticsInvestigators (N) | Investigators who opened email (N) | Investigator open rate (%) | Trials (N) | Trials whose email was opened (N) | Trial open rate (%) | Participating Trials (N) | Participation rate (%) |
2,890 | 1,523 | 52.7 | 1,909 | 1,141 | 59.8 | 400 | 21 |
Included trial characteristics
First we take a look at the trial characteristics of all trials were were in the sampling frame.
Table 2 : Trial CharacteristicsCharacteristic | N = 1,9091 |
Sponsor Type |
|
Governmental | 111 (5.8%) |
Industry | 302 (16%) |
Institutional | 1,053 (55%) |
Other | 443 (23%) |
Industry Funded Trial |
|
No | 1,607 (84%) |
Yes | 302 (16%) |
Type of Trial |
|
| 38 (2.0%) |
Interventional | 1,841 (96%) |
Observational | 26 (1.4%) |
PMS | 4 (0.2%) |
Trial Phase |
|
Phase 1 - 2 | 299 (16%) |
Phase 2 - 3 | 489 (26%) |
Phase 4 | 333 (17%) |
Unknown | 788 (41%) |
Duration of Trial (Days) | 545 (365, 730) |
Unknown | 6 |
Sample Size (Total) | 84 (54, 150) |
Number of sites | 1 (1, 1) |
Multicentric Trial |
|
No | 1,554 (81%) |
Yes | 355 (19%) |
Country of Recruitment |
|
Indian | 1,736 (91%) |
Multinational | 173 (9.1%) |
condition_type |
|
Accidents and Injuries | 51 (2.7%) |
Chronic non-communicable diseases | 100 (5.2%) |
Diseases of Circulatory System | 96 (5.0%) |
Diseases of digestive system | 189 (9.9%) |
Diseases of Eye | 39 (2.0%) |
Diseases of genitourinary system | 58 (3.0%) |
Diseases of respiratory system | 55 (2.9%) |
Endocrine disease | 155 (8.1%) |
Infective Diseases | 165 (8.6%) |
Mental Behavioural Disorders and nervous system disease | 122 (6.4%) |
Neoplasms | 190 (10.0%) |
Normal healthy volunteers | 43 (2.3%) |
Others | 646 (34%) |
1n (%); Median (IQR) |
Next we compare the trial characteristics of those studies which have responded versus those which have not.
Table 3 : Trial characteristics compared between trials which participated in the survey and those that did not.Characteristic | No, N = 1,5091 | Yes, N = 4001 |
Sponsor Type |
|
|
Governmental | 86 (5.7%) | 25 (6.2%) |
Industry | 266 (18%) | 36 (9.0%) |
Institutional | 812 (54%) | 241 (60%) |
Other | 345 (23%) | 98 (24%) |
Industry Funded Trial |
|
|
No | 1,243 (82%) | 364 (91%) |
Yes | 266 (18%) | 36 (9.0%) |
Type of Trial |
|
|
| 37 (2.5%) | 1 (0.2%) |
Interventional | 1,450 (96%) | 391 (98%) |
Observational | 19 (1.3%) | 7 (1.8%) |
PMS | 3 (0.2%) | 1 (0.2%) |
Trial Phase |
|
|
Phase 1 - 2 | 228 (15%) | 71 (18%) |
Phase 2 - 3 | 382 (25%) | 107 (27%) |
Phase 4 | 268 (18%) | 65 (16%) |
Unknown | 631 (42%) | 157 (39%) |
Duration of Trial (Days) | 545 (365, 730) | 545 (365, 730) |
Unknown | 6 | 0 |
Sample Size (Total) | 83 (50, 150) | 90 (60, 160) |
Number of sites | 1 (1, 1) | 1 (1, 1) |
Multicentric Trial |
|
|
No | 1,215 (81%) | 339 (85%) |
Yes | 294 (19%) | 61 (15%) |
Country of Recruitment |
|
|
Indian | 1,364 (90%) | 372 (93%) |
Multinational | 145 (9.6%) | 28 (7.0%) |
condition_type |
|
|
Accidents and Injuries | 43 (2.8%) | 8 (2.0%) |
Chronic non-communicable diseases | 72 (4.8%) | 28 (7.0%) |
Diseases of Circulatory System | 74 (4.9%) | 22 (5.5%) |
Diseases of digestive system | 151 (10%) | 38 (9.5%) |
Diseases of Eye | 35 (2.3%) | 4 (1.0%) |
Diseases of genitourinary system | 49 (3.2%) | 9 (2.2%) |
Diseases of respiratory system | 42 (2.8%) | 13 (3.2%) |
Endocrine disease | 123 (8.2%) | 32 (8.0%) |
Infective Diseases | 145 (9.6%) | 20 (5.0%) |
Mental Behavioural Disorders and nervous system disease | 92 (6.1%) | 30 (7.5%) |
Neoplasms | 129 (8.5%) | 61 (15%) |
Normal healthy volunteers | 34 (2.3%) | 9 (2.2%) |
Others | 520 (34%) | 126 (32%) |
1n (%); Median (IQR) |
EDC Adoption Rate
EDC Adoption Rate (EAR): The primary outcome measure is EAR. This will be defined as the ratio of the number of CTRI registered trials that use an EDC with sophistication level 2 or more to that of the participating trials (unique CTRI registered trials for which investigators agreed to participate in the study. The proportion and the binomial 95% confidence intervals of the same will be reported.
The EDC sophistication level is defined as follows:
Level 1: There is a unique account and password for each user to access the online system.
Level 2: Sites enter subject visit data through a Web interface into electronic case report forms (eCRFs). The completion status of each eCRF for each subject can be tracked automatically online. The system provides an audit trail for all data entry and data modification
Level 3: Data validation happens automatically when data are entered into the eCRF. The system will automatically log the user off after a period of inactivity.
Level 4: Subjects are randomized automatically
Level 5: Subject recruitment can be tracked online for each site
Level 6: The system allows tracking of medication inventory at the sites.
For a level to be considered complete, all the questions should be marked as Yes. If one of the questions is marked as No and a higher level is marked Yes then the higher level will be taken. For each unique trial we will therefore calculate the highest EDC sophistication level. If EDC is not used then sophistication level will be marked as missing.
The following table shows the EDC adoption rate and the different levels in the trials for which responses were received in the survey.
Table 4 : EDC use and adoption rate with EDC sophistication levels among responding studiesVariable | Total | Yes | Percentage | 95% CI |
EDC ADOPTION | 400 | 110 | 27.5 | ( 23.4 - 32.1 ) |
EDC USE | 400 | 130 | 32.5 | ( 28.1 - 37.2 ) |
LEVEL 1 | 400 | 106 | 26.5 | ( 22.4 - 31 ) |
LEVEL 2 | 400 | 76 | 19.0 | ( 15.5 - 23.1 ) |
LEVEL 3 | 400 | 65 | 16.2 | ( 13 - 20.2 ) |
LEVEL 4 | 400 | 75 | 18.8 | ( 15.2 - 22.9 ) |
LEVEL 5 | 400 | 83 | 20.8 | ( 17.1 - 25 ) |
LEVEL 6 | 400 | 64 | 16.0 | ( 12.7 - 19.9 ) |
The following table shows the breakdown of key trial characteristics by EDC adoption status. Comparison between groups has been done using Chi-square test for categorical variables and Wilcox rank sum test for continuous variables.
Table 5 : Comparision of trial characteristics between trials with adopted an EDC and those that did notCharacteristic | N | Overall, N = 4001 | No, N = 2901 | 95% CI | Yes, N = 1101 | 95% CI | p-value2 |
Sponsor Type | 400 |
|
|
|
|
| <0.001 |
Governmental |
| 25 (6.2%) | 16 (5.5%) | 3.4% - 8.8% | 9 (8.2%) | 4.3% - 15% |
|
Industry |
| 36 (9.0%) | 14 (4.8%) | 2.9% - 8.0% | 22 (20%) | 14% - 29% |
|
Institutional |
| 241 (60%) | 184 (63%) | 58% - 69% | 57 (52%) | 42% - 61% |
|
Other |
| 98 (24%) | 76 (26%) | 21% - 32% | 22 (20%) | 14% - 29% |
|
Industry Funded Trial | 400 |
|
|
|
|
| <0.001 |
No |
| 364 (91%) | 276 (95%) | 92% - 97% | 88 (80%) | 71% - 86% |
|
Yes |
| 36 (9.0%) | 14 (4.8%) | 2.9% - 8.0% | 22 (20%) | 14% - 29% |
|
Type of Trial | 400 |
|
|
|
|
| 0.7 |
|
| 1 (0.2%) | 1 (0.3%) | <0.1% - 2.4% | 0 (0%) |
|
|
Interventional |
| 391 (98%) | 284 (98%) | 95% - 99% | 107 (97%) | 92% - 99% |
|
Observational |
| 7 (1.8%) | 4 (1.4%) | 0.5% - 3.6% | 3 (2.7%) | 0.9% - 8.2% |
|
PMS |
| 1 (0.2%) | 1 (0.3%) | <0.1% - 2.4% | 0 (0%) |
|
|
Trial Phase | 400 |
|
|
|
|
| 0.076 |
Phase 1 - 2 |
| 71 (18%) | 53 (18%) | 14% - 23% | 18 (16%) | 11% - 25% |
|
Phase 2 - 3 |
| 107 (27%) | 72 (25%) | 20% - 30% | 35 (32%) | 24% - 41% |
|
Phase 4 |
| 65 (16%) | 55 (19%) | 15% - 24% | 10 (9.1%) | 4.9% - 16% |
|
Unknown |
| 157 (39%) | 110 (38%) | 33% - 44% | 47 (43%) | 34% - 52% |
|
Duration of Trial (Days) | 400 | 545 (365, 730) | 545 (365, 730) | 640 - 766 | 545 (365, 865) | 637 - 916 | 0.5 |
Sample Size (Total) | 400 | 90 (60, 160) | 86 (60, 149) | 119 - 178 | 100 (52, 204) | -405 - 3,638 | 0.2 |
Number of sites | 400 | 1 (1, 1) | 1 (1, 1) | 1.1 - 1.4 | 1 (1, 3) | 2.6 - 5.7 | <0.001 |
Multicentric Trial | 400 |
|
|
|
|
| <0.001 |
No |
| 339 (85%) | 268 (92%) | 89% - 95% | 71 (65%) | 55% - 73% |
|
Yes |
| 61 (15%) | 22 (7.6%) | 5.0% - 11% | 39 (35%) | 27% - 45% |
|
Country of Recruitment | 400 |
|
|
|
|
| <0.001 |
Indian |
| 372 (93%) | 282 (97%) | 95% - 99% | 90 (82%) | 73% - 88% |
|
Multinational |
| 28 (7.0%) | 8 (2.8%) | 1.4% - 5.4% | 20 (18%) | 12% - 27% |
|
Access to Institutional CTU | 400 |
|
|
|
|
| 0.3 |
No |
| 195 (49%) | 146 (50%) | 45% - 56% | 49 (45%) | 35% - 54% |
|
Yes |
| 205 (51%) | 144 (50%) | 44% - 55% | 61 (55%) | 46% - 65% |
|
1n (%); Median (IQR) |
2Pearson's Chi-squared test; Fisher's exact test; Wilcoxon rank sum test |
Influence of trial parameters on EAR
Influence of trial parameters on EAR
To determine the influence of the trial parameters on EAR, we will use a logistic regression model where the dependent variable will be EDC adoption with EDC sophistication level 2 or more (modeled as Yes or No). Independent variables will be:
1. Trial sponsor: Industry or Investigator-Initiated. In studies where the primary sponsor is a pharmaceutical company or device manufacturer, the user will be considered industry-sponsored, and the rest will be considered investigator-initiated.
2. Trial sample size: Total trial sample size will be modeled as a continuous variable. To relax the linearity assumption, this will be expanded using a restricted cubic spline with 3 knots.
3. Trial sites: The number of sites will also be modeled as a continuous variable. Again to relax the linearity assumptions, the model term will be expanded using a restricted cubic spline with three knots.
Interactions will be testing in an omnibus model containing all interaction terms. Wald test will be used for determining the significance of any interaction. Odds ratios with 95% confidence intervals will be reported.
Wald Statistics Response: edc_adoption
Factor Chi-Square d.f. P
sample_size (Factor+Higher Order Factors) 6.30 6 0.3905
All Interactions 2.62 4 0.6233
Nonlinear (Factor+Higher Order Factors) 2.75 3 0.4315
sites (Factor+Higher Order Factors) 11.31 3 0.0101
All Interactions 1.39 2 0.4994
industry_funded (Factor+Higher Order Factors) 1.83 3 0.6095
All Interactions 0.91 2 0.6335
sample_size * sites (Factor+Higher Order Factors) 1.39 2 0.4994
Nonlinear 0.46 1 0.4958
Nonlinear Interaction : f(A,B) vs. AB 0.46 1 0.4958
sample_size * industry_funded (Factor+Higher Order Factors) 0.91 2 0.6335
Nonlinear 0.81 1 0.3674
Nonlinear Interaction : f(A,B) vs. AB 0.81 1 0.3674
TOTAL NONLINEAR 2.75 3 0.4315
TOTAL INTERACTION 2.62 4 0.6233
TOTAL NONLINEAR + INTERACTION 3.65 5 0.6008
TOTAL 24.95 8 0.0016
As the results of the above ANOVA show, the Wald test for non-linear terms as well as interactions is not significant. Hence we show the simplified model without the interaction terms as well as without the non-linear assumption. The table below shows the results of the logistic regression analysis.
Table 6 : Multivariable analysis of factors influencing EDC useCharacteristic | N | Event N | OR1 | 95% CI1 | p-value |
(Intercept) | 400 | 110 | 0.20 | 0.14, 0.27 | <0.001 |
sample_size | 400 | 110 | 1.00 | 1.00, 1.00 | 0.10 |
sites | 400 | 110 | 1.26 | 1.12, 1.47 | <0.001 |
industry_funded | 400 | 110 |
|
|
|
No |
|
| — | — |
|
Yes |
|
| 2.14 | 0.86, 5.13 | 0.090 |
1OR = Odds Ratio, CI = Confidence Interval |
EDC Sophistication Level
We will provide data on the median EDC sophistication levels as well as a plot showing the proportion of CTRI registered trials with different levels of EDC sophistication. Further visualization and analysis will also explore the association between trial sample size, number of trial sites, and type of trial sponsorship with EDC sophistication.
Table 7 : Highest level of EDC sophisticationCharacteristic | N = 4001 |
Highest EDC sophistication Level |
|
1 | 13 (11%) |
2 | 4 (3.3%) |
3 | 2 (1.6%) |
4 | 11 (8.9%) |
5 | 29 (24%) |
6 | 64 (52%) |
Unknown | 277 |
1n (%) |

In the following table we will show the univariable analysis of the factors which influenced EDC sophistication level. We will dichotomize the level into two categories (score 6 or score 1-5).
Table 8 : Univariate analysis of factors associated with EDC sophistication levelCharacteristic | Level 1 - 5, N = 591 | Level 6, N = 641 | p-value2 |
Sponsor Type |
|
| 0.12 |
Governmental | 7 (12%) | 2 (3.1%) |
|
Industry | 7 (12%) | 15 (23%) |
|
Institutional | 30 (51%) | 34 (53%) |
|
Other | 15 (25%) | 13 (20%) |
|
Industry Funded Trial |
|
| 0.094 |
No | 52 (88%) | 49 (77%) |
|
Yes | 7 (12%) | 15 (23%) |
|
Type of Trial |
|
| >0.9 |
Interventional | 58 (98%) | 62 (97%) |
|
Observational | 1 (1.7%) | 2 (3.1%) |
|
Trial Phase |
|
| 0.9 |
Phase 1 - 2 | 9 (15%) | 12 (19%) |
|
Phase 2 - 3 | 20 (34%) | 18 (28%) |
|
Phase 4 | 5 (8.5%) | 7 (11%) |
|
Unknown | 25 (42%) | 27 (42%) |
|
Duration of Trial (Days) | 730 (365, 1,095) | 411 (240, 730) | <0.001 |
Sample Size (Total) | 153 (63, 293) | 64 (40, 128) | <0.001 |
Number of sites | 1 (1, 2) | 1 (1, 2) | >0.9 |
Country of Recruitment |
|
| 0.4 |
Indian | 51 (86%) | 52 (81%) |
|
Multinational | 8 (14%) | 12 (19%) |
|
Multicentric Trial |
|
| 0.8 |
No | 39 (66%) | 44 (69%) |
|
Yes | 20 (34%) | 20 (31%) |
|
Access to Institutional CTU |
|
| 0.071 |
No | 20 (34%) | 32 (50%) |
|
Yes | 39 (66%) | 32 (50%) |
|
1n (%); Median (IQR) |
2Fisher's exact test; Pearson's Chi-squared test; Wilcoxon rank sum test |
EAR Time trends
For unique responding CTRI registered trials, we will create a subset containing trials registered on or after 1st January 2010. From this subset, we will then aggregate the EAR for each year based on the methodology for calculating EAR as above. This will be graphically demonstrated using a bar plot or a dot plot with a bar for each year. Note that as each trial is independent of each others, we will not use a line plot for the visualization. EAR will be compared between two time periods: period 1 from 1st January 2015 to 31st December 2019 and period 2 from 1st January 2010 to 31st December 2014. Given that most randomized trials will be completed by 10 years, we expect to have few open clinical trials available for analysis that was registered before 2010. However, if more than 30 trials are available, we will also analyze an earlier time point, i.e., between 1st January 2005 and 31st December 2009.
Table 9 : EAR across time periodCharacteristic | Period 1 (2015 - 2019), N = 2861 | Period 2 (2010 - 2014), N = 751 | Pre 2010, N = 21 |
edc_adoption | 79 (28%) | 19 (25%) | 1 (50%) |
1n (%) |

Additional Analyses
Additionally the survey collected data on alternative methods for data collection used in the trial as well a single item question on the key perceived barriers towards adoption of EDC in their trial.
Table 10 : Data collection methods used when EDC was not usedCharacteristic | N | N = 2701 |
Spreadsheet | 270 | 260 (96%) |
Data sent by Email | 270 | 46 (17%) |
Data sent by Fax | 270 | 9 (3.3%) |
1n (%) |
Table 11 : Reason for not using EDCReason | Total | Yes | Percentage | 95% CI |
Lack of Technical Support | 270 | 170 | 63.0 | ( 57.1 - 68.5 ) |
Software Cost | 270 | 132 | 48.9 | ( 43 - 54.8 ) |
CTU Staff Motivation to implement EDC | 270 | 76 | 28.1 | ( 23.1 - 33.8 ) |
Lack of user friendly Software | 270 | 71 | 26.3 | ( 21.4 - 31.9 ) |
Complex Regulatory Requirements | 270 | 62 | 23.0 | ( 18.3 - 28.3 ) |
Other reasons identified for not using EDC were:
Table 12 : Free text responses to reasons for not using EDC in trialReasons |
Small sample size |
Data recording on paper has been the conventional method and it needs time and effort to make a change. All data collection personnel may not be comfortable using EDC and their training will be needed. |
Lack of budget for procuring such software for the project because this is a single institution intra murally funded study which does not allocate funds for any personnel for datda recording/management |
Standardized assessment tools can not be applied and analysed |
Not aware of free software and concern regarding data safety |
can not comment about my institution |
Unawareness |
Cost. No funding for trials |
scholars can't afford for their research |
Unaware about edc |
I was unaware of this EDC system before this |
Not heard of it when trial was conducted |
unaware of EDC |
Cost effectivness when volume of data collected is less and external sponsorship is not available. |
Lack of knowledge about EDC |
Not being used in our area so didn’t have access to it. |
Certain complexity of design made it difficult to go with EDC |
Study was not started at our site due to premature termination. Hence we could not access the EDC systems for the study |
learnt about them much later after the start of the trial |
EDC was not under dicussion / consideration at thta time |
Was not aware. |
Not funded by the institution |
We have not thought about the possibility of an electronic software. As the department of cardiology and the hospital are next door, and since it is a single centre study, we thought of collecting data and write in paper |
this was an academic trial. We did not have the resources available in 2012 to use EDC for an academic study. |
At that time lack of information that how effective this could have been |
Not aware |
Lack of awareness of it and proper institutional software. |
not enough hardware with internet connection in the premises -so difficult to implement online EDC. Also hospital does not have a ready to use software which can be used across trials. found it too cumbersome to set it up for one trial |
We have the competency to use EDC,which we are using for some of the Phase 2 ongoing studies. But for this particular study Sponsor,has provided us SOW of only paper CRF study |
I did not know about it |
Lack of awareness |
Sponsor did not inform us or provide us with any EDC software or platform. |
Finally two additional questions were asked about the trial center weather they had access to a CTU and an IRB. We will evaluate the data in relation to EDC use.
Table 13 : EDC adoption by CTU and IRB availabilityCharacteristic | N | No, N = 2901 | Yes, N = 1101 | p-value2 |
resource | 400 |
|
| 0.2 |
Both |
| 135 (47%) | 54 (49%) |
|
None |
| 146 (50%) | 49 (45%) |
|
Only CTU |
| 9 (3.1%) | 7 (6.4%) |
|
1n (%) |
2Fisher's exact test |
Packages used
R : R Core Team (2020). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
Tidyverse : Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686
gtsummary : Daniel D. Sjoberg, Michael Curry, Margie Hannum, Joseph Larmarange, Karissa Whiting and Emily C. Zabor (2021). gtsummary: Presentation-Ready Data Summary and Analytic Result Tables. <https://github.com/ddsjoberg/gtsummary>, http://www.danieldsjoberg.com/gtsummary/.
Hmisc : Frank E Harrell Jr, with contributions from Charles Dupont and many others. (2021). Hmisc: Harrell Miscellaneous. https://hbiostat.org/R/Hmisc/, https://github.com/harrelfe/Hmisc/
flextable : flextable: Functions for Tabular Reporting. https://ardata-fr.github.io/flextable-book/, https://davidgohel.github.io/flextable/.
rms : Frank E Harrell Jr (2021). rms: Regression Modeling Strategies. https://hbiostat.org/R/rms/, https://github.com/harrelfe/rms.
ggplot2: H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
Lubridate: Garrett Grolemund, Hadley Wickham (2011). Dates and Times Made Easy with lubridate. Journal of Statistical Software, 40(3), 1-25. URL https://www.jstatsoft.org/v40/i03/.
LS0tCnRpdGxlOiAiQXBwZW5kaXggSUkgRWxlY3Ryb25pYyBEYXRhIENhcHR1cmUgU3lzdGVtcyBpbiBJbmRpYSBTdXJ2ZXkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZWNobz0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBzZXR3ZCA9ICIuLi9wcm9qZWN0LyIsCiAgICAgICAgICAgICAgICAgICAgICBkZXY9YygicG5nIiwidGlmZiIpKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShndHN1bW1hcnkpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShmbGV4dGFibGUpCgpkZiA8LSByZWFkLmNzdigiY2xpbmljYWxfdHJpYWxzX2luZnJhc3RydWN0dXJlX3MgKDkpLmNzdiIpCnRyaWFsX2RldGFpbHMgPC0gcmVhZC5jc3YoImZpbmFsX21lcmdlZF9uY2lfY3RyaV9kYXRhLmNzdiIpCmNvbnRhY3RzIDwtIHJlYWQuY3N2KCJmaW5hbF9jb250YWN0X2xpc3QuY3N2IikKY2FtX3N0YXRzMSA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTExNzY2MjEwLU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMiA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTEyNjMxNjQ2LU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMyA8LSByZWFkLmNzdigiR01hc3MtUmVwb3J0LTEyOTYwNDE0LU1haW4tQ2FtcGFpZ24tU3RhdHMuY3N2IikKY2FtX3N0YXRzMSA8LSBjYW1fc3RhdHMxICU+JSBzZWxlY3QoZW1haWxhZGRyZXNzLElELE9wZW5zLFVuc3Vic2NyaWJlZCxCb3VuY2VkLEJsb2NrZWQpIApjYW1fc3RhdHMyIDwtIGNhbV9zdGF0czIgJT4lIHNlbGVjdChlbWFpbGFkZHJlc3MsSUQsT3BlbnMsVW5zdWJzY3JpYmVkLEJvdW5jZWQsQmxvY2tlZCkgCmNhbV9zdGF0czMgPC0gY2FtX3N0YXRzMyAlPiUgc2VsZWN0KGVtYWlsYWRkcmVzcyxJRCxPcGVucyxVbnN1YnNjcmliZWQsQm91bmNlZCxCbG9ja2VkKSAKCgoKY2FtX3N0YXRzIDwtIHJiaW5kKGNhbV9zdGF0czEsY2FtX3N0YXRzMixjYW1fc3RhdHMzKQojIFNwb25zb3IgdHlwZSBhcyBpbnN0aXR1dGlvbmFsLCBnb3Zlcm5tZW50YWwgYW5kIGluZHVzdHJ5IGFzIHdlbGwgYXMgb3RoZXJzLiAKCnRyaWFsX2RldGFpbHMgPC0gdHJpYWxfZGV0YWlscyAlPiUgIAogIG11dGF0ZShzcG9uc29yID0gdHJpbXdzKHRvbG93ZXIoc3BvbnNvcikpKSAlPiUgCiAgbXV0YXRlKHNwb25zb3JfdHlwZSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KHNwb25zb3IsImluc3RpdHV8Y29sbGVnZXx1bml2ZXJzaXR5IikgfiAiSW5zdGl0dXRpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHNwb25zb3IsImdvdmVyIikgfiAiR292ZXJubWVudGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3Qoc3BvbnNvciwgImNvbW1lcmNpYWx8Y29uc3VtZXJ8ZXhwb3J0fG1hcmtldHxkZXZpY2V8bmF0cmFjZXxpbmR1c3RyeXxwaGFybWF8Y29tcGFufGNvbnRyYWN0fG1hbnVmYWN0fHB2dFxcLiIpIH4gIkluZHVzdHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIiKSwKICAgICAgICAgaW5kdXN0cnlfZnVuZGVkID0gY2FzZV93aGVuKHNwb25zb3JfdHlwZSA9PSAiSW5kdXN0cnkiIH4gIlllcyIsIFRSVUUgfiAiTm8iKSkgCgojIFRyaWFsIHBoYXNlIGRpdmlkZWQgaW50byBjYXRlZ29yaWVzLiAKdHJpYWxfZGV0YWlscyA8LSB0cmlhbF9kZXRhaWxzICU+JSAKICBtdXRhdGUocGhhc2UgPSB0cmltd3MocGhhc2UpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlbW92ZV9hbGwocGhhc2UsIlBoYXNlfEVhcmx5IikpICU+JSAKICBtdXRhdGUocGhhc2UgPSBzdHJfcmVtb3ZlX2FsbChwaGFzZSwiXFxzK3xcbnxcdCIpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlcGxhY2UocGhhc2UsIlBvc3RNYXJrZXRpbmdTdXJ2ZWlsbGFuY2UiLCI0IikpICU+JSAKICBtdXRhdGUocGhhc2UgPSBzdHJfcmVwbGFjZShwaGFzZSwiTm90QXBwbGljYWJsZSIsIk4vQSIpKSAlPiUgCiAgbXV0YXRlKHBoYXNlID0gc3RyX3JlcGxhY2UocGhhc2UsIlxcfCIsIi8iKSkgJT4lIAogIG11dGF0ZShwaGFzZV90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChwaGFzZSwiMVxcLzJ8MSR8MiQiKSB+ICJQaGFzZSAxIC0gMiIsCiAgICBzdHJfZGV0ZWN0KHBoYXNlLCIyXFwvM3wzJCIpIH4gIlBoYXNlIDIgLSAzIiwKICAgIHN0cl9kZXRlY3QocGhhc2UsIjNcXC80fDQkIikgfiAiUGhhc2UgNCIsIAogICAgVFJVRSB+ICJVbmtub3duIgogICkpCgp0cmlhbF9kZXRhaWxzPC0gdHJpYWxfZGV0YWlscyAlPiUgCiAgbXV0YXRlKGNvbmRpdGlvbiA9IHRvbG93ZXIoY29uZGl0aW9uKSkgJT4lIAogIG11dGF0ZShjb25kaXRpb24gPSB0cmltd3MoY29uZGl0aW9uKSkgJT4lIAogIG11dGF0ZSgKICAgIGNvbmRpdGlvbl90eXBlID0gY2FzZV93aGVuKAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwibHltcGhvYmxhc3RpY3xuZW9wbGFzaWF8dHVtb3VyfHR1bW9yfGNhbmNlcnxseW1waG9tYXxsZXVrZW1pYXxuZW9wbGFzbXxjYXJjaW5vbWF8c2FyY29tYXxjYXN0bGVtYW58Y2hlbW90aGVyYXB5fHJhZGlvdGhlcmFweXxlYnJ0fHJhZGlhdGlvbnxteWVsb2R5c3BsYXN0aWN8YXBsYXN0aWN8c3RlbSBjZWxsfCBtYmMgfGNhIG92YXJ5fG15ZWxvbWF8bnNjbGN8Z2VzdGF0aW9uYWwgdHJvcGhvYmxhc3RpYyBkaXNlYXNlfGZpYnJvYWRlbm9tYXxnbGlvYmxhc3RvbWF8bGV1a29wbGFraWF8bWFsaWduYW5jeSIpIH4gIk5lb3BsYXNtcyIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJkaWFiZXRlc3xkaWFiZXRpY3x0aHlyb2lkaXNtfG1hbG51dHJpdGlvbnxtZXRhYm9saWN8bnV0cml0aW9uYWwgZGVmaWNpZW5jeXxvYmVzaXR5fG9iZXNlfGh5cGVyYWxpbWVudGF0aW9ufGdseWNlbWlhfGdyb3d0aHxvdmVyd2VpZ2h0fHN0dW50fG51dHJpdGlvbmFsIHN1cHBsZW1lbnR8ZW5kb2NyaW5lIGdsYW5kfGRpc29yZGVyIG9mIHRoeXJvaWR8dGh5cm9pZCBzdXJnZXJ5fG9iZWlzaXR5fGFjcm9tZWdhbHl8cGl0dWl0YXJ5fHdlaWdodCBsb3NzfHR5cGUgaWkgZG0iKSB+ICJFbmRvY3JpbmUgZGlzZWFzZSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCIobXx4KWRyKC4qPyl0YiB8dHViZXJjdXxiYWN0ZXJpYWx8cG5ldW1vbmlhfHNlcHRpY2VtaWF8bWFsYXJpYXxoaXZ8YWlkc3xpbmZlY3Rpb258bGVwcm9zeXxzdXBwdXJhdGl2ZXxkZW5ndWV8bWFsYXJpYXxwbGFzbW9kaXVtfGluZmVjdGlvdXN8YWJzY2Vzc3xedGIgfGFjdXRlIHBhbmNyZWF0aXRpc3xjb3JvbmF8Y292aWR8ZmlsYXJpYXxtdWNvcnx3YXJ0c3xqYXBhbmVzZXx0eXBob2lkfHNlcHNpc3xhY2FudGhhbXxoZXBhdGl0aXMoXFwtfCApKGF8YnxjKShcXHMrfCQpfGRpZmZpY2lsZXx0aW5lYXxsZXB0b3NwaXxmdW5nYWx8c2VwdGljfHNjYWJpZXN8cmFiaWVzfGxlaXNobWFuaWFzaXN8aGlkcmFkZW5pdGlzIikgfiAiSW5mZWN0aXZlIERpc2Vhc2VzIiwKICAgICAgc3RyX2RldGVjdChjb25kaXRpb24sImZyYWN0dXJlfHRyYXVtYXxpbmp1cnl8YWNjaWRlbnR8YnVybnxpbmp1cmllc3xzbW9rZXxmaXJlfGZsYW1lfHNwcmFpbnxzbmFrZSIpIH4gIkFjY2lkZW50cyBhbmQgSW5qdXJpZXMiLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwiYW54aWV0eXxwc3ljaG9hY3RpdmV8cmVsYXRlZCBzdHJlc3N8ZGVwcmVzc2l2ZXxkZXByZXNzaW9ufHNjaGl6b3BocmVuaWF8d2l0aGRyYXdsfGFkZGljdGlvbnxhZmZlY3RpdmV8YXR0ZW50aW9ufG9ic2Vzc2l8Y29tcHVsc2l8c2VpenVyZXxtZW50YWwgcmV0YXJkfHBhcmtpbnNvbnxhbHpoZWltZXJ8bmV1cm90aWN8bW9vZHxuZXVyb3BhdGh5fHJhZGljdWxvcGF0aHl8Y2VyZWJyYWwgcGFsc3l8YXV0aXN8ZGVtZW50aWF8KGFsY29ob2x8dG9iYWNjb3xuaWNvdGluZSkgKGNvbnN1bXB0fGFkZGljfHdpdGhkcmF8ZGVwZW5kYSl8bWlncmFpbmV8aW5zb21uaWF8YWRoZHxpbnRlbGxlY3R1YWx8ZXBpbGVwdGljfChkaXNvcmRlcnxkaXNvcmRlcnN8ZGlzZWFzZXxkaXNlYXNlcykgb2YgKGJyYWlufGNlbnRyYWwgbmVydm91cyl8ZXBpbGVwc2llc3xwb3N0IGhlcnBldGljIG5ldXJhbGdpYXx6b3N0ZXIgYXNzb2NpYXRlZCBwYWlufHBzeWNob3Npc3xiaXBvbGFyfGVwaWxlcHN5fGVuY2VwaGFsb3BhdGh5fHNtb2tpbmcgY2Vzc2F0aW9uIikgfiAiTWVudGFsIEJlaGF2aW91cmFsIERpc29yZGVycyBhbmQgbmVydm91cyBzeXN0ZW0gZGlzZWFzZSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJhc3RobWF8Y2hyb25pYyBvYnN0cnVjdHxjb3BkfGJyb25jaGlvbGl0aXN8d2hlZXplfChkaXNlYXNlfGRpc29yZGVyKSguKj8pKHJlc3BpcmF0b3J5fGx1bmcpfHJlc3BpcmF0b3J5ICh0cmFjdHxkaXN0cmVzc3xkaXNvcmRlcil8d2hlZXppbmciKSB+ICJEaXNlYXNlcyBvZiByZXNwaXJhdG9yeSBzeXN0ZW0iLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwiKGNhbGN1bHVzKSguKj8pKGtpZG5leXx1cmV0ZXJ8dXJldGhyYXxibGFkZGVyKXxuZXBocm90aWN8KG5lcGhyb3x1cm8pbGl0aHxlbmQoLio/KXN0YWdlIChyZW5hbHxraWRuZXkpIGRpc2Vhc2V8ZXNyZHxkaWFseXNpc3xuZXBocm9wYXRoeXxnbG9tZXJ1bGFyfHVyaW5hcnkgaW5jb250aW5lbmNlfHJlbmFsIHN0b25lfGRpc29yZGVyIG9mIHByb3N0YXRlfHByb3N0YXRpYyBoeXBlcnx1cmV0aHJhfHB5ZWxvcGxhc3R5fGh5cG9zcGFkaWFzfChkaXNlYXNlc3xkaXNlYXNlKSguKj8pKGdlbml0b3VyaW5hcnl8a2lkbmV5fHVyZXRlcil8dXJvbG9naWNhbHwoYXpvb3xvbGlnbylzcGVybWlhfChibGFkZGVyfGtpZG5leXxyZW5hbHx1cmV0ZXJpY3xwcm9zdGF0aWMpKC4qPykoZGlzb3JkZXJ8ZGlzZWFzZSkiKSB+ICJEaXNlYXNlcyBvZiBnZW5pdG91cmluYXJ5IHN5c3RlbSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJleWUgZGlzZWFzZXxnbGF1Y29tYXxjYXRhcmFjdHxjb3JuZWF8cmV0aW5hbHxyZXRpbm9wYXRoeXxjb25qdW5jdHxleWVsaWR8dXZlaXRpc3xvcHRpY3xvY3VsYXJ8ZXllbGlkfGFzdGlnbWF8bXlvcGlhfGh5cGVybWV0cm9waWF8ZXBpc2NsZXJ8c2NsZXJhfGV5ZSBoZWFsdGh8cHRlcnlnaXVtfGtlcmF0b3BhdGh5fGNob3JvaWQiKSB+ICJEaXNlYXNlcyBvZiBFeWUiLAogICAgICBzdHJfZGV0ZWN0KGNvbmRpdGlvbiwicGVyaW9kb250aXRpc3xnZXJkfGNpcnJob3Nlc3xnYXN0cml0aXN8ZGVudGluYWx8cHVscGl0aXN8ZW5kb2RvbnRvdGljfGVkZW50dWxvdXN8ZGVudGFsfG1vbGFyfHRvb3RofGdpbmdpdnxjYXJpZXN8Y2lycmhvc2lzfGNpcnJob3RpY3xlbmQgc3RhZ2UgKGxpdmVyfGhlcGF0aWMpfChsaXZlcnxoZXBhdGljKSBmYWlsdXJlfGNvbGl0aXN8KGVzb3BoYWdlYWx8Z2FzdHJpY3xkdW9kZW5hbHxqZWp1bmFsfGludGVzdGluYWx8Y29sb25pY3xyZWN0YWx8cGVwdGljfGFuYWx8Y29sb3JlY3RhbCkoLio/KSh1bGNlcnxzdHJpY3R1cmV8b2JzdHJ1Y3Rpb258ZmlzdHVsYXxkaXNvcmRlcnxkaXNlYXNlKXxnYXN0cm9pbnRlc3RpbmFsIGRpc29yZGVyfGhhZW1vcnJob2lkc3xoZW1vcnJob2lkc3xhbnVzfChmaXN0dWxhfGZpc3N1cmUpIGluIChhbm98YW51cyl8Y2hvbGVsaXRoaWFzaXN8aGVwYXRpdGlzfHBhbmNyZWF0aXRpc3woZGlzZWFzZXxkaXNlYXNlc3xkaXNvcmRlcikoLio/KShkaWdlc3RpdmV8bGl2ZXJ8YmlsaWFyeXxiaWxlKXxpY3RlcmljfGFjdXRlIGRpYXJyaGVhfGNob2xpbGl0aGlhc2lzfGR5c3BlcHNpYXxwcm9jdGl0aXN8ZXJjcHxoeXBlcmJpbGlydWJpbmVtaWF8amF1bmRpY2V8Z2F1Y2hlcnxsaXZlciBkaXNlYXNlfGFjaGFsYXNpYSBvZiBjYXJkaWF8Z2FzdHJvZXNvcGhhZ2VhbCByZWZsdXh8YnVkZC1jaGlhcml8cGFuY3JlYXMiKSB+ICJEaXNlYXNlcyBvZiBkaWdlc3RpdmUgc3lzdGVtIiwKICAgICAgc3RyX2RldGVjdChjb25kaXRpb24sInJoZW11YXRpYyBmZXZlcnxoeXBlcnRlbihzaW9ufHNpdmUpfGNhcmRpYWN8YW5naW5hfGNvcm9uYXJ5IHN5bmRyb21lfGNvcm9uYXJ5fGFtaXxteW9jYXJkaWFsIGluZmFyY3Rpb258aGVhcnQgZmFpbHVyZXxpc2NoZW1pY3xjYXJkaW9teW9wYXRoeXxhdHJpYWx8Y2FyZGlvdmFzY3VsYXIgZGlzZWFzZXwodGFjaHl8YnJhZHkpY2FyZGlhfGNvbmdlbml0YWwgaGVhcnR8bXlvY2FyZGlhbHxwdWxtb25hcnkgaHlwZXJ0ZW5zaW9ufHN0cm9rZXxjZXJlYnJvdmFzY3VsYXIgZGlzZWFzZXxjdmR8Y2hkfGJ5cGFzc3xpbmZhcmN0aW9ufGF0aGVyb3NjbGVyb3Npc3woZGlzZWFzZXxkaXNvcmRlcikoLio/KShjaXJjdWxhdG9yeXxoZWFydHxjYXJkaWFjKSIpIH4gIkRpc2Vhc2VzIG9mIENpcmN1bGF0b3J5IFN5c3RlbSIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJhcnRocm9wYXRoaWVzfGFydGhyaXRpc3xjaHJvbmljfHBvbHljeXN0aWN8Zmlicm9zaXN8ZW5kb21ldHJpb3Npc3xyaGV1bWF0b2lkfGNyb2hufGdvdXR8aHlwZXJ1cmljZW1pYXxpbmZlcnRpbGl0eXxsdXB1c3xvc3Rlb3Bvcm9zaXN8c2xlfGFua3lsb3Npbmd8c3lzdGVtaWMgc2NsZXJvc2lzIil+IkNocm9uaWMgbm9uLWNvbW11bmljYWJsZSBkaXNlYXNlcyIsCiAgICAgIHN0cl9kZXRlY3QoY29uZGl0aW9uLCJoZWFsdGh5fHBsYXllcnN8dm9sdW50ZWVyfGFudGktYWdpbmd8bm9ybWFsIGNoaWxkcmVufG5vIHNwZWNpZmljIGhlYWx0aCBjb25kaXRpb258b3JhbCBoZWFsdGgiKSB+ICJOb3JtYWwgaGVhbHRoeSB2b2x1bnRlZXJzIiwKICAgICAgVFJVRX4iT3RoZXJzIikpCgp0cmlhbF9kZXRhaWxzIDwtIHRyaWFsX2RldGFpbHMgJT4lIG11dGF0ZShtdWx0aWNlbnRyaWM9Y2FzZV93aGVuKHNpdGVzID4gMSB+ICJZZXMiLCBUUlVFIH4gIk5vIikpCgpkZiA8LSBkZiAlPiUgcmVuYW1lKElEID0gdHJpYWxfaWQpCgoKc2V0X2ZsZXh0YWJsZV9kZWZhdWx0cygKICBmb250LmZhbWlseSA9ICJBcmlhbCIsIAogIGZvbnQuc2l6ZSA9IDEwLAogIGZvbnQuY29sb3IgPSAiYmxhY2siLAogIHRhYmxlLmxheW91dCA9ICJhdXRvZml0IiwKICBkaWdpdHMgPSAxLAogIHRoZW1lX2Z1biA9ICJ0aGVtZV96ZWJyYSIKICApCmBgYAoKIyBFbGltaW5hdGUgZHVwbGljYXRlIHJlc3BvbnNlcwoKRmlyc3QsIHdlIHdpbGwgY2hlY2sgaWYgdGhlIGR1cGxpY2F0ZWQgcmVzcG9uc2VzIHdlcmUgY29uc2lzdGVudC4gSWYgbm90LCB3ZSB3aWxsIHJldGFpbiB0aGUgcmVzcG9uc2UgaW4gd2hpY2ggRURDIHVzZSB3YXMgbWFya2VkIGFzICJZZXMuIiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIHJlc3BvbmRlbnQgd2hvIGFuc3dlcmVkIE5vIG1heSBub3QgYmUgYXdhcmUgb2YgRURDIHVzZSBpbiB0aGUgY2xpbmljYWwgdHJpYWwuIElmIHRoZSByZXNwb25zZXMgYXJlIGNvbmNvcmRhbnQsIHRoZW4gdGhlIDJuZCByZXNwb25zZSB3aWxsIGJlIHJlbW92ZWQuIFdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSBzZWdtZW50IGZvciB0aGlzLgoKSW4gdGhlIGZpcnN0IHNlZ21lbnQsIHdlIG1ha2UgYSBkYXRhIGZyYW1lIG9mIGR1cGxpY2F0ZWQgdHJpYWxzIHdpdGggc2VyaWFsIG51bWJlcnMgb2YgcmVzcG9uc2VzLgoKSW4gdGhlIHNlY29uZCBzZWdtZW50LCB3ZSBtYWtlIGEgZGF0YSBmcmFtZSBmb3IgdGhlIGZpcnN0IHJlc3BvbnNlcyBhbmQgdGhlbiBtZXJnZSBpdCB3aXRoIHRoZSBkYXRhIGZyYW1lIGNvbXByaXNpbmcgb2YgYSBsaXN0IG9mIGR1cGxpY2F0ZWQgdHJpYWxzLiBGb3IgZWFjaCByb3csIHdlIG1ha2UgYSB2YXJpYWJsZSB0aGF0IHNlbGVjdHMgdGhlIHNlcmlhbCBvZiByZXNwb25zZSB3aXRoIHRoZSBFREMgdXNlIHJlc3BvbnNlID0gWWVzIGlmIHRoZXJlIGlzIGEgZGlzY29yZGFuY2UuIFRoZSBmaW5hbCB0d28gY29kZSBjaHVua3MgbWFrZSBhIGRhdGEgZnJhbWUgd2l0aCB0cmlhbHMgZm9yIHdoaWNoIGEgc2luZ2xlIHJlc3BvbnNlIGhhcyBiZWVuIG9idGFpbmVkLgoKYGBge3J9CmR1cCA8LSBkZiAlPiUgc2VsZWN0KHNlcmlhbCxJRCxlZGNfdXNlKSAlPiUgCiAgZ3JvdXBfYnkoSUQpICU+JSAKICBtdXRhdGUoc2VyaWFsLm51bWJlcj1yb3dfbnVtYmVyKCkpICU+JSAKICBmaWx0ZXIoc2VyaWFsLm51bWJlcj4xKSAgJT4lIAogIHVuZ3JvdXAoKQoKZHVwIDwtIGRmICU+JSBzZWxlY3Qoc2VyaWFsLElELGVkY191c2UpICU+JSAKICBncm91cF9ieShJRCkgJT4lIAogIG11dGF0ZShzZXJpYWwubnVtYmVyPXJvd19udW1iZXIoKSkgJT4lCiAgZmlsdGVyKHNlcmlhbC5udW1iZXI9PTEpICU+JSAKICBsZWZ0X2pvaW4oZHVwLC4sYnk9IklEIikgJT4lIAogIGZpbHRlcihzZXJpYWwueCAhPSBzZXJpYWwueSkgJT4lIAogIGZpbHRlcihzZXJpYWwubnVtYmVyLnggIT0gc2VyaWFsLm51bWJlci55KSAlPiUgCiAgbXV0YXRlKHNlcmlhbF9yZXRhaW4gPSBjYXNlX3doZW4oZWRjX3VzZS55PT0iWWVzIiB+IHNlcmlhbC55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkY191c2UueT09Ik5vIiAmIGVkY191c2UueCA9PSAiWWVzIiB+IHNlcmlhbC54LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkY191c2UueT09ICJObyIgJiBlZGNfdXNlLnggPT0gIk5vIiB+c2VyaWFsLnkpKSAlPiUgCiAgc2VsZWN0KElELHNlcmlhbF9yZXRhaW4pICU+JSAKICBkaXN0aW5jdCguLElELC5rZWVwX2FsbD1UKSAlPiUgCiAgcmVuYW1lKHNlcmlhbCA9IHNlcmlhbF9yZXRhaW4pCgpkZl91bmlxdWUgPC0gZGYgJT4lIGFudGlfam9pbiguLGR1cCxieT0iSUQiKQoKZGZfZHVwIDwtIGRmICU+JSBzZW1pX2pvaW4oLixkdXAsYnk9InNlcmlhbCIpCgpkZiA8LSByYmluZChkZl91bmlxdWUsZGZfZHVwKQpgYGAKCmBgYHtyfQpjb250YWN0cyA8LSBjb250YWN0cyAlPiUgCiAgbXV0YXRlKGVtYWlsPXRyaW13cyhlbWFpbCkpICU+JSAKICBtdXRhdGUoZW1haWw9c3RyX3JlbW92ZV9hbGwoZW1haWwsIlxccyt8XG58XHQiKSkKCiMgT2J0YWluIHRoZSBsaXN0IG9mIENUUkkgdHJpYWwgSURzIGZyb20gcmVzcG9uZGVudHMKCnJlc3AgPC0gZGYgJT4lIAogIHNlbGVjdChJRCkKCiMgUmVtb3ZlIHRoZSByZXNwb25kZW50IHRyaWFscyBmcm9tIHRoZSBsaXN0Cgpjb250YWN0czIgPC0gY29udGFjdHMgJT4lIGFudGlfam9pbiguLHJlc3AsYnk9IklEIikgIAoKIyBNYWtlIGEgbGlzdCBvZiByZXNwb25kZW50cyB3aG8gaGF2ZSByZXNwb25kZWQgZm9yIG9uZSBjbGluaWNhbCB0cmlhbC4gRG8gbm90IHNlbmQgdGhlbSBhbm90aGVyIG1haWwuIAoKcmVzcG9uZGVudF9lbWFpbHMgPC0gY29udGFjdHMgJT4lIAogIHNlbWlfam9pbiguLHJlc3AsYnk9IklEIikgJT4lIAogIHNlbGVjdChlbWFpbCxJRCkgJT4lIAogIHJlbmFtZShyZXNwb25kZWRfdHJpYWw9SUQpICU+JSAKICBtdXRhdGUoZW1haWw9dHJpbXdzKGVtYWlsKSkgJT4lIAogIG11dGF0ZShlbWFpbD1zdHJfcmVtb3ZlX2FsbChlbWFpbCwiXFxzK3xcbnxcdCIpKSAlPiUgCiAgZGlzdGluY3QoLixlbWFpbCxyZXNwb25kZWRfdHJpYWwsLmtlZXBfYWxsPVQpCgpyZXNwb25kZXJzIDwtIGNvbnRhY3RzMiAlPiUgaW5uZXJfam9pbihyZXNwb25kZW50X2VtYWlscywuLGJ5PSJlbWFpbCIpICU+JSAKICBkaXN0aW5jdCguLElELC5rZWVwX2FsbCA9IFQpICU+JSAKICBzZWxlY3QocmVzcG9uZGVkX3RyaWFsLElEKSAlPiUgCiAgcmVuYW1lKElEPXJlc3BvbmRlZF90cmlhbCxvdGhlcl9JRD1JRCkgJT4lIAogIGxlZnRfam9pbiguLGRmLGJ5PSJJRCIpICU+JSAKICBzZWxlY3QoLWMoSUQpKSAlPiUgCiAgcmVuYW1lKElEPW90aGVyX0lEKSAlPiUgCiAgZ3JvdXBfYnkoc2VyaWFsKSAlPiUgCiAgbXV0YXRlKHNubyA9IHJvd19udW1iZXIoKSkgJT4lIAogIG11dGF0ZShzbm8gPSBzbm8rMSkgJT4lIAogIG11dGF0ZShzZXJpYWwgPSBwYXN0ZShzZXJpYWwsc25vLHNlcD0iXyIpKSAlPiUgCiAgc2VsZWN0KC1zbm8pCgpkZiA8LSByYmluZChkZixyZXNwb25kZXJzKQpgYGAKCmBgYHtyfQojIE1lcmdlIHRyaWFsIGRldGFpbHMgd2l0aCB0aGUgZGF0YXNldCBvZiBzdXJ2ZXkgcmVzcG9uc2VzIHRvIGVuc3VyZSB0cmlhbCBjaGFyYWN0ZXJpc3RpY3MgY2FuIGJlIGFzY2VydGFpbmVkLiAKCmRmIDwtIGRmICU+JSAKICBsZWZ0X2pvaW4oLix0cmlhbF9kZXRhaWxzLGJ5PSJJRCIpCmRmIDwtIGRmICU+JSBzZWxlY3QoLXJlbW90ZV9hZGRyKQpgYGAKCmBgYHtyfQoKY2lfZnVuY3Rpb25fY2F0IDwtIGZ1bmN0aW9uKGRhdGEsIHZhcmlhYmxlLCBieSwgdGJsLCAuLi4pIHsKICAjIGZpcnN0IGNhbGN1bGF0ZSBDSXMgZm9yIGFsbCBsZXZlbHMKICByZXN1bHQgPC0KICAgIGRhdGEgJT4lIAogICAgZnJlcXRhYmxlczo6ZnJlcV90YWJsZSghIXN5bShieSksICEhc3ltKHZhcmlhYmxlKSkgJT4lIAogICAgbXV0YXRlKGNpID0gc3RyX2dsdWUoIntzdHlsZV9wZXJjZW50KGxjbF9yb3cgLyAxMDAsIHN5bWJvbCA9IFRSVUUpfSAtIHtzdHlsZV9wZXJjZW50KHVjbF9yb3cgLyAxMDAsIHN5bWJvbCA9IFRSVUUpfSIpKSAlPiUKICAgIHNlbGVjdChyb3dfY2F0LCBjb2xfY2F0LCBjaSkgJT4lCiAgICBwaXZvdF93aWRlcihpZF9jb2xzID0gY29sX2NhdCwgbmFtZXNfZnJvbSA9IHJvd19jYXQsIHZhbHVlc19mcm9tID0gY2kpIAogIAogICMgaWYgdmFyaWFibGUgaXMgdHlwZSAnZGljaG90b21vdXMnLCBvbmx5IGtlZXAgb25lIHJvdwogIHZhcl9tZXRhX2RhdGEgPC0gdGJsJG1ldGFfZGF0YSAlPiUgZmlsdGVyKC5kYXRhJHZhcmlhYmxlICVpbiUgLmVudiR2YXJpYWJsZSkKICBpZiAodmFyX21ldGFfZGF0YSRzdW1tYXJ5X3R5cGUgJWluJSAiZGljaG90b21vdXMiKSB7CiAgICByZXN1bHQgPC0gcmVzdWx0ICU+JSBmaWx0ZXIoY29sX2NhdCAlaW4lIHZhcl9tZXRhX2RhdGEkZGljaG90b21vdXNfdmFsdWVbWzFdXSkKICB9CiAgCiAgcmVzdWx0ICU+JQogICAgc2VsZWN0KC0xKSAlPiUKICAgIHNldF9uYW1lcyhwYXN0ZTAoImFkZF9zdGF0XyIsIHNlcV9sZW4obmNvbCguKSkpKQp9CgpjaV9mdW5jdGlvbl9jb24gPC0gZnVuY3Rpb24oZGF0YSwgdmFyaWFibGUsIGJ5LCAuLi4pIHsKICBkYXRhICU+JQogICAgYXJyYW5nZSguZGF0YVtbYnldXSkgJT4lCiAgICBncm91cF9ieSguZGF0YVtbYnldXSkgJT4lCiAgICBncm91cF9tYXAoCiAgICAgIH4ueFtbdmFyaWFibGVdXSAlPiUgCiAgICAgICAgdC50ZXN0KCkgJT4lIAogICAgICAgIGJyb29tOjp0aWR5KCkgJT4lCiAgICAgICAgbXV0YXRlX2F0KHZhcnMoY29uZi5sb3csIGNvbmYuaGlnaCksIHN0eWxlX3NpZ2ZpZykgJT4lCiAgICAgICAgbXV0YXRlKGNpID0gc3RyX2dsdWUoIntjb25mLmxvd30gLSB7Y29uZi5oaWdofSIpKSAlPiUKICAgICAgICBzZWxlY3QoY2kpCiAgICApICU+JQogICAgaW1hcF9kZnIofi54ICU+JSBtdXRhdGUoY29sX25hbWUgPSBwYXN0ZTAoImFkZF9zdGF0XyIsIC55KSkpICU+JQogICAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBjaSwgbmFtZXNfZnJvbSA9IGNvbF9uYW1lKQp9CgpgYGAKCiMgU3RhdGlzdGljYWwgQW5hbHlzaXMgUGxhbgoKIyMgUGFydGljaXBhdGlvbiBTdGF0aXN0aWNzCgpUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gcGFydGljaXBhdGlvbiBpbiB0aGUgc3VydmV5LiBUaGUgbnVtYmVyIG9mIGludmVzdGlnYXRvcnMgd2hvIHdlcmUgY29udGFjdGVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBudW1iZXIgb2YgdHJpYWxzIGFzIGZvciBhIHRyaWFsIG1vcmUgdGhhbiBvbmUgaW52ZXN0aWdhdG9yIG1heSBoYXZlIGJlZW4gY29udGFjdGVkLgoKYGBge3J9CnVuaXF1ZV90cmlhbHMgPC0gY29udGFjdHMgJT4lIHNlbGVjdChJRCkgJT4lIGRpc3RpbmN0KCkgJT4lIHN1bW1hcmlzZSh0b3RhbF90cmlhbHM9bigpKQp1bmlxdWVfY29udGFjdHMgPC0gY29udGFjdHMgJT4lIHNlbGVjdChlbWFpbCkgJT4lIGRpc3RpbmN0KCkgJT4lIHN1bW1hcmlzZSh1bmlxdWVfZW1haWxzID0gbigpKQp1bmlxdWVfb3BlbnMgPC0gY2FtX3N0YXRzICU+JSBmaWx0ZXIoT3BlbnM+MCkgJT4lIGRpc3RpbmN0KGVtYWlsYWRkcmVzcykgJT4lIHN1bW1hcmlzZSh1bmlxdWVfb3BlbnM9bigpKQp1bmlxdWVfdHJpYWxfb3BlbnMgPC0gY2FtX3N0YXRzICU+JSBmaWx0ZXIoT3BlbnM+MCkgJT4lIGRpc3RpbmN0KElEKSAlPiUgc3VtbWFyaXNlKHVuaXF1ZV90cmlhbF9vcGVucz1uKCkpCnBhcnRfdHJpYWxzIDwtIGRmICU+JSBzZWxlY3QoSUQpICU+JSBkaXN0aW5jdCgpICU+JSBzdW1tYXJpc2UocGFydGljaXBhdGluZ190cmlhbHMgPSBuKCkpCgpzdGF0aXN0aWNzIDwtIGNiaW5kKHVuaXF1ZV9jb250YWN0cyx1bmlxdWVfdHJpYWxzLHVuaXF1ZV9vcGVucyx1bmlxdWVfdHJpYWxfb3BlbnMscGFydF90cmlhbHMpCgpzdGF0aXN0aWNzICU+JSAKICBtdXRhdGUoCiAgICBpbnZlc3RpZ2F0b3Jfb3Blbl9yYXRlID0gcm91bmQoMTAwKnVuaXF1ZV9vcGVucy91bmlxdWVfZW1haWxzLDEpLAogICAgdHJpYWxfb3Blbl9yYXRlID0gcm91bmQoMTAwKih1bmlxdWVfdHJpYWxfb3BlbnMvdG90YWxfdHJpYWxzKSwxKSwKICAgIHBhcnRpY2lwYXRpb25fcmF0ZT1yb3VuZCgxMDAqcGFydGljaXBhdGluZ190cmlhbHMvdG90YWxfdHJpYWxzLDEpKSAlPiUKICBzZWxlY3QodW5pcXVlX2VtYWlscyx1bmlxdWVfb3BlbnMsaW52ZXN0aWdhdG9yX29wZW5fcmF0ZSx0b3RhbF90cmlhbHMsdW5pcXVlX3RyaWFsX29wZW5zLHRyaWFsX29wZW5fcmF0ZSxwYXJ0aWNpcGF0aW5nX3RyaWFscyxwYXJ0aWNpcGF0aW9uX3JhdGUpICU+JSAKICByZW5hbWUoCiAgICAiSW52ZXN0aWdhdG9ycyAoTikiID0gdW5pcXVlX2VtYWlscywKICAgICJUcmlhbHMgKE4pIiA9IHRvdGFsX3RyaWFscywKICAgICJJbnZlc3RpZ2F0b3JzIHdobyBvcGVuZWQgZW1haWwgKE4pIiA9IHVuaXF1ZV9vcGVucywKICAgICJUcmlhbHMgd2hvc2UgZW1haWwgd2FzIG9wZW5lZCAoTikiID0gdW5pcXVlX3RyaWFsX29wZW5zLAogICAgIlBhcnRpY2lwYXRpbmcgVHJpYWxzIChOKSIgPSBwYXJ0aWNpcGF0aW5nX3RyaWFscywKICAgICJJbnZlc3RpZ2F0b3Igb3BlbiByYXRlICglKSIgPSBpbnZlc3RpZ2F0b3Jfb3Blbl9yYXRlLAogICAgIlRyaWFsIG9wZW4gcmF0ZSAoJSkiID0gdHJpYWxfb3Blbl9yYXRlLAogICAgIlBhcnRpY2lwYXRpb24gcmF0ZSAoJSkiID1wYXJ0aWNpcGF0aW9uX3JhdGUKICApICU+JSAKICBmbGV4dGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMSA6IFBhcnRpY2lwYXRpb24gU3RhdGlzdGljcyIpCmBgYAoKIyMgSW5jbHVkZWQgdHJpYWwgY2hhcmFjdGVyaXN0aWNzCgpGaXJzdCB3ZSB0YWtlIGEgbG9vayBhdCB0aGUgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGFsbCB0cmlhbHMgd2VyZSB3ZXJlIGluIHRoZSBzYW1wbGluZyBmcmFtZS4KCmBgYHtyfQp0cmlhbF9kZXRhaWxzICU+JSAKICBzZW1pX2pvaW4oLixjb250YWN0cyxieT0iSUQiKSAlPiUgCiAgc2VsZWN0KElELHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGNvbmRpdGlvbl90eXBlKSAlPiUgCiAgZGlzdGluY3QoLixJRCwua2VlcF9hbGwgPSBUKSAlPiUgCiAgc2VsZWN0KC1JRCkgJT4lIAogIHRibF9zdW1tYXJ5KHR5cGUgPSBsaXN0IChtdWx0aWNlbnRyaWMgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiY2F0ZWdvcmljYWwiKSwKICAgICAgICAgICAgICBsYWJlbCA9IGxpc3Qoc3BvbnNvcl90eXBlIH4gIlNwb25zb3IgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJJbmR1c3RyeSBGdW5kZWQgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbF90eXBlIH4gIlR5cGUgb2YgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV90eXBlIH4gIlRyaWFsIFBoYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZHVyYXRpb24gfiAiRHVyYXRpb24gb2YgVHJpYWwgKERheXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgfiAiU2FtcGxlIFNpemUgKFRvdGFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzIH4gIk51bWJlciBvZiBzaXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2VudHJpYyB+ICJNdWx0aWNlbnRyaWMgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpb25zIH4gIkNvdW50cnkgb2YgUmVjcnVpdG1lbnQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBib2xkX2xhYmVscygpJT4lIAogIGFzX2ZsZXhfdGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMiA6IFRyaWFsIENoYXJhY3RlcmlzdGljcyIpCmBgYAoKTmV4dCB3ZSBjb21wYXJlIHRoZSB0cmlhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhvc2Ugc3R1ZGllcyB3aGljaCBoYXZlIHJlc3BvbmRlZCB2ZXJzdXMgdGhvc2Ugd2hpY2ggaGF2ZSBub3QuCgpgYGB7cn0KcGFydF90cmlhbHMgPC0gZGYgJT4lIHNlbGVjdChJRCkgJT4lIG11dGF0ZShwYXJ0aWNpcGFudD0iWWVzIikKCgp0cmlhbF9kZXRhaWxzICU+JSAKICBzZW1pX2pvaW4oLixjb250YWN0cyxieT0iSUQiKSAlPiUgCiAgc2VsZWN0KElELHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGNvbmRpdGlvbl90eXBlKSAlPiUgCiAgZGlzdGluY3QoLixJRCwua2VlcF9hbGwgPSBUKSAlPiUgCiAgbGVmdF9qb2luKC4scGFydF90cmlhbHMsYnk9IklEIikgJT4lIAogIG11dGF0ZShwYXJ0aWNpcGFudCA9IGNhc2Vfd2hlbihpcy5uYShwYXJ0aWNpcGFudCkgfiAiTm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfiJZZXMiKSkgJT4lIAogIHNlbGVjdCgtSUQpICU+JSAKICB0Ymxfc3VtbWFyeShieT1wYXJ0aWNpcGFudCwKICAgICAgICAgICAgICB0eXBlID0gbGlzdCAobXVsdGljZW50cmljIH4gImNhdGVnb3JpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cnlfZnVuZGVkIH4gImNhdGVnb3JpY2FsIiksCiAgICAgICAgICAgICAgbGFiZWwgPSBsaXN0KHNwb25zb3JfdHlwZSB+ICJTcG9uc29yIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiSW5kdXN0cnkgRnVuZGVkIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfdHlwZSB+ICJUeXBlIG9mIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfdHlwZSB+ICJUcmlhbCBQaGFzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX2R1cmF0aW9uIH4gIkR1cmF0aW9uIG9mIFRyaWFsIChEYXlzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplIH4gIlNhbXBsZSBTaXplIChUb3RhbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlcyB+ICJOdW1iZXIgb2Ygc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNlbnRyaWMgfiAiTXVsdGljZW50cmljIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aW9ucyB+ICJDb3VudHJ5IG9mIFJlY3J1aXRtZW50IgogICAgICAgICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSU+JSAKICBhc19mbGV4X3RhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDMgOiBUcmlhbCBjaGFyYWN0ZXJpc3RpY3MgY29tcGFyZWQgYmV0d2VlbiB0cmlhbHMgd2hpY2ggcGFydGljaXBhdGVkIGluIHRoZSBzdXJ2ZXkgYW5kIHRob3NlIHRoYXQgZGlkIG5vdC4iKQpgYGAKCiMjIEVEQyBBZG9wdGlvbiBSYXRlCgoqKkVEQyBBZG9wdGlvbiBSYXRlIChFQVIpKio6IFRoZSBwcmltYXJ5IG91dGNvbWUgbWVhc3VyZSBpcyBFQVIuIFRoaXMgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSByYXRpbyBvZiB0aGUgbnVtYmVyIG9mIENUUkkgcmVnaXN0ZXJlZCB0cmlhbHMgdGhhdCB1c2UgYW4gRURDIHdpdGggc29waGlzdGljYXRpb24gbGV2ZWwgMiBvciBtb3JlIHRvIHRoYXQgb2YgdGhlIHBhcnRpY2lwYXRpbmcgdHJpYWxzICh1bmlxdWUgQ1RSSSByZWdpc3RlcmVkIHRyaWFscyBmb3Igd2hpY2ggaW52ZXN0aWdhdG9ycyBhZ3JlZWQgdG8gcGFydGljaXBhdGUgaW4gdGhlIHN0dWR5LiBUaGUgcHJvcG9ydGlvbiBhbmQgdGhlIGJpbm9taWFsIDk1JSBjb25maWRlbmNlIGludGVydmFscyBvZiB0aGUgc2FtZSB3aWxsIGJlIHJlcG9ydGVkLgoKVGhlICoqRURDIHNvcGhpc3RpY2F0aW9uIGxldmVsKiogaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoKLSAgICoqTGV2ZWwgMToqKiBUaGVyZSBpcyBhIHVuaXF1ZSBhY2NvdW50IGFuZCBwYXNzd29yZCBmb3IgZWFjaCB1c2VyIHRvIGFjY2VzcyB0aGUgb25saW5lIHN5c3RlbS4KCi0gICAqKkxldmVsIDI6KiogU2l0ZXMgZW50ZXIgc3ViamVjdCB2aXNpdCBkYXRhIHRocm91Z2ggYSBXZWIgaW50ZXJmYWNlIGludG8gZWxlY3Ryb25pYyBjYXNlIHJlcG9ydCBmb3JtcyAoZUNSRnMpLiBUaGUgY29tcGxldGlvbiBzdGF0dXMgb2YgZWFjaCBlQ1JGIGZvciBlYWNoIHN1YmplY3QgY2FuIGJlIHRyYWNrZWQgYXV0b21hdGljYWxseSBvbmxpbmUuIFRoZSBzeXN0ZW0gcHJvdmlkZXMgYW4gYXVkaXQgdHJhaWwgZm9yIGFsbCBkYXRhIGVudHJ5IGFuZCBkYXRhIG1vZGlmaWNhdGlvbgoKLSAgICoqTGV2ZWwgMzoqKiBEYXRhIHZhbGlkYXRpb24gaGFwcGVucyBhdXRvbWF0aWNhbGx5IHdoZW4gZGF0YSBhcmUgZW50ZXJlZCBpbnRvIHRoZSBlQ1JGLiBUaGUgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBsb2cgdGhlIHVzZXIgb2ZmIGFmdGVyIGEgcGVyaW9kIG9mIGluYWN0aXZpdHkuCgotICAgKipMZXZlbCA0OioqIFN1YmplY3RzIGFyZSByYW5kb21pemVkIGF1dG9tYXRpY2FsbHkKCi0gICAqKkxldmVsIDU6KiogU3ViamVjdCByZWNydWl0bWVudCBjYW4gYmUgdHJhY2tlZCBvbmxpbmUgZm9yIGVhY2ggc2l0ZQoKLSAgICoqTGV2ZWwgNjoqKiBUaGUgc3lzdGVtIGFsbG93cyB0cmFja2luZyBvZiBtZWRpY2F0aW9uIGludmVudG9yeSBhdCB0aGUgc2l0ZXMuCgpGb3IgYSBsZXZlbCB0byBiZSBjb25zaWRlcmVkIGNvbXBsZXRlLCAqKmFsbCB0aGUgcXVlc3Rpb25zKiogc2hvdWxkIGJlIG1hcmtlZCBhcyAqKlllcyoqLiBJZiBvbmUgb2YgdGhlIHF1ZXN0aW9ucyBpcyBtYXJrZWQgYXMgTm8gYW5kIGEgaGlnaGVyIGxldmVsIGlzIG1hcmtlZCBZZXMgdGhlbiB0aGUgKipoaWdoZXIgbGV2ZWwqKiB3aWxsIGJlIHRha2VuLiBGb3IgZWFjaCB1bmlxdWUgdHJpYWwgd2Ugd2lsbCB0aGVyZWZvcmUgY2FsY3VsYXRlIHRoZSBoaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBsZXZlbC4gSWYgRURDIGlzIG5vdCB1c2VkIHRoZW4gc29waGlzdGljYXRpb24gbGV2ZWwgd2lsbCBiZSBtYXJrZWQgYXMgbWlzc2luZy4KCmBgYHtyIENhbGN1bGF0ZSBoaWdoZXN0IEVEQyBTb3BoaXN0aWNhdGlvbiBSYXRlfQpkZiA8LSBkZiAlPiUgCiAgbXV0YXRlKGxldmVsMSA9IGNhc2Vfd2hlbihmZWF0dXJlX2FjY2VzcyA9PSAiWWVzIiB+IDEsIFRSVUUgfiAwKSwKICAgICAgICAgbGV2ZWwyID0gY2FzZV93aGVuKGZlYXR1cmVfZWNyZiA9PSAiWWVzIiAmIGZlYXR1cmVfYXVkaXQgPT0gIlllcyIgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGxldmVsMyA9IGNhc2Vfd2hlbihmZWF0dXJlX3ZhbGlkYXRpb24gPT0gIlllcyIgJiBmZWF0dXJlX3NlY3VyaXR5ID09ICJZZXMiIH4gMSwgVFJVRSB+IDApLAogICAgICAgICBsZXZlbDQgPSBjYXNlX3doZW4oZmVhdHVyZV9yYW5kb21pemUgPT0gIlllcyIgfiAxLCBUUlVFIH4gMCksCiAgICAgICAgIGxldmVsNSA9IGNhc2Vfd2hlbihmZWF0dXJlX3RyYWNraW5nID09ICJZZXMiIH4gMSwgVFJVRSB+IDApLAogICAgICAgICBsZXZlbDYgPSBjYXNlX3doZW4oZmVhdHVyZV9tZWRfaW52ZW50b3J5ID09ICJZZXMiIH4gMSwgVFJVRSB+IDApCiAgICAgICAgICkgJT4lIAogIHNlbGVjdChzZXJpYWwsbGV2ZWwxOmxldmVsNikgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzPS1zZXJpYWwsIG5hbWVzX3RvID0gIkxldmVsIiwgdmFsdWVzX3RvID0gIlN0YXR1cyIpICU+JSAKICBtdXRhdGUoTGV2ZWwgPSBzdHJfcmVtb3ZlKExldmVsLCJsZXZlbCIpKSAlPiUgCiAgbXV0YXRlKExldmVsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoTGV2ZWwpKSkgJT4lIAogIGFycmFuZ2UoLixzZXJpYWwsIExldmVsKSAlPiUgCiAgZmlsdGVyKFN0YXR1cyA9PSAxKSAlPiUgCiAgZ3JvdXBfYnkoc2VyaWFsKSAlPiUgCiAgc3VtbWFyaXNlKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCA9IG1heChMZXZlbCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGxlZnRfam9pbihkZiwuLGJ5PSJzZXJpYWwiKQoKYGBgCgpgYGB7ciBBZGQgZGF0YSBvbiBlYWNoIGluZGl2aWR1YWwgbGV2ZWwgb2YgRURDIFNvcGhpc3RpY2F0aW9ufQpkZiA8LSBkZiAlPiUgCiAgbXV0YXRlKGxldmVsXzEgPSBjYXNlX3doZW4oZmVhdHVyZV9hY2Nlc3MgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF8yID0gY2FzZV93aGVuKGZlYXR1cmVfZWNyZiA9PSAiWWVzIiAmIGZlYXR1cmVfYXVkaXQgPT0gIlllcyIgfiJZZXMiLCBUUlVFIH4gIk5vIiksCiAgICAgICAgIGxldmVsXzMgPSBjYXNlX3doZW4oZmVhdHVyZV92YWxpZGF0aW9uID09ICJZZXMiICYgZmVhdHVyZV9zZWN1cml0eSA9PSAiWWVzIiB+ICJZZXMiLCBUUlVFIH4gIk5vIiksCiAgICAgICAgIGxldmVsXzQgPSBjYXNlX3doZW4oZmVhdHVyZV9yYW5kb21pemUgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF81ID0gY2FzZV93aGVuKGZlYXR1cmVfdHJhY2tpbmcgPT0gIlllcyIgfiAiWWVzIiwgVFJVRSB+ICJObyIpLAogICAgICAgICBsZXZlbF82ID0gY2FzZV93aGVuKGZlYXR1cmVfbWVkX2ludmVudG9yeSA9PSAiWWVzIiB+ICJZZXMiLCBUUlVFIH4gIk5vIikKICAgICAgICAgKSAlPiUgCiAgc2VsZWN0KHNlcmlhbCxsZXZlbF8xOmxldmVsXzYpICU+JSAKICBsZWZ0X2pvaW4oZGYsLixieT0ic2VyaWFsIikKYGBgCgpgYGB7ciBBZGQgZGF0YSBvbiBFREMgQWRvcHRpb24gUmF0ZX0KZGYgPC0gZGYgJT4lIAogIG11dGF0ZShlZGNfYWRvcHRpb24gPSBjYXNlX3doZW4oZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsID4gMSB+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJObyIpKQpgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIEVEQyBhZG9wdGlvbiByYXRlIGFuZCB0aGUgZGlmZmVyZW50IGxldmVscyBpbiB0aGUgdHJpYWxzIGZvciB3aGljaCByZXNwb25zZXMgd2VyZSByZWNlaXZlZCBpbiB0aGUgc3VydmV5LgoKYGBge3J9CmRmICU+JSBzZWxlY3Qoc2VyaWFsLGVkY191c2UsZWRjX2Fkb3B0aW9uLCBsZXZlbF8xOmxldmVsXzYpICU+JSAKICBwaXZvdF9sb25nZXIoY29scz0tc2VyaWFsKSAlPiUgCiAgZ3JvdXBfYnkobmFtZSx2YWx1ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKC4saWRfY29scz1uYW1lLG5hbWVzX2Zyb209dmFsdWUsdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lIAogIG11dGF0ZSh0b3RhbD1ZZXMrTm8pICU+JSAKICBtdXRhdGUocHJvcG9ydGlvbiA9IHJvdW5kKChZZXMvdG90YWwpKjEwMCwxKSkgJT4lIAogIHJvd3dpc2UoKSAlPiUgCiAgbXV0YXRlKGNpX2xvd2VyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbMl0pKjEwMCwxKSwKICAgICAgICAgY2lfdXBwZXIgPSByb3VuZCgoYmluY29uZihZZXMsdG90YWwsbWV0aG9kPSJ3aWxzb24iKVszXSkqMTAwLDEpKSAlPiUgCiAgc2VsZWN0KG5hbWUsdG90YWwsWWVzLHByb3BvcnRpb24sY2lfbG93ZXIsY2lfdXBwZXIpICU+JSAKICBtdXRhdGUobmFtZSA9IHRvdXBwZXIoc3RyX3JlcGxhY2UobmFtZSwiXFxfIiwgIiAiKSkpICU+JSAKICBtdXRhdGUoIkNJIiA9IHBhc3RlKCIoICIsY2lfbG93ZXIsIiAtICIsIGNpX3VwcGVyLCIpIikpICU+JSAKICBzZWxlY3QobmFtZSx0b3RhbCxZZXMscHJvcG9ydGlvbixDSSkgJT4lIAogIHJlbmFtZShWYXJpYWJsZT1uYW1lLFRvdGFsID0gdG90YWwsIFBlcmNlbnRhZ2UgPSBwcm9wb3J0aW9uLCAiOTUlIENJIiA9IENJKSAlPiUgCiAgZmxleHRhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDQgOiBFREMgdXNlIGFuZCBhZG9wdGlvbiByYXRlIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uIGxldmVscyBhbW9uZyByZXNwb25kaW5nIHN0dWRpZXMiKQogIApgYGAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIGJyZWFrZG93biBvZiBrZXkgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIGJ5IEVEQyBhZG9wdGlvbiBzdGF0dXMuIENvbXBhcmlzb24gYmV0d2VlbiBncm91cHMgaGFzIGJlZW4gZG9uZSB1c2luZyBDaGktc3F1YXJlIHRlc3QgZm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBhbmQgV2lsY294IHJhbmsgc3VtIHRlc3QgZm9yIGNvbnRpbnVvdXMgdmFyaWFibGVzLgoKYGBge3IgRURDIEFkb3B0aW9uIGJ5IHRyaWFsIHZhcmlhYmxlc30KCmRmICU+JSAKICBzZWxlY3QoZWRjX2Fkb3B0aW9uLHNwb25zb3JfdHlwZSxpbmR1c3RyeV9mdW5kZWQsdHJpYWxfdHlwZSxwaGFzZV90eXBlLHRyaWFsX2R1cmF0aW9uLHNhbXBsZV9zaXplLHNpdGVzLG11bHRpY2VudHJpYyxuYXRpb25zLGN0dV9hY2Nlc3MpICU+JQogIHRibF9zdW1tYXJ5KGJ5ID0gZWRjX2Fkb3B0aW9uLAogICAgICAgICAgICAgIHR5cGUgPSBsaXN0IChtdWx0aWNlbnRyaWMgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiY2F0ZWdvcmljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdHVfYWNjZXNzIH4gImNhdGVnb3JpY2FsIiksCiAgICAgICAgICAgICAgbGFiZWwgPSBsaXN0KHNwb25zb3JfdHlwZSB+ICJTcG9uc29yIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmR1c3RyeV9mdW5kZWQgfiAiSW5kdXN0cnkgRnVuZGVkIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfdHlwZSB+ICJUeXBlIG9mIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfdHlwZSB+ICJUcmlhbCBQaGFzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWFsX2R1cmF0aW9uIH4gIkR1cmF0aW9uIG9mIFRyaWFsIChEYXlzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9zaXplIH4gIlNhbXBsZSBTaXplIChUb3RhbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlcyB+ICJOdW1iZXIgb2Ygc2l0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNlbnRyaWMgfiAiTXVsdGljZW50cmljIFRyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aW9ucyB+ICJDb3VudHJ5IG9mIFJlY3J1aXRtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyB+ICJBY2Nlc3MgdG8gSW5zdGl0dXRpb25hbCBDVFUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBhZGRfc3RhdCgKICAgIGZucyA9IGxpc3QoYWxsX2NhdGVnb3JpY2FsKCkgfiBjaV9mdW5jdGlvbl9jYXQsCiAgICAgICAgICAgICAgIGFsbF9jb250aW51b3VzKCkgfiBjaV9mdW5jdGlvbl9jb24pLAogICAgbG9jYXRpb24gPSBhbGxfY2F0ZWdvcmljYWwoRkFMU0UpIH4gImxldmVsIgogICkgJT4lIAogIG1vZGlmeV9oZWFkZXIoc3RhcnRzX3dpdGgoImFkZF9zdGF0XyIpIH4gIioqOTUlIENJKioiKSAlPiUKICAjIG1vdmUgY29sdW1ucyB0byBhbGlnbiBDSXMgd2l0aCBjZW50cmFsIGVzdGltYXRlcwogIG1vZGlmeV90YWJsZV9ib2R5KH4ueCAlPiUgcmVsb2NhdGUoYWRkX3N0YXRfMSwgLmFmdGVyID0gc3RhdF8xKSkgJT4lIAogIGFkZF9uKCkgJT4lIAogIGFkZF9wKCkgJT4lIAogIGJvbGRfbGFiZWxzKCkgJT4lIAogIGFkZF9vdmVyYWxsKCkgJT4lIAogIGFzX2ZsZXhfdGFibGUoKSU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA1IDogQ29tcGFyaXNpb24gb2YgdHJpYWwgY2hhcmFjdGVyaXN0aWNzIGJldHdlZW4gdHJpYWxzIHdpdGggYWRvcHRlZCBhbiBFREMgYW5kIHRob3NlIHRoYXQgZGlkIG5vdCIpCgpgYGAKCiMjIEluZmx1ZW5jZSBvZiB0cmlhbCBwYXJhbWV0ZXJzIG9uIEVBUgoKSW5mbHVlbmNlIG9mIHRyaWFsIHBhcmFtZXRlcnMgb24gRUFSCgpUbyBkZXRlcm1pbmUgdGhlIGluZmx1ZW5jZSBvZiB0aGUgdHJpYWwgcGFyYW1ldGVycyBvbiBFQVIsIHdlIHdpbGwgdXNlIGEgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3aGVyZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHdpbGwgYmUgRURDIGFkb3B0aW9uIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uIGxldmVsIDIgb3IgbW9yZSAobW9kZWxlZCBhcyBZZXMgb3IgTm8pLiBJbmRlcGVuZGVudCB2YXJpYWJsZXMgd2lsbCBiZTpcCjEuIFRyaWFsIHNwb25zb3I6IEluZHVzdHJ5IG9yIEludmVzdGlnYXRvci1Jbml0aWF0ZWQuIEluIHN0dWRpZXMgd2hlcmUgdGhlIHByaW1hcnkgc3BvbnNvciBpcyBhIHBoYXJtYWNldXRpY2FsIGNvbXBhbnkgb3IgZGV2aWNlIG1hbnVmYWN0dXJlciwgdGhlIHVzZXIgd2lsbCBiZSBjb25zaWRlcmVkIGluZHVzdHJ5LXNwb25zb3JlZCwgYW5kIHRoZSByZXN0IHdpbGwgYmUgY29uc2lkZXJlZCBpbnZlc3RpZ2F0b3ItaW5pdGlhdGVkLlwKMi4gVHJpYWwgc2FtcGxlIHNpemU6IFRvdGFsIHRyaWFsIHNhbXBsZSBzaXplIHdpbGwgYmUgbW9kZWxlZCBhcyBhIGNvbnRpbnVvdXMgdmFyaWFibGUuIFRvIHJlbGF4IHRoZSBsaW5lYXJpdHkgYXNzdW1wdGlvbiwgdGhpcyB3aWxsIGJlIGV4cGFuZGVkIHVzaW5nIGEgcmVzdHJpY3RlZCBjdWJpYyBzcGxpbmUgd2l0aCAzIGtub3RzLlwKMy4gVHJpYWwgc2l0ZXM6IFRoZSBudW1iZXIgb2Ygc2l0ZXMgd2lsbCBhbHNvIGJlIG1vZGVsZWQgYXMgYSBjb250aW51b3VzIHZhcmlhYmxlLiBBZ2FpbiB0byByZWxheCB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb25zLCB0aGUgbW9kZWwgdGVybSB3aWxsIGJlIGV4cGFuZGVkIHVzaW5nIGEgcmVzdHJpY3RlZCBjdWJpYyBzcGxpbmUgd2l0aCB0aHJlZSBrbm90cy4KCkludGVyYWN0aW9ucyB3aWxsIGJlIHRlc3RpbmcgaW4gYW4gb21uaWJ1cyBtb2RlbCBjb250YWluaW5nIGFsbCBpbnRlcmFjdGlvbiB0ZXJtcy4gV2FsZCB0ZXN0IHdpbGwgYmUgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHNpZ25pZmljYW5jZSBvZiBhbnkgaW50ZXJhY3Rpb24uIE9kZHMgcmF0aW9zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdpbGwgYmUgcmVwb3J0ZWQuCgpgYGB7cn0KZGQgPC0gZGF0YWRpc3QoZGYpCm9wdGlvbnMoZGF0YWRpc3Q9ImRkIikKbW9kZWwxIDwtIGxybShlZGNfYWRvcHRpb25+cmNzKHNhbXBsZV9zaXplLDMpKihzaXRlcytpbmR1c3RyeV9mdW5kZWQpLGRhdGE9ZGYseCA9IFQseT1ULGxpbmVhci5wcmVkaWN0b3JzID0gVCkKYW5vdmEobW9kZWwxKQpgYGAKCkFzIHRoZSByZXN1bHRzIG9mIHRoZSBhYm92ZSBBTk9WQSBzaG93LCB0aGUgV2FsZCB0ZXN0IGZvciBub24tbGluZWFyIHRlcm1zIGFzIHdlbGwgYXMgaW50ZXJhY3Rpb25zIGlzIG5vdCBzaWduaWZpY2FudC4gSGVuY2Ugd2Ugc2hvdyB0aGUgc2ltcGxpZmllZCBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtcyBhcyB3ZWxsIGFzIHdpdGhvdXQgdGhlIG5vbi1saW5lYXIgYXNzdW1wdGlvbi4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBsb2dpc3RpYyByZWdyZXNzaW9uIGFuYWx5c2lzLgoKYGBge3J9CmRmIDwtIGRmICU+JSBtdXRhdGUoZWRjX2Fkb3B0aW9uID0gYXMuZmFjdG9yKGVkY19hZG9wdGlvbikpIAptb2RlbDEgPC0gZ2xtKGVkY19hZG9wdGlvbn5zYW1wbGVfc2l6ZStzaXRlcytpbmR1c3RyeV9mdW5kZWQsZGF0YT1kZiwgZmFtaWx5PWJpbm9taWFsKQp0YmxfcmVncmVzc2lvbihtb2RlbDEsZXhwb25lbnRpYXRlID0gVCxpbnRlcmNlcHQ9VCkgJT4lIAogIGFkZF9uZXZlbnQoKSAlPiUgCiAgYWRkX24oKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA2IDogTXVsdGl2YXJpYWJsZSBhbmFseXNpcyBvZiBmYWN0b3JzIGluZmx1ZW5jaW5nIEVEQyB1c2UiKQpgYGAKCiMjIEVEQyBTb3BoaXN0aWNhdGlvbiBMZXZlbAoKV2Ugd2lsbCBwcm92aWRlIGRhdGEgb24gdGhlIG1lZGlhbiBFREMgc29waGlzdGljYXRpb24gbGV2ZWxzIGFzIHdlbGwgYXMgYSBwbG90IHNob3dpbmcgdGhlIHByb3BvcnRpb24gb2YgQ1RSSSByZWdpc3RlcmVkIHRyaWFscyB3aXRoIGRpZmZlcmVudCBsZXZlbHMgb2YgRURDIHNvcGhpc3RpY2F0aW9uLiBGdXJ0aGVyIHZpc3VhbGl6YXRpb24gYW5kIGFuYWx5c2lzIHdpbGwgYWxzbyBleHBsb3JlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRyaWFsIHNhbXBsZSBzaXplLCBudW1iZXIgb2YgdHJpYWwgc2l0ZXMsIGFuZCB0eXBlIG9mIHRyaWFsIHNwb25zb3JzaGlwIHdpdGggRURDIHNvcGhpc3RpY2F0aW9uLgoKYGBge3J9CmRmICU+JSBzZWxlY3QoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgcmVuYW1lKCJIaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBMZXZlbCIgPSBlZGNfc29waGlzdGljYXRpb25fbGV2ZWwpICU+JSAKICB0Ymxfc3VtbWFyeSgpICU+JQogIGFzX2ZsZXhfdGFibGUoKSAlPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgNyA6IEhpZ2hlc3QgbGV2ZWwgb2YgRURDIHNvcGhpc3RpY2F0aW9uIikKCmRmICU+JSBzZWxlY3QoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgZ3JvdXBfYnkoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lIAogIGZpbHRlcighaXMubmEoZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSkgJT4lIAogIG11dGF0ZShlZGNfc29waGlzdGljYXRpb25fbGV2ZWw9YXMuZmFjdG9yKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeD1lZGNfc29waGlzdGljYXRpb25fbGV2ZWwseT1jb3VudCkpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrZ2VvbV9sYWJlbChhZXMobGFiZWw9Y291bnQpKSArIGxhYnModGl0bGU9IkZpZ3VyZSAxOiBIaWdoZXN0IEVEQyBzb3BoaXN0aWNhdGlvbiBMZXZlbCIseD0iRURDIFNvcGhpc3RpY2F0aW9uIExldmVsIix5PSJOdW1iZXIgb2YgVHJpYWxzIikgCgoKYGBgCgpJbiB0aGUgZm9sbG93aW5nIHRhYmxlIHdlIHdpbGwgc2hvdyB0aGUgdW5pdmFyaWFibGUgYW5hbHlzaXMgb2YgdGhlIGZhY3RvcnMgd2hpY2ggaW5mbHVlbmNlZCBFREMgc29waGlzdGljYXRpb24gbGV2ZWwuIFdlIHdpbGwgZGljaG90b21pemUgdGhlIGxldmVsIGludG8gdHdvIGNhdGVnb3JpZXMgKHNjb3JlIDYgb3Igc2NvcmUgMS01KS4KCmBgYHtyfQpkZiAlPiUgCiAgc2VsZWN0KGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCxzcG9uc29yX3R5cGUsaW5kdXN0cnlfZnVuZGVkLHRyaWFsX3R5cGUscGhhc2VfdHlwZSx0cmlhbF9kdXJhdGlvbixzYW1wbGVfc2l6ZSxzaXRlcyxuYXRpb25zLG11bHRpY2VudHJpYyxjdHVfYWNjZXNzKSAlPiUgCiAgbXV0YXRlKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbF90eXBlID0gY2FzZV93aGVuKGVkY19zb3BoaXN0aWNhdGlvbl9sZXZlbCA9PSA2IH4gIkxldmVsIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGNfc29waGlzdGljYXRpb25fbGV2ZWwgPDYgfiAiTGV2ZWwgMSAtIDUiKSkgJT4lIAogIHNlbGVjdCgtZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsKSAlPiUgCiAgdGJsX3N1bW1hcnkoYnk9ZWRjX3NvcGhpc3RpY2F0aW9uX2xldmVsX3R5cGUsCiAgICAgICAgICAgICAgdHlwZSA9IGxpc3QgKG11bHRpY2VudHJpYyB+ICJjYXRlZ29yaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJjYXRlZ29yaWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0dV9hY2Nlc3MgfiAiY2F0ZWdvcmljYWwiKSwKICAgICAgICAgICAgICBsYWJlbCA9IGxpc3Qoc3BvbnNvcl90eXBlIH4gIlNwb25zb3IgVHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZHVzdHJ5X2Z1bmRlZCB+ICJJbmR1c3RyeSBGdW5kZWQgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlhbF90eXBlIH4gIlR5cGUgb2YgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV90eXBlIH4gIlRyaWFsIFBoYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfZHVyYXRpb24gfiAiRHVyYXRpb24gb2YgVHJpYWwgKERheXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgfiAiU2FtcGxlIFNpemUgKFRvdGFsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzIH4gIk51bWJlciBvZiBzaXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2VudHJpYyB+ICJNdWx0aWNlbnRyaWMgVHJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpb25zIH4gIkNvdW50cnkgb2YgUmVjcnVpdG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdHVfYWNjZXNzIH4gIkFjY2VzcyB0byBJbnN0aXR1dGlvbmFsIENUVSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGFkZF9wKCkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSA4IDogVW5pdmFyaWF0ZSBhbmFseXNpcyBvZiBmYWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBFREMgc29waGlzdGljYXRpb24gbGV2ZWwiKQpgYGAKCiMjIEVBUiBUaW1lIHRyZW5kcwoKRm9yIHVuaXF1ZSByZXNwb25kaW5nIENUUkkgcmVnaXN0ZXJlZCB0cmlhbHMsIHdlIHdpbGwgY3JlYXRlIGEgc3Vic2V0IGNvbnRhaW5pbmcgdHJpYWxzIHJlZ2lzdGVyZWQgb24gb3IgYWZ0ZXIgMXN0IEphbnVhcnkgMjAxMC4gRnJvbSB0aGlzIHN1YnNldCwgd2Ugd2lsbCB0aGVuIGFnZ3JlZ2F0ZSB0aGUgRUFSIGZvciBlYWNoIHllYXIgYmFzZWQgb24gdGhlIG1ldGhvZG9sb2d5IGZvciBjYWxjdWxhdGluZyBFQVIgYXMgYWJvdmUuIFRoaXMgd2lsbCBiZSBncmFwaGljYWxseSBkZW1vbnN0cmF0ZWQgdXNpbmcgYSBiYXIgcGxvdCBvciBhIGRvdCBwbG90IHdpdGggYSBiYXIgZm9yIGVhY2ggeWVhci4gTm90ZSB0aGF0IGFzIGVhY2ggdHJpYWwgaXMgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcnMsIHdlIHdpbGwgbm90IHVzZSBhIGxpbmUgcGxvdCBmb3IgdGhlIHZpc3VhbGl6YXRpb24uIEVBUiB3aWxsIGJlIGNvbXBhcmVkIGJldHdlZW4gdHdvIHRpbWUgcGVyaW9kczogcGVyaW9kIDEgZnJvbSAxc3QgSmFudWFyeSAyMDE1IHRvIDMxc3QgRGVjZW1iZXIgMjAxOSBhbmQgcGVyaW9kIDIgZnJvbSAxc3QgSmFudWFyeSAyMDEwIHRvIDMxc3QgRGVjZW1iZXIgMjAxNC4gR2l2ZW4gdGhhdCBtb3N0IHJhbmRvbWl6ZWQgdHJpYWxzIHdpbGwgYmUgY29tcGxldGVkIGJ5IDEwIHllYXJzLCB3ZSBleHBlY3QgdG8gaGF2ZSBmZXcgb3BlbiBjbGluaWNhbCB0cmlhbHMgYXZhaWxhYmxlIGZvciBhbmFseXNpcyB0aGF0IHdhcyByZWdpc3RlcmVkIGJlZm9yZSAyMDEwLiBIb3dldmVyLCBpZiBtb3JlIHRoYW4gMzAgdHJpYWxzIGFyZSBhdmFpbGFibGUsIHdlIHdpbGwgYWxzbyBhbmFseXplIGFuIGVhcmxpZXIgdGltZSBwb2ludCwgaS5lLiwgYmV0d2VlbiAxc3QgSmFudWFyeSAyMDA1IGFuZCAzMXN0IERlY2VtYmVyIDIwMDkuCgpgYGB7cn0KZGYgJT4lIHNlbGVjdChzZXJpYWwsZGF0ZV9yZWdpc3RlcmVkLGVkY19hZG9wdGlvbikgJT4lIAogIG11dGF0ZShkYXRlX3JlZ2lzdGVyZWQgPSBkbXkoZGF0ZV9yZWdpc3RlcmVkKSkgJT4lIAogIG11dGF0ZShyZWdfcGVyaW9kID0gY2FzZV93aGVuKGRhdGVfcmVnaXN0ZXJlZCA8PSAiMjAwOS0xMi0zMSIgfiAiUHJlIDIwMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfcmVnaXN0ZXJlZCA+PSAiMjAxMC0wMS0wMSIgJiBkYXRlX3JlZ2lzdGVyZWQgPD0gIjIwMTQtMTItMzEiIH4gIlBlcmlvZCAyICgyMDEwIC0gMjAxNCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfcmVnaXN0ZXJlZCA+PSAiMjAxNS0wMS0wMSIgJiBkYXRlX3JlZ2lzdGVyZWQgPD0gIjIwMTktMTItMzEiIH4gIlBlcmlvZCAxICgyMDE1IC0gMjAxOSkiKSkgJT4lIAogIHNlbGVjdChlZGNfYWRvcHRpb24scmVnX3BlcmlvZCkgJT4lIAogIHRibF9zdW1tYXJ5KGJ5PXJlZ19wZXJpb2QpICU+JSAKICBhc19mbGV4X3RhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDkgOiBFQVIgYWNyb3NzIHRpbWUgcGVyaW9kIikKCgpkZiAlPiUgc2VsZWN0KGVkY19hZG9wdGlvbixkYXRlX3JlZ2lzdGVyZWQpICU+JQogIG11dGF0ZSh5ZWFyX3JlZ2lzdGVyZWQgPSB5ZWFyKGRteShkYXRlX3JlZ2lzdGVyZWQpKSkgJT4lIAogIHNlbGVjdCh5ZWFyX3JlZ2lzdGVyZWQsZWRjX2Fkb3B0aW9uKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcl9yZWdpc3RlcmVkLGVkY19hZG9wdGlvbikgJT4lIAogIHN1bW1hcmlzZShjb3VudD0gbigpKSAlPiUgCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IHllYXJfcmVnaXN0ZXJlZCwgbmFtZXNfZnJvbSA9IGVkY19hZG9wdGlvbiwgdmFsdWVzX2Zyb209Y291bnQsdmFsdWVzX2ZpbGwgPSAwKSAlPiUgCiAgbXV0YXRlKHRvdGFsID0gWWVzK05vKSAlPiUgCiAgbXV0YXRlKGVhciA9IHJvdW5kKChZZXMvdG90YWwpKjEwMCwxKSkgJT4lIAogIG11dGF0ZShjaV9sb3dlciA9IHJvdW5kKChiaW5jb25mKFllcyx0b3RhbCxtZXRob2Q9IndpbHNvbiIpWzJdKSoxMDAsMSksCiAgICAgICAgIGNpX3VwcGVyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbM10pKjEwMCwxKSkgJT4lIAogIGZpbHRlcihZZXM+MSkgJT4lIAogIG11dGF0ZSh5ZWFyX3JlZ2lzdGVyZWQ9YXMuZmFjdG9yKHllYXJfcmVnaXN0ZXJlZCkpICU+JSAKICBnZ3Bsb3QoLixhZXMoeD15ZWFyX3JlZ2lzdGVyZWQseT1lYXIpKStnZW9tX3BvaW50KCkgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4PWNpX3VwcGVyLHltaW49Y2lfbG93ZXIpKStnZW9tX2xhYmVsKGFlcyhsYWJlbD1lYXIpKSsKICBnZ3RpdGxlKCJGaWd1cmUgMjogVGltZSBUcmVuZCBvZiBFREMgQWRvcHRpb24gcmF0ZSIpICsgeGxhYigiWWVhciIpICsgeWxhYigiRURDIEFkb3B0aW9uIFJhdGUgKCUpIikKYGBgCgojIEFkZGl0aW9uYWwgQW5hbHlzZXMKCkFkZGl0aW9uYWxseSB0aGUgc3VydmV5IGNvbGxlY3RlZCBkYXRhIG9uIGFsdGVybmF0aXZlIG1ldGhvZHMgZm9yIGRhdGEgY29sbGVjdGlvbiB1c2VkIGluIHRoZSB0cmlhbCBhcyB3ZWxsIGEgc2luZ2xlIGl0ZW0gcXVlc3Rpb24gb24gdGhlIGtleSBwZXJjZWl2ZWQgYmFycmllcnMgdG93YXJkcyBhZG9wdGlvbiBvZiBFREMgaW4gdGhlaXIgdHJpYWwuCgpgYGB7cn0KZGYgJT4lICBmaWx0ZXIoZWRjX3VzZT09Ik5vIikgJT4lIAogIHNlbGVjdChub19lZGNfX3NwcmVhZHNoZWV0LG5vX2VkY19fbWFpbCxub19lZGNfX2ZheCkgJT4lIAogIHJlbmFtZSgiU3ByZWFkc2hlZXQiID0gbm9fZWRjX19zcHJlYWRzaGVldCwKICAgICAgICAgIkRhdGEgc2VudCBieSBFbWFpbCIgPSBub19lZGNfX21haWwsCiAgICAgICAgICJEYXRhIHNlbnQgYnkgRmF4IiA9IG5vX2VkY19fZmF4CiAgICAgICAgICkgJT4lIAogIHRibF9zdW1tYXJ5KCkgJT4lIAogIGFkZF9uKCkgJT4lIAogIGJvbGRfbGFiZWxzKCkgJT4lIAogIGFzX2ZsZXhfdGFibGUoKSU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSAxMCA6IERhdGEgY29sbGVjdGlvbiBtZXRob2RzIHVzZWQgd2hlbiBFREMgd2FzIG5vdCB1c2VkIikKYGBgCgpgYGB7cn0KZGYgJT4lCiAgZmlsdGVyKGVkY191c2U9PSJObyIpICU+JSAKICBzZWxlY3Qod2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fQ29tcGxleC5yZWd1bGF0b3J5LnJlcXVpcmVtZW50cywKICAgICAgICAgICAgICB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLnRlY2huaWNhbC5zdXBwb3J0LAogICAgICAgICAgICAgIHdoaWNoX29mX3RoZV9mb2xsb3dpbmdfd2VyZV90aGVfaW1wb3J0YW50X2JhcnJpZXJfdG9faW1wbGVtZW50YXRfX0Nvc3RseS5Tb2Z0d2FyZSwKICAgICAgICAgICAgICB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLm1vdGl2YXRpb24uYW1vbmcuY2xpbmljYWwudHJpYWwuc3RhZmYsCiAgICAgICAgICAgICAgd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fTGFjay5vZi51c2VyLmZyaWVuZGx5LnNvZnR3YXJlKSAlPiUgCiAgbXV0YXRlKGFjcm9zcyhzdGFydHNfd2l0aCgid2hpY2hfb2YiKSx+Y2FzZV93aGVuKC49PSJYIiB+ICJZZXMiLFRSVUV+Ik5vIikpKSAlPiUgIAogIHJlbmFtZSgiQ29tcGxleCBSZWd1bGF0b3J5IFJlcXVpcmVtZW50cyIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19Db21wbGV4LnJlZ3VsYXRvcnkucmVxdWlyZW1lbnRzLAogICAgICAgICAiTGFjayBvZiBUZWNobmljYWwgU3VwcG9ydCIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLnRlY2huaWNhbC5zdXBwb3J0LAogICAgICAgICAiU29mdHdhcmUgQ29zdCIgPSAgd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fQ29zdGx5LlNvZnR3YXJlLAogICAgICAgICAiQ1RVIFN0YWZmIE1vdGl2YXRpb24gdG8gaW1wbGVtZW50IEVEQyIgPSB3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19MYWNrLm9mLm1vdGl2YXRpb24uYW1vbmcuY2xpbmljYWwudHJpYWwuc3RhZmYsCiAgICAgICAgICJMYWNrIG9mIHVzZXIgZnJpZW5kbHkgU29mdHdhcmUiID0gd2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fTGFjay5vZi51c2VyLmZyaWVuZGx5LnNvZnR3YXJlKSAlPiUKICBwaXZvdF9sb25nZXIoY29scz1jKDE6NSksbmFtZXNfdG8gPSAiUmVhc29uIikgJT4lIAogIGdyb3VwX2J5KFJlYXNvbix2YWx1ZSkgJT4lIAogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAKICBwaXZvdF93aWRlcihpZF9jb2xzID0gUmVhc29uLCBuYW1lc19mcm9tPXZhbHVlLHZhbHVlc19mcm9tPWNvdW50KSAlPiUgCiAgbXV0YXRlKHRvdGFsID0gTm8rWWVzLAogICAgICAgICBwZXJjZW50ID0gcm91bmQoKFllcy90b3RhbCkqMTAwLDEpKSAlPiUgCiAgbXV0YXRlKGNpX2xvd2VyID0gcm91bmQoKGJpbmNvbmYoWWVzLHRvdGFsLG1ldGhvZD0id2lsc29uIilbMl0pKjEwMCwxKSwKICAgICAgICAgY2lfdXBwZXIgPSByb3VuZCgoYmluY29uZihZZXMsdG90YWwsbWV0aG9kPSJ3aWxzb24iKVszXSkqMTAwLDEpKSAlPiUgCiAgc2VsZWN0KFJlYXNvbix0b3RhbCxZZXMscGVyY2VudCxjaV9sb3dlcixjaV91cHBlcikgJT4lIAogIG11dGF0ZSgiQ0kiID0gcGFzdGUoIiggIixjaV9sb3dlciwiIC0gIiwgY2lfdXBwZXIsIikiKSkgJT4lIAogIHNlbGVjdChSZWFzb24sdG90YWwsWWVzLHBlcmNlbnQsQ0kpICU+JSAKICBhcnJhbmdlKC1wZXJjZW50KSAlPiUgCiAgcmVuYW1lKFRvdGFsID0gdG90YWwsIFBlcmNlbnRhZ2UgPSBwZXJjZW50LCAiOTUlIENJIiA9IENJKSAlPiUgCiAgZmxleHRhYmxlKCklPiUgCiAgc2V0X2NhcHRpb24oLiwiVGFibGUgMTEgOiBSZWFzb24gZm9yIG5vdCB1c2luZyBFREMiKQogIAoKYGBgCgpPdGhlciByZWFzb25zIGlkZW50aWZpZWQgZm9yIG5vdCB1c2luZyBFREMgd2VyZToKCmBgYHtyfQpkZiAlPiUKICBmaWx0ZXIoZWRjX3VzZT09Ik5vIikgJT4lIAogIGZpbHRlcih3aGljaF9vZl90aGVfZm9sbG93aW5nX3dlcmVfdGhlX2ltcG9ydGFudF9iYXJyaWVyX3RvX2ltcGxlbWVudGF0X19PdGhlciE9IiIpICU+JSAKICBzZWxlY3Qod2hpY2hfb2ZfdGhlX2ZvbGxvd2luZ193ZXJlX3RoZV9pbXBvcnRhbnRfYmFycmllcl90b19pbXBsZW1lbnRhdF9fT3RoZXIpICU+JSAKICBkaXN0aW5jdCguKSAlPiUgCiAgcmVuYW1lKCJSZWFzb25zIiA9IHdoaWNoX29mX3RoZV9mb2xsb3dpbmdfd2VyZV90aGVfaW1wb3J0YW50X2JhcnJpZXJfdG9faW1wbGVtZW50YXRfX090aGVyKSAlPiUgCiAgZmxleHRhYmxlKCkgJT4lIAogIHNldF9jYXB0aW9uKC4sIlRhYmxlIDEyIDogRnJlZSB0ZXh0IHJlc3BvbnNlcyB0byByZWFzb25zIGZvciBub3QgdXNpbmcgRURDIGluIHRyaWFsIikKYGBgCgpGaW5hbGx5IHR3byBhZGRpdGlvbmFsIHF1ZXN0aW9ucyB3ZXJlIGFza2VkIGFib3V0IHRoZSB0cmlhbCBjZW50ZXIgd2VhdGhlciB0aGV5IGhhZCBhY2Nlc3MgdG8gYSBDVFUgYW5kIGFuIElSQi4gV2Ugd2lsbCBldmFsdWF0ZSB0aGUgZGF0YSBpbiByZWxhdGlvbiB0byBFREMgdXNlLgoKYGBge3J9CmRmICU+JSAKICBtdXRhdGUocmVzb3VyY2UgPSBjYXNlX3doZW4oY3R1X2FjY2VzcyA9PSAiWWVzIiAmIGlyYiA9PSAiWWVzIiB+ICJCb3RoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyA9PSAiWWVzIiAmIGlyYiA9PSAiTm8iIH4gIk9ubHkgQ1RVIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R1X2FjY2VzcyA9PSAiTm8iICYgaXJiID09ICJZZW8iIH4gIk9ubHkgSVJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJOb25lIikpICU+JSAKICBzZWxlY3QoZWRjX2Fkb3B0aW9uLHJlc291cmNlKSAlPiUgCiAgdGJsX3N1bW1hcnkoYnk9ZWRjX2Fkb3B0aW9uKSAlPiUgCiAgYWRkX24oKSAlPiUgCiAgYm9sZF9sYWJlbHMoKSAlPiUgCiAgYWRkX3AoKSAlPiUgCiAgYXNfZmxleF90YWJsZSgpICU+JSAKICBzZXRfY2FwdGlvbiguLCJUYWJsZSAxMyA6IEVEQyBhZG9wdGlvbiBieSBDVFUgYW5kIElSQiBhdmFpbGFiaWxpdHkiKQoKYGBgCgoKIyBJbmR1c3RyeSBTcG9uc29yZWQgdHJpYWxzCgpUaGUgcGVyY2VudGFnZSBvZiBpbmR1c3RyeSBzcG9uc29yZWQgdHJpYWxzIGJ5IGVhY2ggeWVhciBvZiByZWdpc3RyYXRpb24gaXMgc2hvd24gaW4gdGhlIGZpZ3VyZSBiZWxvdy4gCgoKYGBge3J9CnRyaWFsX2RldGFpbHMgJT4lIAogIHNlbGVjdChzcG9uc29yX3R5cGUsZGF0ZV9yZWdpc3RlcmVkKSAlPiUKICBtdXRhdGUoZGF0ZV9yZWdpc3RlcmVkID0gZG15KGRhdGVfcmVnaXN0ZXJlZCkpICU+JSAKICBtdXRhdGUoeWVhciA9IHllYXIoZGF0ZV9yZWdpc3RlcmVkKSkgJT4lIAogIGdyb3VwX2J5KHllYXIsc3BvbnNvcl90eXBlKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X3dpZGVyKGlkX2NvbHM9eWVhcixuYW1lc19mcm9tID0gc3BvbnNvcl90eXBlLHZhbHVlc19mcm9tID0gbikgJT4lCiAgcm93d2lzZSgpICU+JSAKICBtdXRhdGUodG90YWwgPSBzdW0oT3RoZXIsSW5kdXN0cnksSW5zdGl0dXRpb25hbCxHb3Zlcm5tZW50YWwsbmEucm09VCkpICU+JSAKICBtdXRhdGUoaW5kdXN0cnlfcHJvcCA9IHJvdW5kKEluZHVzdHJ5L3RvdGFsKjEwMCwxKSkgJT4lIAogIGZpbHRlcighaXMubmEoeWVhcikpICU+JSAKICBmaWx0ZXIoIWlzLm5hKGluZHVzdHJ5X3Byb3ApKSAlPiUgCiAgbXV0YXRlKHllYXIgPSBhcy5mYWN0b3IoeWVhcikpICU+JSAKICBnZ3Bsb3QoLixhZXMoeT1pbmR1c3RyeV9wcm9wLHg9eWVhcikpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IixmaWxsPSJzdGVlbGJsdWUiKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPWluZHVzdHJ5X3Byb3ApLHZqdXN0ID0gMS42LCBjb2xvcj0id2hpdGUiKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh4ID0gIlllYXIgb2YgVHJpYWwgUmVnaXN0cmF0aW9uIiwgeSA9ICJQZXJjZW50YWdlIG9mIEluZHVzdHJ5IFNwb25zb3JlZCBUcmlhbHMiLCB0aXRsZSA9ICJGaWd1cmUgMzogWWVhciB3aXNlIGNoYW5nZSBpbiBwZXJjZW50YWdlIG9mIEluZHVzdHJ5IHNwb25zb3JlZCB0cmlhbHMiKQpgYGAKCgoKIyBQYWNrYWdlcyB1c2VkCgoxLiAgUiA6IFIgQ29yZSBUZWFtICgyMDIwKS4gUjogQSBsYW5ndWFnZSBhbmQgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZy4gUiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmcsIFZpZW5uYSwgQXVzdHJpYS4gVVJMIDxodHRwczovL3d3dy5SLXByb2plY3Qub3JnLy4+CgoyLiAgVGlkeXZlcnNlIDogV2lja2hhbSBldCBhbC4sICgyMDE5KS4gV2VsY29tZSB0byB0aGUgdGlkeXZlcnNlLiBKb3VybmFsIG9mIE9wZW4gU291cmNlIFNvZnR3YXJlLCA0KDQzKSwgMTY4NiwgPGh0dHBzOi8vZG9pLm9yZy8xMC4yMTEwNS9qb3NzLjAxNjg2PgoKMy4gIGd0c3VtbWFyeSA6IERhbmllbCBELiBTam9iZXJnLCBNaWNoYWVsIEN1cnJ5LCBNYXJnaWUgSGFubnVtLCBKb3NlcGggTGFybWFyYW5nZSwgS2FyaXNzYSBXaGl0aW5nIGFuZCBFbWlseSBDLiBaYWJvciAoMjAyMSkuIGd0c3VtbWFyeTogUHJlc2VudGF0aW9uLVJlYWR5IERhdGEgU3VtbWFyeSBhbmQgQW5hbHl0aWMgUmVzdWx0IFRhYmxlcy4gW1w8aHR0cHM6Ly9naXRodWIuY29tL2Rkc2pvYmVyZy9ndHN1bW1hcnlcPixdKGh0dHBzOi8vZ2l0aHViLmNvbS9kZHNqb2JlcmcvZ3RzdW1tYXJ5LCkgPGh0dHA6Ly93d3cuZGFuaWVsZHNqb2JlcmcuY29tL2d0c3VtbWFyeS8uPgoKNC4gIEhtaXNjIDogRnJhbmsgRSBIYXJyZWxsIEpyLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBDaGFybGVzIER1cG9udCBhbmQgbWFueSBvdGhlcnMuICgyMDIxKS4gSG1pc2M6IEhhcnJlbGwgTWlzY2VsbGFuZW91cy4gPGh0dHBzOi8vaGJpb3N0YXQub3JnL1IvSG1pc2MvLD4gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJyZWxmZS9IbWlzYy8+Cgo1LiAgZmxleHRhYmxlIDogZmxleHRhYmxlOiBGdW5jdGlvbnMgZm9yIFRhYnVsYXIgUmVwb3J0aW5nLiA8aHR0cHM6Ly9hcmRhdGEtZnIuZ2l0aHViLmlvL2ZsZXh0YWJsZS1ib29rLyw+IDxodHRwczovL2RhdmlkZ29oZWwuZ2l0aHViLmlvL2ZsZXh0YWJsZS8uPgoKNi4gIHJtcyA6IEZyYW5rIEUgSGFycmVsbCBKciAoMjAyMSkuIHJtczogUmVncmVzc2lvbiBNb2RlbGluZyBTdHJhdGVnaWVzLiA8aHR0cHM6Ly9oYmlvc3RhdC5vcmcvUi9ybXMvLD4gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYXJyZWxmZS9ybXMuPgoKNy4gIGdncGxvdDI6IEguIFdpY2toYW0uIGdncGxvdDI6IEVsZWdhbnQgR3JhcGhpY3MgZm9yIERhdGEgQW5hbHlzaXMuIFNwcmluZ2VyLVZlcmxhZyBOZXcgWW9yaywgMjAxNi4KCjguICBMdWJyaWRhdGU6IEdhcnJldHQgR3JvbGVtdW5kLCBIYWRsZXkgV2lja2hhbSAoMjAxMSkuIERhdGVzIGFuZCBUaW1lcyBNYWRlIEVhc3kgd2l0aCBsdWJyaWRhdGUuIEpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUsIDQwKDMpLCAxLTI1LiBVUkwgPGh0dHBzOi8vd3d3LmpzdGF0c29mdC5vcmcvdjQwL2kwMy8uPgo=