BY JOSEPH RICAFORT

If you haven’t taken the quiz yet, know which DVS persona are you by taking the quiz here.

The DVS community is a diverse community made up of dataviz practicioners from different demographics and experiences. Have you ever wondered what could be the different possible personas that are made up of this community and which of these personas do you identify yourself the closest to?

Let’s look at the 4 different indicators and mix & match them to create different personas of what the DVS population are made out of.

The 16 DVS personas Cartoon Vectors by Vecteezy

Disclaimer: The naming or alias for every persona (e.g. The Analyst Intern, The Journalist, etc..) were inferred from the data as close as possible but might not truly represent and characterize the majority of those subgroups. It is also a means to easily identify the subgroups with this naming convention.

Among 2,165 survey respondents, 1,288 have provided all of the 4 major indicators and have answered at least one of the 4 additional indicators.

4 major indicators:

4 additional indicators:

If you want to read first the full methodology on how the classifications were done or how the numbers were crunched, see the Methodology and the 4 Major Indicators Comparison.

The 16 DVS Personas

Mix and matching these 4 major indicators, 16 unique personas were created. This is somewhat inspired from Myers-Briggs Type Indicator (MBTI) but with a DVS twist!

Percentage distribution of the 16 DVS personas

25% of the DVS community is a Junior-Analytical-Humblypaid-Associate, the most common among all personas. It is then followed by a Senior-Analytical-Humblypaid-Associate.

Meanwhile a Junior-Creative-Wellpaid-Independent is the rarest persona which is just 0.5% of the DVS members. Imagine a dataviz practitioner who has less than 6 years experience with more than USD80,000 annual salary who is either a freelance or a part-time student. They seem to be like prodigy, free spirited, fast-learning entrepreneurs doing things their way and being paid really well.

The Preference and Character of Each Persona (4 Additional indicators)

4 variables from the survey data were chosen to see what distinct character each of the persona inhibit. These are:

The 4 additional indicators:

Which tools each persona more likely use?

Let’s look at how each persona has more prefered tools than the others.

Observations

  • Among the junior-analyticals, the humblypaids’ use excel as top tool while the wellpaids’ use Tableau. Does this imply that Tableau is for the well-offs among the junior analyticals?
  • Humblypaid creatives proudly shows their affinity for illustrator and it’s just so obvious with the charts.
  • Unanimously, any persona seems to use Excel as their top tool for DV.
  • Junior creative independents tend to use R as either 2nd or 3rd tool.
  • Creative-Wellpaid-Associates are D3.js power users! Who said creatives can’t code?
  • Looks so obvious that Illustrator is a creative’s bestfriend, except for a creative-wellpaid-independent which a Junior would prefer Pen & paper and Senior uhm… Excel? strange.

How common each persona per industry?

Different personas were dispersed in different industries asymmetrically. This visual tool could be beneficial if you are eyeing for a specific persona you want to be in. A rare persona in that industry could either indicate whether it has a difficult prerequisites which makes these persona quite rare.

Observations

  • Junior-Analytical-Humblypaid-Associate seems to visually occupy a lot of the bars followed by Senior-Analytical-Wellpaid-Associate. These two personas earlier were ranked as the first and second most common personas.
  • Almost 50% of the Senior-Analytical-Humblypaid-Associates identified themselves coming from the Academe.
  • If you want to be a creative but want to earn a lot of money, you should be in the IT Industry, said by a Creative-Wellpaid.
  • Most of those in the Journalism industry are either Junior-Creative-Humblypaid

What frustrates each persona the most?

Top 7 frustrations were picked among the 13 in the survey. These were encoded in the charts as:

  • Time: Lack of time
  • Design: Lack of design expertise
  • Data Access: Accessing data
  • Data Literacy: Low data literacy
  • Respect DV: Not enough respect for dataviz
  • Tech tools limit: Technical limitations of the tools
  • Non-viz activity: Too much effort spent on non-viz activity

Observations

  • Junior-analyticals looks unanimous in their frustrations, the lask of design expertise. For junior-analytical-wellpaid-hobbyist, it is their second frustration to lack of time.
  • Junior-creatives’ top frustration seems to be the lack of time. It is third for humblypaid-associates and wellpaid-hobbyists where their top frustrations is in the lack of technical skills.
  • Junior-creative-wellpaid-independents, which is the rarest tribe, mention that a lack of tech skillw (1st) and lacking mentorship (2nd) are their main frustrations.
  • Senior analyticals are unaninous with the lack of time as their top frustrations along with creatives humblypaid-independents and wellpaid-associates
  • Senior-creative-humblypaid-associates notes that the lack of recpect and tech limitations are their top frustrations.

What issues each persona feel should be addressed?

Observations

  • Unanimously lack of literacy for majority regardless of persona. Second to it is the lack of awareness of impact of data visualization.
  • Despite the slight differences in frustrations for every persona, all the personas surprisingly seem to unanimously agree on the same issues.

Summary

  • Well-paid analyticals seem be more prominent than well-paid creatives. Does this means analyticals are paid better than creatives?
  • Seniority is a factor for a high paying job but it is not impossible to be a junior but earn very-well as a data-viz practitioner.
  • There is a notable transition of tools usage popularity between generations. For example, between Excel to Tableau if we try to compare Juniors and Seniors.
  • This visuals could be a helpful tool to give insights on your current state (salary, role, etc.) in the industry and on the state of which persona you ideally want to be in.

Methodology and the 4 Major Indicators Comparison

Let’s look at our first major indicator, an indicator identifying your veteranship in the community!

Years of experience (Junior vs Senior)

Do you lean more towards being a newbie or do you lean more towards being an experienced one? We look at the years of experience as the seniority indicator of how long you’ve been practicing dataviz work.

This indicator uses the YearsDVExperience variable. YearsWorkExperience is secondary variable when no YearsDVExperience was provided.

The median years of experience is 6 years. Let’s define you as a Junior if your DV experience is less than 6 years, while being a Senior if it is more than 6 years.

Role (Analytical vs Creative)

Around 58% of the DVS members lean towards analytical roles while only 15% lean towards the creative roles. A huge chunk of 27% chose to not indicate their roles.

This indicator uses RoleAsEmployee as the primary variable. When this variable is not provided by the respondent, the RoleAsFreelance is being accessed.

While roles usually require to be both creative or analytical in function and purpose, we attempt to classify roles that are more likely leaning towards either of them.

Analytical

Roles that lean more toward analytical or science related fields:

  • Analyst
  • Developer
  • Scientist
  • Engineer
  • Leadership (Manager, Director, VP, etc.)

Creative

Roles that lean more towards creative or humanities related fields:

  • Designer
  • Journalist
  • Teacher
  • Cartographer

Note: Leadership and Cartographer roles tend to be ambiguously either creative or analytical, also as much as other roles. For the sake of removing the ambiguity, we tried to judge based on the reality and nature of the profession.

Stories that helped on how they were classified:

58% are Analyticals while 15% are Creatives

Income group (Humbly-paid vs Well-paid)

Median annual income in the DVS community is at $81,300.

Let’s define you as humbly-paid if your annual income falls below the median annual income and well-paid if above it. We try to define these terms in respect to the entire DV population.

This indicator was taken from PayAnnual variable.

Note: The terms humbly-paid and well-paid depicts the lower and upper halves of the distribution. These terms could be subjective to every DVS member depending on their cost of living in their respective countries and other such factors.

Commitment (Independent vs Associate)

Independent

Independents are those who are free-spirited dataviz practicioners working most likely on their own terms (e.g. freelancers, hobbyists). Based from the survey data, these includes:

  • Freelance/Consultant/Independent contractor
  • Non-compensated data visualization hobbyist
  • Student in a degree program at a college or university
  • Passive income from data visualization related products

Associate

Associates are those who are mostly working in an organization (e.g. employees) with dataviz responsibilities. They are those who have/are:

  • Position in an organization with some dataviz job responsibilities
  • Academic/Teacher

How we classified who belongs to which?

We put weighted points on variables where a respondent has indicated that they identified themselves working on these type of roles.

Since the majority has indicated working in a position in an organization (DVRoles_Employee), Weight points were included on the hobbyists and freelance roles to balance out the heavy-leaning towards an employee persona. This also removes the ambiguity that either can be classified from the other.

Then, these points were added and compare the results whichever is higher. This is now our metric that would indicate whether an individual lean towards either an Independent persona or an Associate persona.

Independent

  • +3 if has identified as hobbyist (DVRoles_Hobbyist)
  • +2 if has identified as freelance/consultant (DVRoles_Freelance)
  • +1 if has identified as student (DVRoles_Student)
  • +1 if has identified who has passive income (DVRoles_PassiveIncome)

Associate

  • +1 if has identified as employee (DVRoles_Employee)
  • +1 if has identified as teacher (DVRoles_Academic)

Ambiguous

  • Those whose weighted points on both Independent and Associate scores were equal.

Nearly 60% are Associates while around 37% are Independents

LS0tDQp0aXRsZTogIkV4cGxhaW5lcjogV2hpY2ggRFZTIHBlcnNvbmEgYXJlIHlvdT8iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpCWSBKT1NFUEggUklDQUZPUlQNCg0KSWYgeW91IGhhdmVuJ3QgdGFrZW4gdGhlIHF1aXogeWV0LCBrbm93IHdoaWNoIERWUyBwZXJzb25hIGFyZSB5b3UgYnkgdGFraW5nIHRoZSBbcXVpeiBoZXJlXShodHRwczovL2R2cy1wZXJzb25hLXF1aXoudGhlbG9zdGtpdGUuY29tLykuDQoNClRoZSBEVlMgY29tbXVuaXR5IGlzIGEgZGl2ZXJzZSBjb21tdW5pdHkgbWFkZSB1cCBvZiBkYXRhdml6IHByYWN0aWNpb25lcnMgZnJvbSBkaWZmZXJlbnQgZGVtb2dyYXBoaWNzIGFuZCBleHBlcmllbmNlcy4gSGF2ZSB5b3UgZXZlciB3b25kZXJlZCB3aGF0IGNvdWxkIGJlIHRoZSBkaWZmZXJlbnQgcG9zc2libGUgcGVyc29uYXMgdGhhdCBhcmUgbWFkZSB1cCBvZiB0aGlzIGNvbW11bml0eSBhbmQgd2hpY2ggb2YgdGhlc2UgcGVyc29uYXMgZG8geW91IGlkZW50aWZ5IHlvdXJzZWxmIHRoZSBjbG9zZXN0IHRvPw0KDQpMZXQncyBsb29rIGF0IHRoZSA0IGRpZmZlcmVudCBpbmRpY2F0b3JzIGFuZCBtaXggJiBtYXRjaCB0aGVtIHRvIGNyZWF0ZSBkaWZmZXJlbnQgcGVyc29uYXMgb2Ygd2hhdCB0aGUgRFZTIHBvcHVsYXRpb24gYXJlIG1hZGUgb3V0IG9mLg0KDQohW1RoZSAxNiBEVlMgcGVyc29uYXNdKHBlcnNvbmEtYXZhdGFycy5zdmcpDQpbQ2FydG9vbiBWZWN0b3JzIGJ5IFZlY3RlZXp5XShodHRwczovL3d3dy52ZWN0ZWV6eS5jb20vZnJlZS12ZWN0b3IvY2FydG9vbikNCg0KKkRpc2NsYWltZXI6IFRoZSBuYW1pbmcgb3IgYWxpYXMgZm9yIGV2ZXJ5IHBlcnNvbmEgKGUuZy4gVGhlIEFuYWx5c3QgSW50ZXJuLCBUaGUgSm91cm5hbGlzdCwgZXRjLi4pIHdlcmUgaW5mZXJyZWQgZnJvbSB0aGUgZGF0YSBhcyBjbG9zZSBhcyBwb3NzaWJsZSBidXQgbWlnaHQgbm90IHRydWx5IHJlcHJlc2VudCBhbmQgY2hhcmFjdGVyaXplIHRoZSBtYWpvcml0eSBvZiB0aG9zZSBzdWJncm91cHMuIEl0IGlzIGFsc28gYSBtZWFucyB0byBlYXNpbHkgaWRlbnRpZnkgdGhlIHN1Ymdyb3VwcyB3aXRoIHRoaXMgbmFtaW5nIGNvbnZlbnRpb24uKg0KDQpBbW9uZyAyLDE2NSBzdXJ2ZXkgcmVzcG9uZGVudHMsIDEsMjg4IGhhdmUgcHJvdmlkZWQgYWxsIG9mIHRoZSAqKjQgbWFqb3IgaW5kaWNhdG9ycyoqIGFuZCBoYXZlIGFuc3dlcmVkIGF0IGxlYXN0IG9uZSBvZiB0aGUgKio0IGFkZGl0aW9uYWwgaW5kaWNhdG9ycyoqLg0KDQoqKjQgbWFqb3IgaW5kaWNhdG9yczoqKg0KDQoqICoqWWVhcnMgb2YgZXhwZXJpZW5jZSoqIChKdW5pb3IgdnMgU2VuaW9yKQ0KKiAqKlJvbGUqKiAoQW5hbHl0aWNhbCB2cyBDcmVhdGl2ZSkNCiogKipJbmNvbWUgZ3JvdXAqKiAoSHVtYmx5LXBhaWQgdnMgV2VsbC1wYWlkKQ0KKiAqKkNvbW1pdG1lbnQqKiAoSW5kZXBlbmRlbnQgdnMgQXNzb2NpYXRlKQ0KDQoqKjQgYWRkaXRpb25hbCBpbmRpY2F0b3JzOioqDQoNCiogKipUb29scyBmb3IgRFZTKiogLSBpZGVudGlmaWVzIHRoZSBjaGFyYWN0ZXIgZm9yIGVhY2ggcGVyc29uYSBpbiB0ZXJtcyBvZiB0b29sIHByZWZlcmVuY2UNCiogKipPcmdhbml6YXRpb25zIC8gSW5kdXN0cnkqKiAtIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcGVyc29uYXMgdG8gd2hpY2ggdGhleSBhcmUgbW9yZSBjb21tb24NCiogKipGcnVzdHJhdGlvbnMqKiAtIGRvIGVhY2ggcGVyc29uYSBoYXZlIHZhcnlpbmcgZnJ1c3RyYXRpb25zPw0KKiAqKklzc3VlcyoqIC0gc29jaW8tZWNvbm9taWMgb3IgZHZzLXNwZWNpZmljIGlzc3VlcyBmb3IgZWFjaCBwZXJzb25hDQoNCklmIHlvdSB3YW50IHRvIHJlYWQgZmlyc3QgdGhlIGZ1bGwgbWV0aG9kb2xvZ3kgb24gaG93IHRoZSBjbGFzc2lmaWNhdGlvbnMgd2VyZSBkb25lIG9yIGhvdyB0aGUgbnVtYmVycyB3ZXJlIGNydW5jaGVkLCBzZWUgdGhlIFtNZXRob2RvbG9neSBhbmQgdGhlIDQgTWFqb3IgSW5kaWNhdG9ycyBDb21wYXJpc29uXS4NCg0KIyMgVGhlIDE2IERWUyBQZXJzb25hcw0KDQpNaXggYW5kIG1hdGNoaW5nIHRoZXNlIDQgbWFqb3IgaW5kaWNhdG9ycywgMTYgdW5pcXVlIHBlcnNvbmFzIHdlcmUgY3JlYXRlZC4gVGhpcyBpcyBzb21ld2hhdCBpbnNwaXJlZCBmcm9tIE15ZXJzLUJyaWdncyBUeXBlIEluZGljYXRvciAoTUJUSSkgYnV0IHdpdGggYSBEVlMgdHdpc3QhDQoNCioqUGVyY2VudGFnZSBkaXN0cmlidXRpb24gb2YgdGhlIDE2IERWUyBwZXJzb25hcyoqDQpgYGB7ciwgZWNobz1mYWxzZX0NCmdncGxvdCh0cmliZV90YWxseSAlPiUgDQogIG11dGF0ZShncm91cCA9IHBhc3RlKGV4cGVyaWVuY2UsIHJvbGVUeXBlLCBpbmNvbWVHcm91cCwgY29tbWl0bWVudCkpICU+JQ0KICBtdXRhdGUoZ3JvdXAgPSBmY3RfcmVvcmRlcihncm91cCwgbikpICU+JQ0KICBtdXRhdGUoY2xhc3MgPSAiY2xhc3MiKSwgYWVzKHJlb3JkZXIoZ3JvdXAsIG5QZXJjKSwgblBlcmMsIGZpbGwgPSBjbGFzcykpICsgDQogIGdlb21fY29sKHNob3cubGVnZW5kID0gRikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKA0KICAgIHggPSAiUGVyc29uYXMiLA0KICAgIHkgPSAiUGVyY2VudCBvZiB0aGUgUmVzcG9uZGVudHMiDQogICkNCmBgYA0KDQpgYGB7ciwgZWNobz1mYWxzZX0NCnRyaWJlX3RhbGx5ICU+JQ0KICBzZWxlY3QoLW4pICU+JSByZW5hbWUocGVyY2VudCA9IG5QZXJjKSAlPiUNCiAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChwZXJjZW50LCAyKSkNCmBgYA0KDQoyNSUgb2YgdGhlIERWUyBjb21tdW5pdHkgaXMgYSBKdW5pb3ItQW5hbHl0aWNhbC1IdW1ibHlwYWlkLUFzc29jaWF0ZSwgdGhlIG1vc3QgY29tbW9uIGFtb25nIGFsbCBwZXJzb25hcy4gSXQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIFNlbmlvci1BbmFseXRpY2FsLUh1bWJseXBhaWQtQXNzb2NpYXRlLg0KDQpNZWFud2hpbGUgYSBKdW5pb3ItQ3JlYXRpdmUtV2VsbHBhaWQtSW5kZXBlbmRlbnQgaXMgdGhlIHJhcmVzdCBwZXJzb25hIHdoaWNoIGlzIGp1c3QgMC41JSBvZiB0aGUgRFZTIG1lbWJlcnMuIEltYWdpbmUgYSBkYXRhdml6IHByYWN0aXRpb25lciB3aG8gaGFzIGxlc3MgdGhhbiA2IHllYXJzIGV4cGVyaWVuY2Ugd2l0aCBtb3JlIHRoYW4gVVNEODAsMDAwIGFubnVhbCBzYWxhcnkgd2hvIGlzIGVpdGhlciBhIGZyZWVsYW5jZSBvciBhIHBhcnQtdGltZSBzdHVkZW50LiBUaGV5IHNlZW0gdG8gYmUgbGlrZSBwcm9kaWd5LCBmcmVlIHNwaXJpdGVkLCBmYXN0LWxlYXJuaW5nIGVudHJlcHJlbmV1cnMgZG9pbmcgdGhpbmdzIHRoZWlyIHdheSBhbmQgYmVpbmcgcGFpZCByZWFsbHkgd2VsbC4NCg0KDQojIyBUaGUgUHJlZmVyZW5jZSBhbmQgQ2hhcmFjdGVyIG9mIEVhY2ggUGVyc29uYSAoNCBBZGRpdGlvbmFsIGluZGljYXRvcnMpDQoNCjQgdmFyaWFibGVzIGZyb20gdGhlIHN1cnZleSBkYXRhIHdlcmUgY2hvc2VuIHRvIHNlZSB3aGF0IGRpc3RpbmN0IGNoYXJhY3RlciBlYWNoIG9mIHRoZSBwZXJzb25hIGluaGliaXQuIFRoZXNlIGFyZToNCg0KKipUaGUgNCBhZGRpdGlvbmFsIGluZGljYXRvcnM6KioNCg0KKiAqKlRvb2xzIGZvciBEVlMqKiAtIGlkZW50aWZpZXMgdGhlIGNoYXJhY3RlciBmb3IgZWFjaCBwZXJzb25hICgqKlRvb2xzRm9yRFZfKiopDQoqICoqT3JnYW5pemF0aW9ucyAvIEluZHVzdHJ5KiogLSBkaXN0cmlidXRpb24gb2YgdGhlIHBlcnNvbmFzIHRvIHdoaWNoIHRoZXkgYXJlIG1vcmUgZW5kZW1pYyAoKipPcmdTZWN0b3JfKiopDQoqICoqRnJ1c3RyYXRpb25zKiogLSBkbyBlYWNoIHBlcnNvbmEgaGF2ZSB2YXJ5aW5nIGZydXN0cmF0aW9ucz8gKCoqVG9wRnJ1c3RyYXRpb25zRFZfKiopDQoqICoqSXNzdWVzKiogLSBzb2Npby1lY29ub21pYyBvciBkdnMtc3BlY2lmaWMgaXNzdWVzIGZvciBlYWNoIHBlcnNvbmEgKCoqVG9wSXNzdWVzRFZfKiopDQpgYGB7ciwgZWNobz1mYWxzZX0NCnRyaWJlX3Rvb2xzDQp0cmliZV9mcnVzdHJhdGlvbnMNCmBgYA0KDQojIyMgV2hpY2ggdG9vbHMgZWFjaCBwZXJzb25hIG1vcmUgbGlrZWx5IHVzZT8NCg0KTGV0J3MgbG9vayBhdCBob3cgZWFjaCBwZXJzb25hIGhhcyBtb3JlIHByZWZlcmVkIHRvb2xzIHRoYW4gdGhlIG90aGVycy4NCg0KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMCwgZWNobz1mYWxzZX0NCmdncGxvdCh0cmliZV90b29scyAlPiUgDQogICAgICAgICBmaWx0ZXIodG9vbHNfZm9yX2R2X3ZhcnMgJWluJSB0b29sc190b3AxMCksIA0KICAgICAgIGFlcyh0b29sc19mb3JfZHZfbmFtZXMsIHBlcmNOLCBmaWxsID0gdG9vbHNfZm9yX2R2X3R5cGUpKSArDQogIGdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIndoaXRlIikgKyANCiAgIyBjb29yZF9mbGlwKCkgKw0KICBjb29yZF9wb2xhcigpICsgDQogIGZhY2V0X3dyYXAodmFycyh0cmliZV9kZXNjKSkgKw0KICBsYWJzKA0KICAgIHggPSAiIiwNCiAgICB5ID0gIlBlcmNlbnQgb2YgdGhlIFJlc3BvbmRlbnRzIiwNCiAgICBmaWxsID0gIlRvb2xzIGZvciBEViBDYXRlZ29yeSINCiAgKQ0KYGBgDQojIyMjIE9ic2VydmF0aW9ucw0KKiBBbW9uZyB0aGUganVuaW9yLWFuYWx5dGljYWxzLCB0aGUgaHVtYmx5cGFpZHMnIHVzZSBleGNlbCBhcyB0b3AgdG9vbCB3aGlsZSB0aGUgd2VsbHBhaWRzJyB1c2UgVGFibGVhdS4gRG9lcyB0aGlzIGltcGx5IHRoYXQgVGFibGVhdSBpcyBmb3IgdGhlIHdlbGwtb2ZmcyBhbW9uZyB0aGUganVuaW9yIGFuYWx5dGljYWxzPw0KKiBIdW1ibHlwYWlkIGNyZWF0aXZlcyBwcm91ZGx5IHNob3dzIHRoZWlyIGFmZmluaXR5IGZvciBpbGx1c3RyYXRvciBhbmQgaXQncyBqdXN0IHNvIG9idmlvdXMgd2l0aCB0aGUgY2hhcnRzLg0KKiBVbmFuaW1vdXNseSwgYW55IHBlcnNvbmEgc2VlbXMgdG8gdXNlIEV4Y2VsIGFzIHRoZWlyIHRvcCB0b29sIGZvciBEVi4NCiogSnVuaW9yIGNyZWF0aXZlIGluZGVwZW5kZW50cyB0ZW5kIHRvIHVzZSBSIGFzIGVpdGhlciAybmQgb3IgM3JkIHRvb2wuDQoqIENyZWF0aXZlLVdlbGxwYWlkLUFzc29jaWF0ZXMgYXJlIEQzLmpzIHBvd2VyIHVzZXJzISBXaG8gc2FpZCBjcmVhdGl2ZXMgY2FuJ3QgY29kZT8NCiogTG9va3Mgc28gb2J2aW91cyB0aGF0IElsbHVzdHJhdG9yIGlzIGEgY3JlYXRpdmUncyBiZXN0ZnJpZW5kLCBleGNlcHQgZm9yIGEgY3JlYXRpdmUtd2VsbHBhaWQtaW5kZXBlbmRlbnQgd2hpY2ggYSBKdW5pb3Igd291bGQgcHJlZmVyIFBlbiAmIHBhcGVyIGFuZCBTZW5pb3IgdWhtLi4uIEV4Y2VsPyBzdHJhbmdlLg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMCwgZWNobz1mYWxzZX0NCiMgZ2dwbG90KHRyaWJlX3Rvb2xzICU+JSANCiMgICAgICAgICAgdW5ncm91cCgpICU+JQ0KIyAgICAgICAgICBncm91cF9ieSh0cmliZV9kZXNjKSAlPiUNCiMgICAgICAgICAgdG9wX24oNSwgbikgJT4lIHVuZ3JvdXAoKSwgYWVzKHRvb2xzX2Zvcl9kdl92YXJzLCBwZXJjTiwgY29sb3IgPSB0cmliZV9kZXNjKSkgKw0KIyAgIGdlb21fcG9pbnQoKSArDQojICAgY29vcmRfZmxpcCgpDQpgYGANCg0KDQojIyMgSG93IGNvbW1vbiBlYWNoIHBlcnNvbmEgcGVyIGluZHVzdHJ5Pw0KDQpEaWZmZXJlbnQgcGVyc29uYXMgd2VyZSBkaXNwZXJzZWQgaW4gZGlmZmVyZW50IGluZHVzdHJpZXMgYXN5bW1ldHJpY2FsbHkuIFRoaXMgdmlzdWFsIHRvb2wgY291bGQgYmUgYmVuZWZpY2lhbCBpZiB5b3UgYXJlIGV5ZWluZyBmb3IgYSBzcGVjaWZpYyBwZXJzb25hIHlvdSB3YW50IHRvIGJlIGluLiBBIHJhcmUgcGVyc29uYSBpbiB0aGF0IGluZHVzdHJ5IGNvdWxkIGVpdGhlciBpbmRpY2F0ZSB3aGV0aGVyIGl0IGhhcyBhIGRpZmZpY3VsdCBwcmVyZXF1aXNpdGVzIHdoaWNoIG1ha2VzIHRoZXNlIHBlcnNvbmEgcXVpdGUgcmFyZS4NCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEwLCBlY2hvPWZhbHNlfQ0KZ2dwbG90KHRyaWJlX29yZ3NlYywgYWVzKG9yZ19zZWN0b3JfbmFtZXMsIG4sIGZpbGwgPSBvcmdfc2VjdG9yX2NhdGVnb3J5KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZmFjZXRfd3JhcCh2YXJzKHRyaWJlX2Rlc2MpKSArDQogIGxhYnMoDQogICAgeCA9ICJJbmR1c3RyeSIsDQogICAgeSA9ICJOdW1iZXIgb2YgcmVzcG9uZGVudHMiLA0KICAgIGZpbGwgPSAiSW5kdXN0cnkgQ2F0ZWdvcnkiDQogICkNCmBgYA0KKipPYnNlcnZhdGlvbnMqKg0KDQoqIEp1bmlvci1BbmFseXRpY2FsLUh1bWJseXBhaWQtQXNzb2NpYXRlIHNlZW1zIHRvIHZpc3VhbGx5IG9jY3VweSBhIGxvdCBvZiB0aGUgYmFycyBmb2xsb3dlZCBieSBTZW5pb3ItQW5hbHl0aWNhbC1XZWxscGFpZC1Bc3NvY2lhdGUuIFRoZXNlIHR3byBwZXJzb25hcyBlYXJsaWVyIHdlcmUgcmFua2VkIGFzIHRoZSBmaXJzdCBhbmQgc2Vjb25kIG1vc3QgY29tbW9uIHBlcnNvbmFzLg0KKiBBbG1vc3QgNTAlIG9mIHRoZSBTZW5pb3ItQW5hbHl0aWNhbC1IdW1ibHlwYWlkLUFzc29jaWF0ZXMgaWRlbnRpZmllZCB0aGVtc2VsdmVzIGNvbWluZyBmcm9tIHRoZSBBY2FkZW1lLg0KKiBJZiB5b3Ugd2FudCB0byBiZSBhIGNyZWF0aXZlIGJ1dCB3YW50IHRvIGVhcm4gYSBsb3Qgb2YgbW9uZXksIHlvdSBzaG91bGQgYmUgaW4gdGhlIElUIEluZHVzdHJ5LCBzYWlkIGJ5IGEgQ3JlYXRpdmUtV2VsbHBhaWQuDQoqIE1vc3Qgb2YgdGhvc2UgaW4gdGhlIEpvdXJuYWxpc20gaW5kdXN0cnkgYXJlIGVpdGhlciBKdW5pb3ItQ3JlYXRpdmUtSHVtYmx5cGFpZA0KDQoNCiMjIyBXaGF0IGZydXN0cmF0ZXMgZWFjaCBwZXJzb25hIHRoZSBtb3N0Pw0KDQpUb3AgNyBmcnVzdHJhdGlvbnMgd2VyZSBwaWNrZWQgYW1vbmcgdGhlIDEzIGluIHRoZSBzdXJ2ZXkuIFRoZXNlIHdlcmUgZW5jb2RlZCBpbiB0aGUgY2hhcnRzIGFzOg0KDQoqICoqVGltZSoqOiBMYWNrIG9mIHRpbWUNCiogKipEZXNpZ24qKjogTGFjayBvZiBkZXNpZ24gZXhwZXJ0aXNlDQoqICoqRGF0YSBBY2Nlc3MqKjogQWNjZXNzaW5nIGRhdGENCiogKipEYXRhIExpdGVyYWN5Kio6IExvdyBkYXRhIGxpdGVyYWN5DQoqICoqUmVzcGVjdCBEVioqOiBOb3QgZW5vdWdoIHJlc3BlY3QgZm9yIGRhdGF2aXoNCiogKipUZWNoIHRvb2xzIGxpbWl0Kio6IFRlY2huaWNhbCBsaW1pdGF0aW9ucyBvZiB0aGUgdG9vbHMNCiogKipOb24tdml6IGFjdGl2aXR5Kio6IFRvbyBtdWNoIGVmZm9ydCBzcGVudCBvbiBub24tdml6IGFjdGl2aXR5DQoNCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEwLCBlY2hvPWZhbHNlfQ0KZ2dwbG90KHRyaWJlX2ZydXN0cmF0aW9ucyAlPiUNCiAgICAgICAgIGZpbHRlcih0b3BfZnJ1c3RyYXRpb25zX3ZhcnMgJWluJSBmcnVzdHJhdGlvbnNfdG9wNyksIA0KICAgICAgIGFlcyh0b3BfZnJ1c3RyYXRpb25zX3Nob3J0LCBwZXJjTiwgZmlsbCA9IHRvcF9mcnVzdHJhdGlvbnNfdHlwZSkpICsNCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArDQogIGNvb3JkX3BvbGFyKCkgKw0KICAjIGNvb3JkX2ZsaXAoKSArDQogIGZhY2V0X3dyYXAodmFycyh0cmliZV9kZXNjKSwgbmNvbCA9IDQpICsNCiAgbGFicygNCiAgICB4ID0gIiIsDQogICAgeSA9ICJQZXJjZW50IG9mIHRoZSBSZXNwb25kZW50cyIsDQogICAgZmlsbCA9ICJUb3AgRnJ1c3RyYXRpb24gQ2F0ZWdvcnkiDQogICkNCmBgYA0KIyMjIyBPYnNlcnZhdGlvbnMNCiogSnVuaW9yLWFuYWx5dGljYWxzIGxvb2tzIHVuYW5pbW91cyBpbiB0aGVpciBmcnVzdHJhdGlvbnMsIHRoZSBsYXNrIG9mIGRlc2lnbiBleHBlcnRpc2UuIEZvciBqdW5pb3ItYW5hbHl0aWNhbC13ZWxscGFpZC1ob2JieWlzdCwgaXQgaXMgdGhlaXIgc2Vjb25kIGZydXN0cmF0aW9uIHRvIGxhY2sgb2YgdGltZS4NCiogSnVuaW9yLWNyZWF0aXZlcycgdG9wIGZydXN0cmF0aW9uIHNlZW1zIHRvIGJlIHRoZSBsYWNrIG9mIHRpbWUuIEl0IGlzIHRoaXJkIGZvciBodW1ibHlwYWlkLWFzc29jaWF0ZXMgYW5kIHdlbGxwYWlkLWhvYmJ5aXN0cyB3aGVyZSB0aGVpciB0b3AgZnJ1c3RyYXRpb25zIGlzIGluIHRoZSBsYWNrIG9mIHRlY2huaWNhbCBza2lsbHMuDQoqIEp1bmlvci1jcmVhdGl2ZS13ZWxscGFpZC1pbmRlcGVuZGVudHMsIHdoaWNoIGlzIHRoZSByYXJlc3QgdHJpYmUsIG1lbnRpb24gdGhhdCBhIGxhY2sgb2YgdGVjaCBza2lsbHcgKDFzdCkgYW5kIGxhY2tpbmcgbWVudG9yc2hpcCAoMm5kKSBhcmUgdGhlaXIgbWFpbiBmcnVzdHJhdGlvbnMuDQoqIFNlbmlvciBhbmFseXRpY2FscyBhcmUgdW5hbmlub3VzIHdpdGggdGhlIGxhY2sgb2YgdGltZSBhcyB0aGVpciB0b3AgZnJ1c3RyYXRpb25zIGFsb25nIHdpdGggY3JlYXRpdmVzIGh1bWJseXBhaWQtaW5kZXBlbmRlbnRzIGFuZCB3ZWxscGFpZC1hc3NvY2lhdGVzDQoqIFNlbmlvci1jcmVhdGl2ZS1odW1ibHlwYWlkLWFzc29jaWF0ZXMgbm90ZXMgdGhhdCB0aGUgbGFjayBvZiByZWNwZWN0IGFuZCB0ZWNoIGxpbWl0YXRpb25zIGFyZSB0aGVpciB0b3AgZnJ1c3RyYXRpb25zLg0KDQoNCiMjIyBXaGF0IGlzc3VlcyBlYWNoIHBlcnNvbmEgZmVlbCBzaG91bGQgYmUgYWRkcmVzc2VkPw0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMCwgZWNobz1mYWxzZX0NCmdncGxvdCh0cmliZV9pc3N1ZXMgJT4lDQogICAgICAgICBmaWx0ZXIodG9wX2lzc3Vlc192YXJzICVpbiUgdG9wX2lzc3Vlc190b3AxMCksIA0KICAgICAgIGFlcyh0b3BfaXNzdWVzX25hbWVzLCBwZXJjTiwgZmlsbCA9IHRvcF9pc3N1ZXNfdHlwZSkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBmYWNldF93cmFwKHZhcnModHJpYmVfZGVzYykpICsNCiAgbGFicygNCiAgICB4ID0gIlRvcCBJc3N1ZXMiLA0KICAgIHkgPSAiUGVyY2VudCBvZiB0aGUgUmVzcG9uZGVudHMiLA0KICAgIGZpbGwgPSAiVG9wIElzc3VlcyINCiAgKQ0KYGBgDQojIyMjIE9ic2VydmF0aW9ucw0KDQoqIFVuYW5pbW91c2x5IGxhY2sgb2YgbGl0ZXJhY3kgZm9yIG1ham9yaXR5IHJlZ2FyZGxlc3Mgb2YgcGVyc29uYS4gU2Vjb25kIHRvIGl0IGlzIHRoZSBsYWNrIG9mIGF3YXJlbmVzcyBvZiBpbXBhY3Qgb2YgZGF0YSB2aXN1YWxpemF0aW9uLg0KKiBEZXNwaXRlIHRoZSBzbGlnaHQgZGlmZmVyZW5jZXMgaW4gZnJ1c3RyYXRpb25zIGZvciBldmVyeSBwZXJzb25hLCBhbGwgdGhlIHBlcnNvbmFzIHN1cnByaXNpbmdseSBzZWVtIHRvIHVuYW5pbW91c2x5IGFncmVlIG9uIHRoZSBzYW1lIGlzc3Vlcy4NCg0KIyMjIFN1bW1hcnkNCiogV2VsbC1wYWlkIGFuYWx5dGljYWxzIHNlZW0gYmUgbW9yZSBwcm9taW5lbnQgdGhhbiB3ZWxsLXBhaWQgY3JlYXRpdmVzLiBEb2VzIHRoaXMgbWVhbnMgYW5hbHl0aWNhbHMgYXJlIHBhaWQgYmV0dGVyIHRoYW4gY3JlYXRpdmVzPw0KKiBTZW5pb3JpdHkgaXMgYSBmYWN0b3IgZm9yIGEgaGlnaCBwYXlpbmcgam9iIGJ1dCBpdCBpcyBub3QgaW1wb3NzaWJsZSB0byBiZSBhIGp1bmlvciBidXQgZWFybiB2ZXJ5LXdlbGwgYXMgYSBkYXRhLXZpeiBwcmFjdGl0aW9uZXIuDQoqIFRoZXJlIGlzIGEgbm90YWJsZSB0cmFuc2l0aW9uIG9mIHRvb2xzIHVzYWdlIHBvcHVsYXJpdHkgYmV0d2VlbiBnZW5lcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGJldHdlZW4gRXhjZWwgdG8gVGFibGVhdSBpZiB3ZSB0cnkgdG8gY29tcGFyZSBKdW5pb3JzIGFuZCBTZW5pb3JzLg0KKiBUaGlzIHZpc3VhbHMgY291bGQgYmUgYSBoZWxwZnVsIHRvb2wgdG8gZ2l2ZSBpbnNpZ2h0cyBvbiB5b3VyIGN1cnJlbnQgc3RhdGUgKHNhbGFyeSwgcm9sZSwgZXRjLikgaW4gdGhlIGluZHVzdHJ5IGFuZCBvbiB0aGUgc3RhdGUgb2Ygd2hpY2ggcGVyc29uYSB5b3UgaWRlYWxseSB3YW50IHRvIGJlIGluLg0KDQotLS0tLS0NCg0KIyMgTWV0aG9kb2xvZ3kgYW5kIHRoZSA0IE1ham9yIEluZGljYXRvcnMgQ29tcGFyaXNvbg0KDQpMZXQncyBsb29rIGF0IG91ciBmaXJzdCBtYWpvciBpbmRpY2F0b3IsIGFuIGluZGljYXRvciBpZGVudGlmeWluZyB5b3VyIHZldGVyYW5zaGlwIGluIHRoZSBjb21tdW5pdHkhDQoNCiMjIyBZZWFycyBvZiBleHBlcmllbmNlIChKdW5pb3IgdnMgU2VuaW9yKQ0KRG8geW91IGxlYW4gbW9yZSB0b3dhcmRzIGJlaW5nIGEgbmV3YmllIG9yIGRvIHlvdSBsZWFuIG1vcmUgdG93YXJkcyBiZWluZyBhbiBleHBlcmllbmNlZCBvbmU/IFdlIGxvb2sgYXQgdGhlIHllYXJzIG9mIGV4cGVyaWVuY2UgYXMgdGhlIHNlbmlvcml0eSBpbmRpY2F0b3Igb2YgaG93IGxvbmcgeW91J3ZlIGJlZW4gcHJhY3RpY2luZyBkYXRhdml6IHdvcmsuDQoNClRoaXMgaW5kaWNhdG9yIHVzZXMgdGhlICoqWWVhcnNEVkV4cGVyaWVuY2UqKiB2YXJpYWJsZS4gKipZZWFyc1dvcmtFeHBlcmllbmNlKiogaXMgc2Vjb25kYXJ5IHZhcmlhYmxlIHdoZW4gbm8gWWVhcnNEVkV4cGVyaWVuY2Ugd2FzIHByb3ZpZGVkLg0KDQpUaGUgbWVkaWFuIHllYXJzIG9mIGV4cGVyaWVuY2UgaXMgKio2IHllYXJzKiouIExldCdzIGRlZmluZSB5b3UgYXMgYSAqKkp1bmlvcioqIGlmIHlvdXIgRFYgZXhwZXJpZW5jZSBpcyBsZXNzIHRoYW4gNiB5ZWFycywgd2hpbGUgYmVpbmcgYSAqKlNlbmlvcioqIGlmIGl0IGlzIG1vcmUgdGhhbiA2IHllYXJzLg0KYGBge3IsIGVjaG89ZmFsc2V9DQpnZ3Bsb3QoZXhwZXJpZW5jZV9zb3J0ZWQsIGFlcyhZZWFyc0RWRXhwZXJpZW5jZSwgblBlcmMsIGZpbGwgPSBleHBlcmllbmNlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoDQogICAgeCA9ICJZZWFycyBvZiBFeHBlcmllbmNlIiwNCiAgICB5ID0gIlBlcmNlbnQgb2YgdGhlIFJlc3BvbmRlbnRzIiwNCiAgICBmaWxsID0gIkV4cGVyaWVuY2UiDQogICkNCmBgYA0KDQojIyMgUm9sZSAoQW5hbHl0aWNhbCB2cyBDcmVhdGl2ZSkNCg0KQXJvdW5kIDU4JSBvZiB0aGUgRFZTIG1lbWJlcnMgbGVhbiB0b3dhcmRzIGFuYWx5dGljYWwgcm9sZXMgd2hpbGUgb25seSAxNSUgbGVhbiB0b3dhcmRzIHRoZSBjcmVhdGl2ZSByb2xlcy4gIEEgaHVnZSBjaHVuayBvZiAyNyUgY2hvc2UgdG8gbm90IGluZGljYXRlIHRoZWlyIHJvbGVzLg0KDQpUaGlzIGluZGljYXRvciB1c2VzICoqUm9sZUFzRW1wbG95ZWUqKiBhcyB0aGUgcHJpbWFyeSB2YXJpYWJsZS4gV2hlbiB0aGlzIHZhcmlhYmxlIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgcmVzcG9uZGVudCwgdGhlICoqUm9sZUFzRnJlZWxhbmNlKiogaXMgYmVpbmcgYWNjZXNzZWQuDQoNCldoaWxlIHJvbGVzIHVzdWFsbHkgcmVxdWlyZSB0byBiZSBib3RoIGNyZWF0aXZlIG9yIGFuYWx5dGljYWwgaW4gZnVuY3Rpb24gYW5kIHB1cnBvc2UsIHdlIGF0dGVtcHQgdG8gY2xhc3NpZnkgcm9sZXMgdGhhdCBhcmUgbW9yZSBsaWtlbHkgbGVhbmluZyB0b3dhcmRzIGVpdGhlciBvZiB0aGVtLg0KDQojIyMjIEFuYWx5dGljYWwNClJvbGVzIHRoYXQgbGVhbiBtb3JlIHRvd2FyZCBhbmFseXRpY2FsIG9yIHNjaWVuY2UgcmVsYXRlZCBmaWVsZHM6DQoNCiogKipBbmFseXN0KioNCiogKipEZXZlbG9wZXIqKg0KKiAqKlNjaWVudGlzdCoqDQoqICoqRW5naW5lZXIqKg0KKiAqKkxlYWRlcnNoaXAgKE1hbmFnZXIsIERpcmVjdG9yLCBWUCwgZXRjLikqKg0KDQojIyMjIENyZWF0aXZlDQpSb2xlcyB0aGF0IGxlYW4gbW9yZSB0b3dhcmRzIGNyZWF0aXZlIG9yIGh1bWFuaXRpZXMgcmVsYXRlZCBmaWVsZHM6DQoNCiogKipEZXNpZ25lcioqDQoqICoqSm91cm5hbGlzdCoqDQoqICoqVGVhY2hlcioqDQoqICoqQ2FydG9ncmFwaGVyKioNCg0KTm90ZTogTGVhZGVyc2hpcCBhbmQgQ2FydG9ncmFwaGVyIHJvbGVzIHRlbmQgdG8gYmUgYW1iaWd1b3VzbHkgZWl0aGVyIGNyZWF0aXZlIG9yIGFuYWx5dGljYWwsIGFsc28gYXMgbXVjaCBhcyBvdGhlciByb2xlcy4gRm9yIHRoZSBzYWtlIG9mIHJlbW92aW5nIHRoZSBhbWJpZ3VpdHksIHdlIHRyaWVkIHRvIGp1ZGdlIGJhc2VkIG9uIHRoZSByZWFsaXR5IGFuZCBuYXR1cmUgb2YgdGhlIHByb2Zlc3Npb24uDQoNClN0b3JpZXMgdGhhdCBoZWxwZWQgb24gaG93IHRoZXkgd2VyZSBjbGFzc2lmaWVkOg0KDQoqIFtDcmVhdGl2aXR5IGFuZCB0aGUgUm9sZSBvZiB0aGUgTGVhZGVyXShodHRwczovL2hici5vcmcvMjAwOC8xMC9jcmVhdGl2aXR5LWFuZC10aGUtcm9sZS1vZi10aGUtbGVhZGVyKQ0KKiBbQSBEYXkgaW4gdGhlIExpZmUgb2YgYW4gT3JkaW5hbmNlIFN1cnZleSBDYXJ0b2dyYXBoZXJdKGh0dHBzOi8vZ2VvYXdlc29tZW5lc3MuY29tL2NhcnRvZ3JhcGh5LWNhcmVlci1naXMtc2tpbGxzLykNCg0KKio1OCUgYXJlIEFuYWx5dGljYWxzIHdoaWxlIDE1JSBhcmUgQ3JlYXRpdmVzKioNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xLjUsIGVjaG89ZmFsc2V9IA0KZ2dwbG90KHJvbGVfdGFsbHkgJT4lIA0KICAgICAgICAgbXV0YXRlKENsYXNzID0gImNsYXNzIiksIA0KICAgICAgIGFlcyhDbGFzcywgblBlcmMsIGZpbGwgPSBSb2xlVHlwZSkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9mbGlwKCkgKyANCiAgbGFicygNCiAgICB4ID0gIiIsDQogICAgeSA9ICJQZXJjZW50IG9mIHRoZSBSZXNwb25kZW50cyIsDQogICAgZmlsbCA9ICJSb2xlIFR5cGUiDQogICkNCmBgYA0KDQojIyMgSW5jb21lIGdyb3VwIChIdW1ibHktcGFpZCB2cyBXZWxsLXBhaWQpDQoNCk1lZGlhbiBhbm51YWwgaW5jb21lIGluIHRoZSBEVlMgY29tbXVuaXR5IGlzIGF0ICoqJDgxLDMwMCoqLiANCg0KTGV0J3MgZGVmaW5lIHlvdSBhcyAqKmh1bWJseS1wYWlkKiogaWYgeW91ciBhbm51YWwgaW5jb21lIGZhbGxzIGJlbG93IHRoZSBtZWRpYW4gYW5udWFsIGluY29tZSBhbmQgKip3ZWxsLXBhaWQqKiBpZiBhYm92ZSBpdC4gV2UgdHJ5IHRvIGRlZmluZSB0aGVzZSB0ZXJtcyBpbiByZXNwZWN0IHRvIHRoZSBlbnRpcmUgRFYgcG9wdWxhdGlvbi4NCg0KVGhpcyBpbmRpY2F0b3Igd2FzIHRha2VuIGZyb20gKipQYXlBbm51YWwqKiB2YXJpYWJsZS4NCg0KTm90ZTogVGhlIHRlcm1zICpodW1ibHktcGFpZCogYW5kICp3ZWxsLXBhaWQqIGRlcGljdHMgdGhlIGxvd2VyIGFuZCB1cHBlciBoYWx2ZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gVGhlc2UgdGVybXMgY291bGQgYmUgc3ViamVjdGl2ZSB0byBldmVyeSBEVlMgbWVtYmVyIGRlcGVuZGluZyBvbiB0aGVpciBjb3N0IG9mIGxpdmluZyBpbiB0aGVpciByZXNwZWN0aXZlIGNvdW50cmllcyBhbmQgb3RoZXIgc3VjaCBmYWN0b3JzLg0KYGBge3IsIGVjaG89ZmFsc2V9DQpnZ3Bsb3QoaW5jb21lX3NvcnRlZCwgYWVzKFBheUFubnVhbCwgblBlcmMsIGZpbGwgPSBpbmNvbWVfZ3JvdXApKSArDQogIGdlb21fY29sKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKA0KICAgIHggPSAiQW5udWFsIFBheSIsDQogICAgeSA9ICJQZXJjZW50IG9mIHRoZSBSZXNwb25kZW50cyIsDQogICAgZmlsbCA9ICJJbmNvbWUgR3JvdXAiDQogICkNCmBgYA0KDQojIyMgQ29tbWl0bWVudCAoSW5kZXBlbmRlbnQgdnMgQXNzb2NpYXRlKQ0KDQojIyMjIEluZGVwZW5kZW50DQoNCkluZGVwZW5kZW50cyBhcmUgdGhvc2Ugd2hvIGFyZSBmcmVlLXNwaXJpdGVkIGRhdGF2aXogcHJhY3RpY2lvbmVycyB3b3JraW5nIG1vc3QgbGlrZWx5IG9uIHRoZWlyIG93biB0ZXJtcyAoZS5nLiBmcmVlbGFuY2VycywgaG9iYnlpc3RzKS4gQmFzZWQgZnJvbSB0aGUgc3VydmV5IGRhdGEsIHRoZXNlIGluY2x1ZGVzOg0KDQoqICoqRnJlZWxhbmNlL0NvbnN1bHRhbnQvSW5kZXBlbmRlbnQgY29udHJhY3RvcioqDQoqICoqTm9uLWNvbXBlbnNhdGVkIGRhdGEgdmlzdWFsaXphdGlvbiBob2JieWlzdCoqDQoqICoqU3R1ZGVudCBpbiBhIGRlZ3JlZSBwcm9ncmFtIGF0IGEgY29sbGVnZSBvciB1bml2ZXJzaXR5KioNCiogKipQYXNzaXZlIGluY29tZSBmcm9tIGRhdGEgdmlzdWFsaXphdGlvbiByZWxhdGVkIHByb2R1Y3RzKioNCg0KIyMjIyBBc3NvY2lhdGUNCkFzc29jaWF0ZXMgYXJlIHRob3NlIHdobyBhcmUgbW9zdGx5IHdvcmtpbmcgaW4gYW4gb3JnYW5pemF0aW9uIChlLmcuIGVtcGxveWVlcykgd2l0aCBkYXRhdml6IHJlc3BvbnNpYmlsaXRpZXMuIFRoZXkgYXJlIHRob3NlIHdobyBoYXZlL2FyZToNCg0KKiAqKlBvc2l0aW9uIGluIGFuIG9yZ2FuaXphdGlvbiB3aXRoIHNvbWUgZGF0YXZpeiBqb2IgcmVzcG9uc2liaWxpdGllcyoqDQoqICoqQWNhZGVtaWMvVGVhY2hlcioqDQoNCiMjIyMgSG93IHdlIGNsYXNzaWZpZWQgd2hvIGJlbG9uZ3MgdG8gd2hpY2g/DQpXZSBwdXQgd2VpZ2h0ZWQgcG9pbnRzIG9uIHZhcmlhYmxlcyB3aGVyZSBhIHJlc3BvbmRlbnQgaGFzIGluZGljYXRlZCB0aGF0IHRoZXkgaWRlbnRpZmllZCB0aGVtc2VsdmVzIHdvcmtpbmcgb24gdGhlc2UgdHlwZSBvZiByb2xlcy4NCg0KU2luY2UgdGhlIG1ham9yaXR5IGhhcyBpbmRpY2F0ZWQgd29ya2luZyBpbiBhIHBvc2l0aW9uIGluIGFuIG9yZ2FuaXphdGlvbiAoKipEVlJvbGVzX0VtcGxveWVlKiopLCBXZWlnaHQgcG9pbnRzIHdlcmUgaW5jbHVkZWQgb24gdGhlIGhvYmJ5aXN0cyBhbmQgZnJlZWxhbmNlIHJvbGVzIHRvIGJhbGFuY2Ugb3V0IHRoZSBoZWF2eS1sZWFuaW5nIHRvd2FyZHMgYW4gZW1wbG95ZWUgcGVyc29uYS4gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIGFtYmlndWl0eSB0aGF0IGVpdGhlciBjYW4gYmUgY2xhc3NpZmllZCBmcm9tIHRoZSBvdGhlci4NCg0KVGhlbiwgdGhlc2UgcG9pbnRzIHdlcmUgYWRkZWQgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMgd2hpY2hldmVyIGlzIGhpZ2hlci4gVGhpcyBpcyBub3cgb3VyIG1ldHJpYyB0aGF0IHdvdWxkIGluZGljYXRlIHdoZXRoZXIgYW4gaW5kaXZpZHVhbCBsZWFuIHRvd2FyZHMgZWl0aGVyIGFuICoqSW5kZXBlbmRlbnQqKiBwZXJzb25hIG9yIGFuICoqQXNzb2NpYXRlKiogcGVyc29uYS4NCg0KKipJbmRlcGVuZGVudCoqDQoNCiogKiorMyoqIGlmIGhhcyBpZGVudGlmaWVkIGFzIGhvYmJ5aXN0ICgqKkRWUm9sZXNfSG9iYnlpc3QqKikNCiogKiorMioqIGlmIGhhcyBpZGVudGlmaWVkIGFzIGZyZWVsYW5jZS9jb25zdWx0YW50ICgqKkRWUm9sZXNfRnJlZWxhbmNlKiopDQoqICoqKzEqKiBpZiBoYXMgaWRlbnRpZmllZCBhcyBzdHVkZW50ICgqKkRWUm9sZXNfU3R1ZGVudCoqKQ0KKiAqKisxKiogaWYgaGFzIGlkZW50aWZpZWQgd2hvIGhhcyBwYXNzaXZlIGluY29tZSAoKipEVlJvbGVzX1Bhc3NpdmVJbmNvbWUqKikNCg0KKipBc3NvY2lhdGUqKg0KDQoqICoqKzEqKiBpZiBoYXMgaWRlbnRpZmllZCBhcyBlbXBsb3llZSAoKipEVlJvbGVzX0VtcGxveWVlKiopDQoqICoqKzEqKiBpZiBoYXMgaWRlbnRpZmllZCBhcyB0ZWFjaGVyICgqKkRWUm9sZXNfQWNhZGVtaWMqKikNCg0KKipBbWJpZ3VvdXMqKg0KDQoqIFRob3NlIHdob3NlIHdlaWdodGVkIHBvaW50cyBvbiBib3RoIEluZGVwZW5kZW50IGFuZCBBc3NvY2lhdGUgc2NvcmVzIHdlcmUgZXF1YWwuDQoNCg0KKipOZWFybHkgNjAlIGFyZSBBc3NvY2lhdGVzIHdoaWxlIGFyb3VuZCAzNyUgYXJlIEluZGVwZW5kZW50cyoqDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEuNSwgZWNobz1mYWxzZX0NCmdncGxvdChjb21taXRtZW50X3RhbGx5ICU+JQ0KICAgICAgICAgbXV0YXRlKENsYXNzID0gImNsYXNzIiksIA0KICAgICAgIGFlcyhDbGFzcywgblBlcmMsIGZpbGwgPSBDb21taXRtZW50KSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKA0KICAgIHggPSAiIiwNCiAgICB5ID0gIlBlcmNlbnQgb2YgdGhlIFJlc3BvbmRlbnRzIg0KICApDQpgYGANCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KQGltcG9ydCB1cmwoImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9Q3JpbXNvbitQcm86aXRhbCx3Z2h0QDAsMzAwOzAsNTAwOzAsNjAwOzEsNTAwOzEsNzAwJmZhbWlseT1Xb3JrK1NhbnM6aXRhbCx3Z2h0QDAsMzAwOzAsNDAwOzAsNTAwOzEsNTAwJmRpc3BsYXk9c3dhcCIpOw0KDQogIGgxLA0KICBoMiwNCiAgaDMsIA0KICBoNCB7DQogICAgZm9udC1mYW1pbHk6ICJDcmltc29uIFBybyIsIHNlcmlmOw0KICB9DQoNCiAgcCwNCiAgaW5wdXQsDQogIHRkLA0KICBsaSB7DQogICAgZm9udC1mYW1pbHk6ICJXb3JrIFNhbnMiLCBzYW5zLXNlcmlmOw0KICB9DQoNCmBgYA0KDQo=