In the wake of the Great Recession of 2009, there has been a good deal of focus on employment statistics, one of the most important metrics policymakers use to gauge the overall strength of the economy. In the United States, the government measures unemployment using the Current Population Survey (CPS), which collects demographic and employment information from a wide range of Americans each month. In this exercise, we will employ the topics reviewed in the lectures as well as a few new techniques using the September 2013 version of this rich, nationally representative dataset (available online).

The observations in the dataset represent people surveyed in the September 2013 CPS who actually completed a survey. While the full dataset has 385 variables, in this exercise we will use a more compact version of the dataset, CPSData.csv, which has the following variables:

PeopleInHousehold: The number of people in the interviewee’s household.

Region: The census region where the interviewee lives.

State: The state where the interviewee lives.

MetroAreaCode: A code that identifies the metropolitan area in which the interviewee lives (missing if the interviewee does not live in a metropolitan area). The mapping from codes to names of metropolitan areas is provided in the file MetroAreaCodes.csv.

Age: The age, in years, of the interviewee. 80 represents people aged 80-84, and 85 represents people aged 85 and higher.

Married: The marriage status of the interviewee.

Sex: The sex of the interviewee.

Education: The maximum level of education obtained by the interviewee.

Race: The race of the interviewee.

Hispanic: Whether the interviewee is of Hispanic ethnicity.

CountryOfBirthCode: A code identifying the country of birth of the interviewee. The mapping from codes to names of countries is provided in the file CountryCodes.csv.

Citizenship: The United States citizenship status of the interviewee.

EmploymentStatus: The status of employment of the interviewee.

Industry: The industry of employment of the interviewee (only available if they are employed).

Section 1 - Loading and Summarizing the Dataset

1.1

Load the dataset from CPSData.csv into a data frame called CPS, and view the dataset with the summary() and str() commands.

str(CPSData)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   131302 obs. of  14 variables:
 $ PeopleInHousehold : int  1 3 3 3 3 3 3 2 2 2 ...
 $ Region            : chr  "South" "South" "South" "South" ...
 $ State             : chr  "Alabama" "Alabama" "Alabama" "Alabama" ...
 $ MetroAreaCode     : int  26620 13820 13820 13820 26620 26620 26620 33660 33660 26620 ...
 $ Age               : int  85 21 37 18 52 24 26 71 43 52 ...
 $ Married           : chr  "Widowed" "Never Married" "Never Married" "Never Married" ...
 $ Sex               : chr  "Female" "Male" "Female" "Male" ...
 $ Education         : chr  "Associate degree" "High school" "High school" "No high school diploma" ...
 $ Race              : chr  "White" "Black" "Black" "Black" ...
 $ Hispanic          : int  0 0 0 0 0 0 0 0 0 0 ...
 $ CountryOfBirthCode: int  57 57 57 57 57 57 57 57 57 57 ...
 $ Citizenship       : chr  "Citizen, Native" "Citizen, Native" "Citizen, Native" "Citizen, Native" ...
 $ EmploymentStatus  : chr  "Retired" "Unemployed" "Disabled" "Not in Labor Force" ...
 $ Industry          : chr  NA "Professional and business services" NA NA ...
 - attr(*, "spec")=List of 2
  ..$ cols   :List of 14
  .. ..$ PeopleInHousehold : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Region            : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ State             : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ MetroAreaCode     : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Age               : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Married           : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Sex               : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Education         : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Race              : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Hispanic          : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ CountryOfBirthCode: list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ Citizenship       : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ EmploymentStatus  : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ Industry          : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  ..$ default: list()
  .. ..- attr(*, "class")= chr  "collector_guess" "collector"
  ..- attr(*, "class")= chr "col_spec"
131302
[1] 131302

1.2

Among the interviewees with a value reported for the Industry variable, what is the most common industry of employment? Please enter the name exactly how you see it.

sort(table(CPSData$Industry))

                               Armed forces                                      Mining 
                                         29                                         550 
Agriculture, forestry, fishing, and hunting                                 Information 
                                       1307                                        1328 
                      Public administration                              Other services 
                                       3186                                        3224 
               Transportation and utilities                                   Financial 
                                       3260                                        4347 
                               Construction                     Leisure and hospitality 
                                       4387                                        6364 
                              Manufacturing          Professional and business services 
                                       6791                                        7519 
                                      Trade             Educational and health services 
                                       8933                                       15017 
"Educational and health services"
[1] "Educational and health services"

1.3

Recall from the homework assignment “The Analytical Detective” that you can call the sort() function on the output of the table() function to obtain a sorted breakdown of a variable. For instance, sort(table(CPS$Region)) sorts the regions by the number of interviewees from that region.

Which state has the fewest interviewees?

sort(table(CPSData$State))

          New Mexico              Montana          Mississippi              Alabama 
                1102                 1214                 1230                 1376 
       West Virginia             Arkansas            Louisiana                Idaho 
                1409                 1421                 1450                 1518 
            Oklahoma              Arizona               Alaska              Wyoming 
                1523                 1528                 1590                 1624 
        North Dakota       South Carolina            Tennessee District of Columbia 
                1645                 1658                 1784                 1791 
            Kentucky                 Utah               Nevada              Vermont 
                1841                 1842                 1856                 1890 
              Kansas               Oregon             Nebraska        Massachusetts 
                1935                 1943                 1949                 1987 
        South Dakota              Indiana               Hawaii             Missouri 
                2000                 2004                 2099                 2145 
        Rhode Island             Delaware                Maine           Washington 
                2209                 2214                 2263                 2366 
                Iowa           New Jersey       North Carolina        New Hampshire 
                2528                 2567                 2619                 2662 
           Wisconsin              Georgia          Connecticut             Colorado 
                2686                 2807                 2836                 2925 
            Virginia             Michigan            Minnesota             Maryland 
                2953                 3063                 3139                 3200 
                Ohio             Illinois         Pennsylvania              Florida 
                3678                 3912                 3930                 5149 
            New York                Texas           California 
                5595                 7077                11570 

Which state has the largest number of interviewees?

"California"
[1] "California"

1.4

What proportion of interviewees are citizens of the United States?

table(CPSData$Citizenship)

     Citizen, Native Citizen, Naturalized          Non-Citizen 
              116639                 7073                 7590 
123712/131302
[1] 0.9421943

1.5

The CPS differentiates between race (with possible values American Indian, Asian, Black, Pacific Islander, White, or Multiracial) and ethnicity. A number of interviewees are of Hispanic ethnicity, as captured by the Hispanic variable. For which races are there at least 250 interviewees in the CPS dataset of Hispanic ethnicity? (Select all that apply.)

  • American Indian
  • Asian
  • Black
  • Multiracial
  • Pacific Islander
  • White
table(CPSData$Race, CPSData$Hispanic)
                  
                       0     1
  American Indian   1129   304
  Asian             6407   113
  Black            13292   621
  Multiracial       2449   448
  Pacific Islander   541    77
  White            89190 16731

Section 2 - Evaluating Missing Values

2.1

Which variables have at least one interviewee with a missing (NA) value? (Select all that apply.)

  • PeopleInHousehold
  • Region
  • State
  • MetroAreaCode
  • Age
  • Married
  • Sex
  • Education
  • Race
  • Hispanic
  • CountryOfBirthCode
  • Citizenship
  • EmploymentStatus
  • Industry
summary(CPSData)
 PeopleInHousehold    Region             State           MetroAreaCode        Age       
 Min.   : 1.000    Length:131302      Length:131302      Min.   :10420   Min.   : 0.00  
 1st Qu.: 2.000    Class :character   Class :character   1st Qu.:21780   1st Qu.:19.00  
 Median : 3.000    Mode  :character   Mode  :character   Median :34740   Median :39.00  
 Mean   : 3.284                                          Mean   :35075   Mean   :38.83  
 3rd Qu.: 4.000                                          3rd Qu.:41860   3rd Qu.:57.00  
 Max.   :15.000                                          Max.   :79600   Max.   :85.00  
                                                         NA's   :34238                  
   Married              Sex             Education             Race              Hispanic     
 Length:131302      Length:131302      Length:131302      Length:131302      Min.   :0.0000  
 Class :character   Class :character   Class :character   Class :character   1st Qu.:0.0000  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :0.0000  
                                                                             Mean   :0.1393  
                                                                             3rd Qu.:0.0000  
                                                                             Max.   :1.0000  
                                                                                             
 CountryOfBirthCode Citizenship        EmploymentStatus     Industry        
 Min.   : 57.00     Length:131302      Length:131302      Length:131302     
 1st Qu.: 57.00     Class :character   Class :character   Class :character  
 Median : 57.00     Mode  :character   Mode  :character   Mode  :character  
 Mean   : 82.68                                                             
 3rd Qu.: 57.00                                                             
 Max.   :555.00                                                             
                                                                            

2.2

Often when evaluating a new dataset, we try to identify if there is a pattern in the missing values in the dataset. We will try to determine if there is a pattern in the missing values of the Married variable. The function

is.na(CPS$Married) 

returns a vector of TRUE/FALSE values for whether the Married variable is missing. We can see the breakdown of whether Married is missing based on the reported value of the Region variable with the function

table(CPS$Region, is.na(CPS$Married))

Which is the most accurate:

  • The Married variable being missing is related to the Region value for the interviewee.
  • The Married variable being missing is related to the Sex value for the interviewee.
  • The Married variable being missing is related to the Age value for the interviewee.
  • The Married variable being missing is related to the Citizenship value for the interviewee.
  • The Married variable being missing is not related to the Region, Sex, Age, or Citizenship value for the interviewee.
table(CPSData$Region, is.na(CPSData$Married))
           
            FALSE  TRUE
  Midwest   24609  6075
  Northeast 21432  4507
  South     33535  7967
  West      26388  6789
table(CPSData$Sex, is.na(CPSData$Married))
        
         FALSE  TRUE
  Female 55264 12217
  Male   50700 13121

2.3

As mentioned in the variable descriptions, MetroAreaCode is missing if an interviewee does not live in a metropolitan area. Using the same technique as in the previous question, answer the following questions about people who live in non-metropolitan areas.

How many states had all interviewees living in a non-metropolitan area (aka they have a missing MetroAreaCode value)? For this question, treat the District of Columbia as a state (even though it is not technically a state).

 table(CPSData$State, is.na(CPSData$MetroAreaCode))
                      
                       FALSE  TRUE
  Alabama               1020   356
  Alaska                   0  1590
  Arizona               1327   201
  Arkansas               724   697
  California           11333   237
  Colorado              2545   380
  Connecticut           2593   243
  Delaware              1696   518
  District of Columbia  1791     0
  Florida               4947   202
  Georgia               2250   557
  Hawaii                1576   523
  Idaho                  761   757
  Illinois              3473   439
  Indiana               1420   584
  Iowa                  1297  1231
  Kansas                1234   701
  Kentucky               908   933
  Louisiana             1216   234
  Maine                  909  1354
  Maryland              2978   222
  Massachusetts         1858   129
  Michigan              2517   546
  Minnesota             2150   989
  Mississippi            376   854
  Missouri              1440   705
  Montana                199  1015
  Nebraska               816  1133
  Nevada                1609   247
  New Hampshire         1148  1514
  New Jersey            2567     0
  New Mexico             832   270
  New York              5144   451
  North Carolina        1642   977
  North Dakota           432  1213
  Ohio                  2754   924
  Oklahoma              1024   499
  Oregon                1519   424
  Pennsylvania          3245   685
  Rhode Island          2209     0
  South Carolina        1139   519
  South Dakota           595  1405
  Tennessee             1149   635
  Texas                 6060  1017
  Utah                  1455   387
  Vermont                657  1233
  Virginia              2367   586
  Washington            1937   429
  West Virginia          344  1065
  Wisconsin             1882   804
  Wyoming                  0  1624

How many states had all interviewees living in a metropolitan area? Again, treat the District of Columbia as a state.

 table(CPSData$State, is.na(CPSData$MetroAreaCode))
                      
                       FALSE  TRUE
  Alabama               1020   356
  Alaska                   0  1590
  Arizona               1327   201
  Arkansas               724   697
  California           11333   237
  Colorado              2545   380
  Connecticut           2593   243
  Delaware              1696   518
  District of Columbia  1791     0
  Florida               4947   202
  Georgia               2250   557
  Hawaii                1576   523
  Idaho                  761   757
  Illinois              3473   439
  Indiana               1420   584
  Iowa                  1297  1231
  Kansas                1234   701
  Kentucky               908   933
  Louisiana             1216   234
  Maine                  909  1354
  Maryland              2978   222
  Massachusetts         1858   129
  Michigan              2517   546
  Minnesota             2150   989
  Mississippi            376   854
  Missouri              1440   705
  Montana                199  1015
  Nebraska               816  1133
  Nevada                1609   247
  New Hampshire         1148  1514
  New Jersey            2567     0
  New Mexico             832   270
  New York              5144   451
  North Carolina        1642   977
  North Dakota           432  1213
  Ohio                  2754   924
  Oklahoma              1024   499
  Oregon                1519   424
  Pennsylvania          3245   685
  Rhode Island          2209     0
  South Carolina        1139   519
  South Dakota           595  1405
  Tennessee             1149   635
  Texas                 6060  1017
  Utah                  1455   387
  Vermont                657  1233
  Virginia              2367   586
  Washington            1937   429
  West Virginia          344  1065
  Wisconsin             1882   804
  Wyoming                  0  1624

2.4

Which region of the United States has the largest proportion of interviewees living in a non-metropolitan area?

  • Midwest
  • Northeast
  • South
  • West
table(CPSData$Region, is.na(CPSData$MetroAreaCode))
           
            FALSE  TRUE
  Midwest   20010 10674
  Northeast 20330  5609
  South     31631  9871
  West      25093  8084

2.5

While we were able to use the table() command to compute the proportion of interviewees from each region not living in a metropolitan area, it was somewhat tedious (it involved manually computing the proportion for each region) and isn’t something you would want to do if there were a larger number of options. It turns out there is a less tedious way to compute the proportion of values that are TRUE. The mean() function, which takes the average of the values passed to it, will treat TRUE as 1 and FALSE as 0, meaning it returns the proportion of values that are true. For instance, mean(c(TRUE, FALSE, TRUE, TRUE)) returns 0.75. Knowing this, use tapply() with the mean function to answer the following questions:

Which state has a proportion of interviewees living in a non-metropolitan area closest to 30%?

sort(tapply(is.na(CPSData$MetroAreaCode), CPSData$State, mean))
District of Columbia           New Jersey         Rhode Island           California 
          0.00000000           0.00000000           0.00000000           0.02048401 
             Florida        Massachusetts             Maryland             New York 
          0.03923092           0.06492199           0.06937500           0.08060769 
         Connecticut             Illinois             Colorado              Arizona 
          0.08568406           0.11221881           0.12991453           0.13154450 
              Nevada                Texas            Louisiana         Pennsylvania 
          0.13308190           0.14370496           0.16137931           0.17430025 
            Michigan           Washington              Georgia             Virginia 
          0.17825661           0.18131868           0.19843249           0.19844226 
                Utah               Oregon             Delaware           New Mexico 
          0.21009772           0.21821925           0.23396567           0.24500907 
              Hawaii                 Ohio              Alabama              Indiana 
          0.24916627           0.25122349           0.25872093           0.29141717 
           Wisconsin       South Carolina            Minnesota             Oklahoma 
          0.29932986           0.31302774           0.31506849           0.32764281 
            Missouri            Tennessee               Kansas       North Carolina 
          0.32867133           0.35594170           0.36227390           0.37304315 
                Iowa             Arkansas                Idaho             Kentucky 
          0.48694620           0.49049965           0.49868248           0.50678979 
       New Hampshire             Nebraska                Maine              Vermont 
          0.56874530           0.58132376           0.59832081           0.65238095 
         Mississippi         South Dakota         North Dakota        West Virginia 
          0.69430894           0.70250000           0.73738602           0.75585522 
             Montana               Alaska              Wyoming 
          0.83607908           1.00000000           1.00000000 

Which state has the largest proportion of non-metropolitan interviewees, ignoring states where all interviewees were non-metropolitan?

Section 3 - Integrating Metropolitan Area Data

Codes like MetroAreaCode and CountryOfBirthCode are a compact way to encode factor variables with text as their possible values, and they are therefore quite common in survey datasets. In fact, all but one of the variables in this dataset were actually stored by a numeric code in the original CPS datafile.

When analyzing a variable stored by a numeric code, we will often want to convert it into the values the codes represent. To do this, we will use a dictionary, which maps the the code to the actual value of the variable. We have provided dictionaries MetroAreaCodes.csv and CountryCodes.csv, which respectively map MetroAreaCode and CountryOfBirthCode into their true values. Read these two dictionaries into data frames MetroAreaMap and CountryMap.

3.1

How many observations (codes for metropolitan areas) are there in MetroAreaMap?

How many observations (codes for countries) are there in CountryMap?

3.2

To merge in the metropolitan areas, we want to connect the field MetroAreaCode from the CPS data frame with the field Code in MetroAreaMap. The following command merges the two data frames on these columns, overwriting the CPS data frame with the result:

CPS = merge(CPS, MetroAreaMap, by.x="MetroAreaCode", by.y="Code", all.x=TRUE)

The first two arguments determine the data frames to be merged (they are called “x” and “y”, respectively, in the subsequent parameters to the merge function). by.x=“MetroAreaCode” means we’re matching on the MetroAreaCode variable from the “x” data frame (CPS), while by.y=“Code” means we’re matching on the Code variable from the “y” data frame (MetroAreaMap). Finally, all.x=TRUE means we want to keep all rows from the “x” data frame (CPS), even if some of the rows’ MetroAreaCode doesn’t match any codes in MetroAreaMap (for those familiar with database terminology, this parameter makes the operation a left outer join instead of an inner join).

Review the new version of the CPS data frame with the summary() and str() functions. What is the name of the variable that was added to the data frame by the merge() operation?

How many interviewees have a missing value for the new metropolitan area variable? Note that all of these interviewees would have been removed from the merged data frame if we did not include the all.x=TRUE parameter.

3.3

Which of the following metropolitan areas has the largest number of interviewees?

  • Atlanta-Sandy Springs-Marietta, GA
  • Baltimore-Towson, MD
  • Boston-Cambridge-Quincy, MA-NH
  • San Francisco-Oakland-Fremont, CA

3.4

Which metropolitan area has the highest proportion of interviewees of Hispanic ethnicity? Hint: Use tapply() with mean, as in the previous subproblem. Calling sort() on the output of tapply() could also be helpful here.

3.5

Remembering that CPS$Race == “Asian” returns a TRUE/FALSE vector of whether an interviewee is Asian, determine the number of metropolitan areas in the United States from which at least 20% of interviewees are Asian.

3.6

Normally, we would look at the sorted proportion of interviewees from each metropolitan area who have not received a high school diploma with the command:

sort(tapply(CPS$Education == "No high school diploma", CPS$MetroArea, mean))

However, none of the interviewees aged 14 and younger have an education value reported, so the mean value is reported as NA for each metropolitan area. To get mean (and related functions, like sum) to ignore missing values, you can pass the parameter na.rm=TRUE. Passing na.rm=TRUE to the tapply function, determine which metropolitan area has the smallest proportion of interviewees who have received no high school diploma.

Section 4 - Integrating Country of Birth Data

Just as we did with the metropolitan area information, merge in the country of birth information from the CountryMap data frame, replacing the CPS data frame with the result. If you accidentally overwrite CPS with the wrong values, remember that you can restore it by re-loading the data frame from CPSData.csv and then merging in the metropolitan area information using the command provided in the previous subproblem.

4.1

What is the name of the variable added to the CPS data frame by this merge operation?

How many interviewees have a missing value for the new country of birth variable?

4.2

Among all interviewees born outside of North America, which country was the most common place of birth?

4.3

What proportion of the interviewees from the “New York-Northern New Jersey-Long Island, NY-NJ-PA” metropolitan area have a country of birth that is not the United States? For this computation, don’t include people from this metropolitan area who have a missing country of birth.

4.4

Which metropolitan area has the largest number (note – not proportion) of interviewees with a country of birth in India? Hint – remember to include na.rm=TRUE if you are using tapply() to answer this question.

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV

In Brazil?

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV

In Somalia?

  • Boston-Cambridge-Quincy, MA-NH
  • Minneapolis-St Paul-Bloomington, MN-WI
  • New York-Northern New Jersey-Long Island, NY-NJ-PA
  • Washington-Arlington-Alexandria, DC-VA-MD-WV
LS0tDQp0aXRsZTogIkFTMS0zIERlbW9ncmFwaGljcyBhbmQgRW1wbG95bWVudCBpbiB0aGUgVW5pdGVkIFN0YXRlcyINCmF1dGhvcjogIjxuYW1lPiA8c3R1ZGVudCBJRD4iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotIC0gLQ0KSW4gdGhlIHdha2Ugb2YgdGhlIEdyZWF0IFJlY2Vzc2lvbiBvZiAyMDA5LCB0aGVyZSBoYXMgYmVlbiBhIGdvb2QgZGVhbCBvZiBmb2N1cyBvbiBlbXBsb3ltZW50IHN0YXRpc3RpY3MsIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgbWV0cmljcyBwb2xpY3ltYWtlcnMgdXNlIHRvIGdhdWdlIHRoZSBvdmVyYWxsIHN0cmVuZ3RoIG9mIHRoZSBlY29ub215LiBJbiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIGdvdmVybm1lbnQgbWVhc3VyZXMgdW5lbXBsb3ltZW50IHVzaW5nIHRoZSBDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5IChDUFMpLCB3aGljaCBjb2xsZWN0cyBkZW1vZ3JhcGhpYyBhbmQgZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgd2lkZSByYW5nZSBvZiBBbWVyaWNhbnMgZWFjaCBtb250aC4gSW4gdGhpcyBleGVyY2lzZSwgd2Ugd2lsbCBlbXBsb3kgdGhlIHRvcGljcyByZXZpZXdlZCBpbiB0aGUgbGVjdHVyZXMgYXMgd2VsbCBhcyBhIGZldyBuZXcgdGVjaG5pcXVlcyB1c2luZyB0aGUgU2VwdGVtYmVyIDIwMTMgdmVyc2lvbiBvZiB0aGlzIHJpY2gsIG5hdGlvbmFsbHkgcmVwcmVzZW50YXRpdmUgZGF0YXNldCAoYXZhaWxhYmxlIG9ubGluZSkuDQoNClRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRhdGFzZXQgcmVwcmVzZW50IHBlb3BsZSBzdXJ2ZXllZCBpbiB0aGUgU2VwdGVtYmVyIDIwMTMgQ1BTIHdobyBhY3R1YWxseSBjb21wbGV0ZWQgYSBzdXJ2ZXkuIFdoaWxlIHRoZSBmdWxsIGRhdGFzZXQgaGFzIDM4NSB2YXJpYWJsZXMsIGluIHRoaXMgZXhlcmNpc2Ugd2Ugd2lsbCB1c2UgYSBtb3JlIGNvbXBhY3QgdmVyc2lvbiBvZiB0aGUgZGF0YXNldCwgQ1BTRGF0YS5jc3YsIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoNCg0KUGVvcGxlSW5Ib3VzZWhvbGQ6IFRoZSBudW1iZXIgb2YgcGVvcGxlIGluIHRoZSBpbnRlcnZpZXdlZSdzIGhvdXNlaG9sZC4NCg0KUmVnaW9uOiBUaGUgY2Vuc3VzIHJlZ2lvbiB3aGVyZSB0aGUgaW50ZXJ2aWV3ZWUgbGl2ZXMuDQoNClN0YXRlOiBUaGUgc3RhdGUgd2hlcmUgdGhlIGludGVydmlld2VlIGxpdmVzLg0KDQpNZXRyb0FyZWFDb2RlOiBBIGNvZGUgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXRyb3BvbGl0YW4gYXJlYSBpbiB3aGljaCB0aGUgaW50ZXJ2aWV3ZWUgbGl2ZXMgKG1pc3NpbmcgaWYgdGhlIGludGVydmlld2VlIGRvZXMgbm90IGxpdmUgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYSkuIFRoZSBtYXBwaW5nIGZyb20gY29kZXMgdG8gbmFtZXMgb2YgbWV0cm9wb2xpdGFuIGFyZWFzIGlzIHByb3ZpZGVkIGluIHRoZSBmaWxlIE1ldHJvQXJlYUNvZGVzLmNzdi4NCg0KQWdlOiBUaGUgYWdlLCBpbiB5ZWFycywgb2YgdGhlIGludGVydmlld2VlLiA4MCByZXByZXNlbnRzIHBlb3BsZSBhZ2VkIDgwLTg0LCBhbmQgODUgcmVwcmVzZW50cyBwZW9wbGUgYWdlZCA4NSBhbmQgaGlnaGVyLg0KDQpNYXJyaWVkOiBUaGUgbWFycmlhZ2Ugc3RhdHVzIG9mIHRoZSBpbnRlcnZpZXdlZS4NCg0KU2V4OiBUaGUgc2V4IG9mIHRoZSBpbnRlcnZpZXdlZS4NCg0KRWR1Y2F0aW9uOiBUaGUgbWF4aW11bSBsZXZlbCBvZiBlZHVjYXRpb24gb2J0YWluZWQgYnkgdGhlIGludGVydmlld2VlLg0KDQpSYWNlOiBUaGUgcmFjZSBvZiB0aGUgaW50ZXJ2aWV3ZWUuDQoNCkhpc3BhbmljOiBXaGV0aGVyIHRoZSBpbnRlcnZpZXdlZSBpcyBvZiBIaXNwYW5pYyBldGhuaWNpdHkuDQoNCkNvdW50cnlPZkJpcnRoQ29kZTogQSBjb2RlIGlkZW50aWZ5aW5nIHRoZSBjb3VudHJ5IG9mIGJpcnRoIG9mIHRoZSBpbnRlcnZpZXdlZS4gVGhlIG1hcHBpbmcgZnJvbSBjb2RlcyB0byBuYW1lcyBvZiBjb3VudHJpZXMgaXMgcHJvdmlkZWQgaW4gdGhlIGZpbGUgQ291bnRyeUNvZGVzLmNzdi4NCg0KQ2l0aXplbnNoaXA6IFRoZSBVbml0ZWQgU3RhdGVzIGNpdGl6ZW5zaGlwIHN0YXR1cyBvZiB0aGUgaW50ZXJ2aWV3ZWUuDQoNCkVtcGxveW1lbnRTdGF0dXM6IFRoZSBzdGF0dXMgb2YgZW1wbG95bWVudCBvZiB0aGUgaW50ZXJ2aWV3ZWUuDQoNCkluZHVzdHJ5OiBUaGUgaW5kdXN0cnkgb2YgZW1wbG95bWVudCBvZiB0aGUgaW50ZXJ2aWV3ZWUgKG9ubHkgYXZhaWxhYmxlIGlmIHRoZXkgYXJlIGVtcGxveWVkKS4NCg0KDQojIyMgU2VjdGlvbiAxIC0gTG9hZGluZyBhbmQgU3VtbWFyaXppbmcgdGhlIERhdGFzZXQNCg0KIyMjIyAxLjEgDQpMb2FkIHRoZSBkYXRhc2V0IGZyb20gQ1BTRGF0YS5jc3YgaW50byBhIGRhdGEgZnJhbWUgY2FsbGVkIENQUywgYW5kIHZpZXcgdGhlIGRhdGFzZXQgd2l0aCB0aGUgc3VtbWFyeSgpIGFuZCBzdHIoKSBjb21tYW5kcy4NCg0KYGBge3J9DQpzdHIoQ1BTRGF0YSkNCjEzMTMwMg0KYGBgDQoNCg0KIyMjIyAxLjIgDQpBbW9uZyB0aGUgaW50ZXJ2aWV3ZWVzIHdpdGggYSB2YWx1ZSByZXBvcnRlZCBmb3IgdGhlIEluZHVzdHJ5IHZhcmlhYmxlLCB3aGF0IGlzIHRoZSBtb3N0IGNvbW1vbiBpbmR1c3RyeSBvZiBlbXBsb3ltZW50PyBQbGVhc2UgZW50ZXIgdGhlIG5hbWUgZXhhY3RseSBob3cgeW91IHNlZSBpdC4NCmBgYHtyfQ0Kc29ydCh0YWJsZShDUFNEYXRhJEluZHVzdHJ5KSkNCiJFZHVjYXRpb25hbCBhbmQgaGVhbHRoIHNlcnZpY2VzIg0KYGBgDQoNCg0KIyMjIyAxLjMgDQpSZWNhbGwgZnJvbSB0aGUgaG9tZXdvcmsgYXNzaWdubWVudCAiVGhlIEFuYWx5dGljYWwgRGV0ZWN0aXZlIiB0aGF0IHlvdSBjYW4gY2FsbCB0aGUgc29ydCgpIGZ1bmN0aW9uIG9uIHRoZSBvdXRwdXQgb2YgdGhlIHRhYmxlKCkgZnVuY3Rpb24gdG8gb2J0YWluIGEgc29ydGVkIGJyZWFrZG93biBvZiBhIHZhcmlhYmxlLiBGb3IgaW5zdGFuY2UsIHNvcnQodGFibGUoQ1BTJFJlZ2lvbikpIHNvcnRzIHRoZSByZWdpb25zIGJ5IHRoZSBudW1iZXIgb2YgaW50ZXJ2aWV3ZWVzIGZyb20gdGhhdCByZWdpb24uDQoNCldoaWNoIHN0YXRlIGhhcyB0aGUgZmV3ZXN0IGludGVydmlld2Vlcz8NCg0KYGBge3J9DQpzb3J0KHRhYmxlKENQU0RhdGEkU3RhdGUpKQ0KIk5ldyBNZXhpY28iDQpgYGANCg0KV2hpY2ggc3RhdGUgaGFzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBpbnRlcnZpZXdlZXM/DQoNCmBgYHtyfQ0KIkNhbGlmb3JuaWEiDQpgYGANCg0KDQojIyMjIDEuNCANCldoYXQgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgYXJlIGNpdGl6ZW5zIG9mIHRoZSBVbml0ZWQgU3RhdGVzPw0KYGBge3J9DQp0YWJsZShDUFNEYXRhJENpdGl6ZW5zaGlwKQ0KMTIzNzEyLzEzMTMwMg0KYGBgDQoNCiMjIyMgMS41IA0KVGhlIENQUyBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIHJhY2UgKHdpdGggcG9zc2libGUgdmFsdWVzIEFtZXJpY2FuIEluZGlhbiwgQXNpYW4sIEJsYWNrLCBQYWNpZmljIElzbGFuZGVyLCBXaGl0ZSwgb3IgTXVsdGlyYWNpYWwpIGFuZCBldGhuaWNpdHkuIEEgbnVtYmVyIG9mIGludGVydmlld2VlcyBhcmUgb2YgSGlzcGFuaWMgZXRobmljaXR5LCBhcyBjYXB0dXJlZCBieSB0aGUgSGlzcGFuaWMgdmFyaWFibGUuIEZvciB3aGljaCByYWNlcyBhcmUgdGhlcmUgYXQgbGVhc3QgMjUwIGludGVydmlld2VlcyBpbiB0aGUgQ1BTIGRhdGFzZXQgb2YgSGlzcGFuaWMgZXRobmljaXR5PyAoU2VsZWN0IGFsbCB0aGF0IGFwcGx5LikNCg0KKyBBbWVyaWNhbiBJbmRpYW4NCisgQXNpYW4NCisgQmxhY2sNCisgTXVsdGlyYWNpYWwNCisgUGFjaWZpYyBJc2xhbmRlcg0KKyBXaGl0ZQ0KDQpgYGB7cn0NCnRhYmxlKENQU0RhdGEkUmFjZSwgQ1BTRGF0YSRIaXNwYW5pYykNCmBgYA0KDQoNCiMjIyBTZWN0aW9uIDIgLSBFdmFsdWF0aW5nIE1pc3NpbmcgVmFsdWVzDQoNCiMjIyMgMi4xDQoNCldoaWNoIHZhcmlhYmxlcyBoYXZlIGF0IGxlYXN0IG9uZSBpbnRlcnZpZXdlZSB3aXRoIGEgbWlzc2luZyAoTkEpIHZhbHVlPyAoU2VsZWN0IGFsbCB0aGF0IGFwcGx5LikNCg0KKyBQZW9wbGVJbkhvdXNlaG9sZA0KKyBSZWdpb24NCisgU3RhdGUNCisgTWV0cm9BcmVhQ29kZQ0KKyBBZ2UNCisgTWFycmllZA0KKyBTZXgNCisgRWR1Y2F0aW9uDQorIFJhY2UNCisgSGlzcGFuaWMNCisgQ291bnRyeU9mQmlydGhDb2RlDQorIENpdGl6ZW5zaGlwDQorIEVtcGxveW1lbnRTdGF0dXMNCisgSW5kdXN0cnkNCg0KYGBge3J9DQpzdW1tYXJ5KENQU0RhdGEpDQpgYGANCg0KDQojIyMjIDIuMiANCg0KT2Z0ZW4gd2hlbiBldmFsdWF0aW5nIGEgbmV3IGRhdGFzZXQsIHdlIHRyeSB0byBpZGVudGlmeSBpZiB0aGVyZSBpcyBhIHBhdHRlcm4gaW4gdGhlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBkYXRhc2V0LiBXZSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBwYXR0ZXJuIGluIHRoZSBtaXNzaW5nIHZhbHVlcyBvZiB0aGUgTWFycmllZCB2YXJpYWJsZS4gVGhlIGZ1bmN0aW9uICAgDQoNCiAgICBpcy5uYShDUFMkTWFycmllZCkgDQoNCnJldHVybnMgYSB2ZWN0b3Igb2YgVFJVRS9GQUxTRSB2YWx1ZXMgZm9yIHdoZXRoZXIgdGhlIE1hcnJpZWQgdmFyaWFibGUgaXMgbWlzc2luZy4gV2UgY2FuIHNlZSB0aGUgYnJlYWtkb3duIG9mIHdoZXRoZXIgTWFycmllZCBpcyBtaXNzaW5nIGJhc2VkIG9uIHRoZSByZXBvcnRlZCB2YWx1ZSBvZiB0aGUgUmVnaW9uIHZhcmlhYmxlIHdpdGggdGhlIGZ1bmN0aW9uIA0KDQogICAgdGFibGUoQ1BTJFJlZ2lvbiwgaXMubmEoQ1BTJE1hcnJpZWQpKQ0KDQpXaGljaCBpcyB0aGUgbW9zdCBhY2N1cmF0ZToNCg0KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIFJlZ2lvbiB2YWx1ZSBmb3IgdGhlIGludGVydmlld2VlLg0KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIFNleCB2YWx1ZSBmb3IgdGhlIGludGVydmlld2VlLg0KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIEFnZSB2YWx1ZSBmb3IgdGhlIGludGVydmlld2VlLg0KKyBUaGUgTWFycmllZCB2YXJpYWJsZSBiZWluZyBtaXNzaW5nIGlzIHJlbGF0ZWQgdG8gdGhlIENpdGl6ZW5zaGlwIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQorIFRoZSBNYXJyaWVkIHZhcmlhYmxlIGJlaW5nIG1pc3NpbmcgaXMgbm90IHJlbGF0ZWQgdG8gdGhlIFJlZ2lvbiwgU2V4LCBBZ2UsIG9yIENpdGl6ZW5zaGlwIHZhbHVlIGZvciB0aGUgaW50ZXJ2aWV3ZWUuDQoNCmBgYHtyfQ0KdGFibGUoQ1BTRGF0YSRSZWdpb24sIGlzLm5hKENQU0RhdGEkTWFycmllZCkpDQp0YWJsZShDUFNEYXRhJFNleCwgaXMubmEoQ1BTRGF0YSRNYXJyaWVkKSkNCmBgYA0KDQoNCiMjIyMgMi4zDQpBcyBtZW50aW9uZWQgaW4gdGhlIHZhcmlhYmxlIGRlc2NyaXB0aW9ucywgTWV0cm9BcmVhQ29kZSBpcyBtaXNzaW5nIGlmIGFuIGludGVydmlld2VlIGRvZXMgbm90IGxpdmUgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYS4gVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGFib3V0IHBlb3BsZSB3aG8gbGl2ZSBpbiBub24tbWV0cm9wb2xpdGFuIGFyZWFzLg0KDQpIb3cgbWFueSBzdGF0ZXMgaGFkIGFsbCBpbnRlcnZpZXdlZXMgbGl2aW5nIGluIGEgbm9uLW1ldHJvcG9saXRhbiBhcmVhIChha2EgdGhleSBoYXZlIGEgbWlzc2luZyBNZXRyb0FyZWFDb2RlIHZhbHVlKT8gRm9yIHRoaXMgcXVlc3Rpb24sIHRyZWF0IHRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYSBhcyBhIHN0YXRlIChldmVuIHRob3VnaCBpdCBpcyBub3QgdGVjaG5pY2FsbHkgYSBzdGF0ZSkuDQoNCg0KYGBge3J9DQogdGFibGUoQ1BTRGF0YSRTdGF0ZSwgaXMubmEoQ1BTRGF0YSRNZXRyb0FyZWFDb2RlKSkNCmBgYA0KDQoNCkhvdyBtYW55IHN0YXRlcyBoYWQgYWxsIGludGVydmlld2VlcyBsaXZpbmcgaW4gYSBtZXRyb3BvbGl0YW4gYXJlYT8gQWdhaW4sIHRyZWF0IHRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYSBhcyBhIHN0YXRlLg0KDQpgYGB7cn0NCiB0YWJsZShDUFNEYXRhJFN0YXRlLCBpcy5uYShDUFNEYXRhJE1ldHJvQXJlYUNvZGUpKQ0KYGBgDQoNCiMjIyMgMi40IA0KV2hpY2ggcmVnaW9uIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGhhcyB0aGUgbGFyZ2VzdCBwcm9wb3J0aW9uIG9mIGludGVydmlld2VlcyBsaXZpbmcgaW4gYSBub24tbWV0cm9wb2xpdGFuIGFyZWE/DQoNCisgTWlkd2VzdA0KKyBOb3J0aGVhc3QNCisgU291dGgNCisgV2VzdA0KDQpgYGB7cn0NCnRhYmxlKENQU0RhdGEkUmVnaW9uLCBpcy5uYShDUFNEYXRhJE1ldHJvQXJlYUNvZGUpKQ0KYGBgDQoNCiMjIyMgMi41IA0KV2hpbGUgd2Ugd2VyZSBhYmxlIHRvIHVzZSB0aGUgdGFibGUoKSBjb21tYW5kIHRvIGNvbXB1dGUgdGhlIHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIGZyb20gZWFjaCByZWdpb24gbm90IGxpdmluZyBpbiBhIG1ldHJvcG9saXRhbiBhcmVhLCBpdCB3YXMgc29tZXdoYXQgdGVkaW91cyAoaXQgaW52b2x2ZWQgbWFudWFsbHkgY29tcHV0aW5nIHRoZSBwcm9wb3J0aW9uIGZvciBlYWNoIHJlZ2lvbikgYW5kIGlzbid0IHNvbWV0aGluZyB5b3Ugd291bGQgd2FudCB0byBkbyBpZiB0aGVyZSB3ZXJlIGEgbGFyZ2VyIG51bWJlciBvZiBvcHRpb25zLiBJdCB0dXJucyBvdXQgdGhlcmUgaXMgYSBsZXNzIHRlZGlvdXMgd2F5IHRvIGNvbXB1dGUgdGhlIHByb3BvcnRpb24gb2YgdmFsdWVzIHRoYXQgYXJlIFRSVUUuIFRoZSBtZWFuKCkgZnVuY3Rpb24sIHdoaWNoIHRha2VzIHRoZSBhdmVyYWdlIG9mIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIGl0LCB3aWxsIHRyZWF0IFRSVUUgYXMgMSBhbmQgRkFMU0UgYXMgMCwgbWVhbmluZyBpdCByZXR1cm5zIHRoZSBwcm9wb3J0aW9uIG9mIHZhbHVlcyB0aGF0IGFyZSB0cnVlLiBGb3IgaW5zdGFuY2UsIG1lYW4oYyhUUlVFLCBGQUxTRSwgVFJVRSwgVFJVRSkpIHJldHVybnMgMC43NS4gS25vd2luZyB0aGlzLCB1c2UgdGFwcGx5KCkgd2l0aCB0aGUgbWVhbiBmdW5jdGlvbiB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnM6DQoNCldoaWNoIHN0YXRlIGhhcyBhIHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIGxpdmluZyBpbiBhIG5vbi1tZXRyb3BvbGl0YW4gYXJlYSBjbG9zZXN0IHRvIDMwJT8NCg0KYGBge3J9DQpzb3J0KHRhcHBseShpcy5uYShDUFNEYXRhJE1ldHJvQXJlYUNvZGUpLCBDUFNEYXRhJFN0YXRlLCBtZWFuKSkNCmBgYA0KDQoNCldoaWNoIHN0YXRlIGhhcyB0aGUgbGFyZ2VzdCBwcm9wb3J0aW9uIG9mIG5vbi1tZXRyb3BvbGl0YW4gaW50ZXJ2aWV3ZWVzLCBpZ25vcmluZyBzdGF0ZXMgd2hlcmUgYWxsIGludGVydmlld2VlcyB3ZXJlIG5vbi1tZXRyb3BvbGl0YW4/DQoNCg0KYGBge3J9DQoNCmBgYA0KDQojIyMgU2VjdGlvbiAzIC0gSW50ZWdyYXRpbmcgTWV0cm9wb2xpdGFuIEFyZWEgRGF0YQ0KDQpDb2RlcyBsaWtlIE1ldHJvQXJlYUNvZGUgYW5kIENvdW50cnlPZkJpcnRoQ29kZSBhcmUgYSBjb21wYWN0IHdheSB0byBlbmNvZGUgZmFjdG9yIHZhcmlhYmxlcyB3aXRoIHRleHQgYXMgdGhlaXIgcG9zc2libGUgdmFsdWVzLCBhbmQgdGhleSBhcmUgdGhlcmVmb3JlIHF1aXRlIGNvbW1vbiBpbiBzdXJ2ZXkgZGF0YXNldHMuIEluIGZhY3QsIGFsbCBidXQgb25lIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhpcyBkYXRhc2V0IHdlcmUgYWN0dWFsbHkgc3RvcmVkIGJ5IGEgbnVtZXJpYyBjb2RlIGluIHRoZSBvcmlnaW5hbCBDUFMgZGF0YWZpbGUuDQoNCldoZW4gYW5hbHl6aW5nIGEgdmFyaWFibGUgc3RvcmVkIGJ5IGEgbnVtZXJpYyBjb2RlLCB3ZSB3aWxsIG9mdGVuIHdhbnQgdG8gY29udmVydCBpdCBpbnRvIHRoZSB2YWx1ZXMgdGhlIGNvZGVzIHJlcHJlc2VudC4gVG8gZG8gdGhpcywgd2Ugd2lsbCB1c2UgYSBkaWN0aW9uYXJ5LCB3aGljaCBtYXBzIHRoZSB0aGUgY29kZSB0byB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4gV2UgaGF2ZSBwcm92aWRlZCBkaWN0aW9uYXJpZXMgTWV0cm9BcmVhQ29kZXMuY3N2IGFuZCBDb3VudHJ5Q29kZXMuY3N2LCB3aGljaCByZXNwZWN0aXZlbHkgbWFwIE1ldHJvQXJlYUNvZGUgYW5kIENvdW50cnlPZkJpcnRoQ29kZSBpbnRvIHRoZWlyIHRydWUgdmFsdWVzLiBSZWFkIHRoZXNlIHR3byBkaWN0aW9uYXJpZXMgaW50byBkYXRhIGZyYW1lcyBNZXRyb0FyZWFNYXAgYW5kIENvdW50cnlNYXAuDQoNCiMjIyMgMy4xDQoNCkhvdyBtYW55IG9ic2VydmF0aW9ucyAoY29kZXMgZm9yIG1ldHJvcG9saXRhbiBhcmVhcykgYXJlIHRoZXJlIGluIE1ldHJvQXJlYU1hcD8NCg0KYGBge3J9DQoNCmBgYA0KDQpIb3cgbWFueSBvYnNlcnZhdGlvbnMgKGNvZGVzIGZvciBjb3VudHJpZXMpIGFyZSB0aGVyZSBpbiBDb3VudHJ5TWFwPw0KDQpgYGB7cn0NCg0KYGBgDQoNCg0KIyMjIyAzLjINClRvIG1lcmdlIGluIHRoZSBtZXRyb3BvbGl0YW4gYXJlYXMsIHdlIHdhbnQgdG8gY29ubmVjdCB0aGUgZmllbGQgTWV0cm9BcmVhQ29kZSBmcm9tIHRoZSBDUFMgZGF0YSBmcmFtZSB3aXRoIHRoZSBmaWVsZCBDb2RlIGluIE1ldHJvQXJlYU1hcC4gVGhlIGZvbGxvd2luZyBjb21tYW5kIG1lcmdlcyB0aGUgdHdvIGRhdGEgZnJhbWVzIG9uIHRoZXNlIGNvbHVtbnMsIG92ZXJ3cml0aW5nIHRoZSBDUFMgZGF0YSBmcmFtZSB3aXRoIHRoZSByZXN1bHQ6DQoNCiAgICBDUFMgPSBtZXJnZShDUFMsIE1ldHJvQXJlYU1hcCwgYnkueD0iTWV0cm9BcmVhQ29kZSIsIGJ5Lnk9IkNvZGUiLCBhbGwueD1UUlVFKQ0KDQpUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBkZXRlcm1pbmUgdGhlIGRhdGEgZnJhbWVzIHRvIGJlIG1lcmdlZCAodGhleSBhcmUgY2FsbGVkICJ4IiBhbmQgInkiLCByZXNwZWN0aXZlbHksIGluIHRoZSBzdWJzZXF1ZW50IHBhcmFtZXRlcnMgdG8gdGhlIG1lcmdlIGZ1bmN0aW9uKS4gYnkueD0iTWV0cm9BcmVhQ29kZSIgbWVhbnMgd2UncmUgbWF0Y2hpbmcgb24gdGhlIE1ldHJvQXJlYUNvZGUgdmFyaWFibGUgZnJvbSB0aGUgIngiIGRhdGEgZnJhbWUgKENQUyksIHdoaWxlIGJ5Lnk9IkNvZGUiIG1lYW5zIHdlJ3JlIG1hdGNoaW5nIG9uIHRoZSBDb2RlIHZhcmlhYmxlIGZyb20gdGhlICJ5IiBkYXRhIGZyYW1lIChNZXRyb0FyZWFNYXApLiBGaW5hbGx5LCBhbGwueD1UUlVFIG1lYW5zIHdlIHdhbnQgdG8ga2VlcCBhbGwgcm93cyBmcm9tIHRoZSAieCIgZGF0YSBmcmFtZSAoQ1BTKSwgZXZlbiBpZiBzb21lIG9mIHRoZSByb3dzJyBNZXRyb0FyZWFDb2RlIGRvZXNuJ3QgbWF0Y2ggYW55IGNvZGVzIGluIE1ldHJvQXJlYU1hcCAoZm9yIHRob3NlIGZhbWlsaWFyIHdpdGggZGF0YWJhc2UgdGVybWlub2xvZ3ksIHRoaXMgcGFyYW1ldGVyIG1ha2VzIHRoZSBvcGVyYXRpb24gYSBsZWZ0IG91dGVyIGpvaW4gaW5zdGVhZCBvZiBhbiBpbm5lciBqb2luKS4NCg0KUmV2aWV3IHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgQ1BTIGRhdGEgZnJhbWUgd2l0aCB0aGUgc3VtbWFyeSgpIGFuZCBzdHIoKSBmdW5jdGlvbnMuIFdoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBkYXRhIGZyYW1lIGJ5IHRoZSBtZXJnZSgpIG9wZXJhdGlvbj8NCg0KDQpgYGB7cn0NCg0KYGBgDQoNCkhvdyBtYW55IGludGVydmlld2VlcyBoYXZlIGEgbWlzc2luZyB2YWx1ZSBmb3IgdGhlIG5ldyBtZXRyb3BvbGl0YW4gYXJlYSB2YXJpYWJsZT8gTm90ZSB0aGF0IGFsbCBvZiB0aGVzZSBpbnRlcnZpZXdlZXMgd291bGQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWVyZ2VkIGRhdGEgZnJhbWUgaWYgd2UgZGlkIG5vdCBpbmNsdWRlIHRoZSBhbGwueD1UUlVFIHBhcmFtZXRlci4NCg0KYGBge3J9DQoNCmBgYA0KDQoNCiMjIyMgMy4zDQpXaGljaCBvZiB0aGUgZm9sbG93aW5nIG1ldHJvcG9saXRhbiBhcmVhcyBoYXMgdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGludGVydmlld2Vlcz8NCg0KKyBBdGxhbnRhLVNhbmR5IFNwcmluZ3MtTWFyaWV0dGEsIEdBDQorIEJhbHRpbW9yZS1Ub3dzb24sIE1EDQorIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5LCBNQS1OSA0KKyBTYW4gRnJhbmNpc2NvLU9ha2xhbmQtRnJlbW9udCwgQ0ENCg0KYGBge3J9DQoNCmBgYA0KDQojIyMjIDMuNA0KV2hpY2ggbWV0cm9wb2xpdGFuIGFyZWEgaGFzIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2YgaW50ZXJ2aWV3ZWVzIG9mIEhpc3BhbmljIGV0aG5pY2l0eT8gSGludDogVXNlIHRhcHBseSgpIHdpdGggbWVhbiwgYXMgaW4gdGhlIHByZXZpb3VzIHN1YnByb2JsZW0uIENhbGxpbmcgc29ydCgpIG9uIHRoZSBvdXRwdXQgb2YgdGFwcGx5KCkgY291bGQgYWxzbyBiZSBoZWxwZnVsIGhlcmUuDQoNCg0KYGBge3J9DQoNCmBgYA0KDQoNCiMjIyMgMy41DQpSZW1lbWJlcmluZyB0aGF0IENQUyRSYWNlID09ICJBc2lhbiIgcmV0dXJucyBhIFRSVUUvRkFMU0UgdmVjdG9yIG9mIHdoZXRoZXIgYW4gaW50ZXJ2aWV3ZWUgaXMgQXNpYW4sIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIG1ldHJvcG9saXRhbiBhcmVhcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBmcm9tIHdoaWNoIGF0IGxlYXN0IDIwJSBvZiBpbnRlcnZpZXdlZXMgYXJlIEFzaWFuLg0KDQpgYGB7cn0NCg0KYGBgDQoNCg0KIyMjIyAzLjYNCk5vcm1hbGx5LCB3ZSB3b3VsZCBsb29rIGF0IHRoZSBzb3J0ZWQgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgZnJvbSBlYWNoIG1ldHJvcG9saXRhbiBhcmVhIHdobyBoYXZlIG5vdCByZWNlaXZlZCBhIGhpZ2ggc2Nob29sIGRpcGxvbWEgd2l0aCB0aGUgY29tbWFuZDoNCg0KICAgIHNvcnQodGFwcGx5KENQUyRFZHVjYXRpb24gPT0gIk5vIGhpZ2ggc2Nob29sIGRpcGxvbWEiLCBDUFMkTWV0cm9BcmVhLCBtZWFuKSkNCg0KSG93ZXZlciwgbm9uZSBvZiB0aGUgaW50ZXJ2aWV3ZWVzIGFnZWQgMTQgYW5kIHlvdW5nZXIgaGF2ZSBhbiBlZHVjYXRpb24gdmFsdWUgcmVwb3J0ZWQsIHNvIHRoZSBtZWFuIHZhbHVlIGlzIHJlcG9ydGVkIGFzIE5BIGZvciBlYWNoIG1ldHJvcG9saXRhbiBhcmVhLiBUbyBnZXQgbWVhbiAoYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLCBsaWtlIHN1bSkgdG8gaWdub3JlIG1pc3NpbmcgdmFsdWVzLCB5b3UgY2FuIHBhc3MgdGhlIHBhcmFtZXRlciBuYS5ybT1UUlVFLiBQYXNzaW5nIG5hLnJtPVRSVUUgdG8gdGhlIHRhcHBseSBmdW5jdGlvbiwgZGV0ZXJtaW5lIHdoaWNoIG1ldHJvcG9saXRhbiBhcmVhIGhhcyB0aGUgc21hbGxlc3QgcHJvcG9ydGlvbiBvZiBpbnRlcnZpZXdlZXMgd2hvIGhhdmUgcmVjZWl2ZWQgbm8gaGlnaCBzY2hvb2wgZGlwbG9tYS4NCg0KIyMjIFNlY3Rpb24gNCAtIEludGVncmF0aW5nIENvdW50cnkgb2YgQmlydGggRGF0YQ0KDQpKdXN0IGFzIHdlIGRpZCB3aXRoIHRoZSBtZXRyb3BvbGl0YW4gYXJlYSBpbmZvcm1hdGlvbiwgbWVyZ2UgaW4gdGhlIGNvdW50cnkgb2YgYmlydGggaW5mb3JtYXRpb24gZnJvbSB0aGUgQ291bnRyeU1hcCBkYXRhIGZyYW1lLCByZXBsYWNpbmcgdGhlIENQUyBkYXRhIGZyYW1lIHdpdGggdGhlIHJlc3VsdC4gSWYgeW91IGFjY2lkZW50YWxseSBvdmVyd3JpdGUgQ1BTIHdpdGggdGhlIHdyb25nIHZhbHVlcywgcmVtZW1iZXIgdGhhdCB5b3UgY2FuIHJlc3RvcmUgaXQgYnkgcmUtbG9hZGluZyB0aGUgZGF0YSBmcmFtZSBmcm9tIENQU0RhdGEuY3N2IGFuZCB0aGVuIG1lcmdpbmcgaW4gdGhlIG1ldHJvcG9saXRhbiBhcmVhIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjb21tYW5kIHByb3ZpZGVkIGluIHRoZSBwcmV2aW91cyBzdWJwcm9ibGVtLg0KDQojIyMjIDQuMQ0KV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYWRkZWQgdG8gdGhlIENQUyBkYXRhIGZyYW1lIGJ5IHRoaXMgbWVyZ2Ugb3BlcmF0aW9uPw0KDQpgYGB7cn0NCg0KYGBgDQoNCkhvdyBtYW55IGludGVydmlld2VlcyBoYXZlIGEgbWlzc2luZyB2YWx1ZSBmb3IgdGhlIG5ldyBjb3VudHJ5IG9mIGJpcnRoIHZhcmlhYmxlPw0KDQpgYGB7cn0NCg0KYGBgDQoNCiMjIyMgNC4yIA0KQW1vbmcgYWxsIGludGVydmlld2VlcyBib3JuIG91dHNpZGUgb2YgTm9ydGggQW1lcmljYSwgd2hpY2ggY291bnRyeSB3YXMgdGhlIG1vc3QgY29tbW9uIHBsYWNlIG9mIGJpcnRoPw0KDQpgYGB7cn0NCg0KYGBgDQoNCiMjIyMgNC4zDQpXaGF0IHByb3BvcnRpb24gb2YgdGhlIGludGVydmlld2VlcyBmcm9tIHRoZSAiTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEEiIG1ldHJvcG9saXRhbiBhcmVhIGhhdmUgYSBjb3VudHJ5IG9mIGJpcnRoIHRoYXQgaXMgbm90IHRoZSBVbml0ZWQgU3RhdGVzPyBGb3IgdGhpcyBjb21wdXRhdGlvbiwgZG9uJ3QgaW5jbHVkZSBwZW9wbGUgZnJvbSB0aGlzIG1ldHJvcG9saXRhbiBhcmVhIHdobyBoYXZlIGEgbWlzc2luZyBjb3VudHJ5IG9mIGJpcnRoLg0KDQoNCmBgYHtyfQ0KDQpgYGANCg0KDQojIyMjIDQuNA0KV2hpY2ggbWV0cm9wb2xpdGFuIGFyZWEgaGFzIHRoZSBsYXJnZXN0IG51bWJlciAobm90ZSAtLSBub3QgcHJvcG9ydGlvbikgb2YgaW50ZXJ2aWV3ZWVzIHdpdGggYSBjb3VudHJ5IG9mIGJpcnRoIGluIEluZGlhPyBIaW50IC0tIHJlbWVtYmVyIHRvIGluY2x1ZGUgbmEucm09VFJVRSBpZiB5b3UgYXJlIHVzaW5nIHRhcHBseSgpIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLg0KDQorIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5LCBNQS1OSA0KKyBNaW5uZWFwb2xpcy1TdCBQYXVsLUJsb29taW5ndG9uLCBNTi1XSQ0KKyBOZXcgWW9yay1Ob3J0aGVybiBOZXcgSmVyc2V5LUxvbmcgSXNsYW5kLCBOWS1OSi1QQQ0KKyBXYXNoaW5ndG9uLUFybGluZ3Rvbi1BbGV4YW5kcmlhLCBEQy1WQS1NRC1XVg0KDQpgYGB7cn0NCg0KYGBgDQoNCkluIEJyYXppbD8NCg0KKyBCb3N0b24tQ2FtYnJpZGdlLVF1aW5jeSwgTUEtTkgNCisgTWlubmVhcG9saXMtU3QgUGF1bC1CbG9vbWluZ3RvbiwgTU4tV0kNCisgTmV3IFlvcmstTm9ydGhlcm4gTmV3IEplcnNleS1Mb25nIElzbGFuZCwgTlktTkotUEENCisgV2FzaGluZ3Rvbi1Bcmxpbmd0b24tQWxleGFuZHJpYSwgREMtVkEtTUQtV1YNCg0KYGBge3J9DQoNCmBgYA0KDQpJbiBTb21hbGlhPw0KDQorIEJvc3Rvbi1DYW1icmlkZ2UtUXVpbmN5LCBNQS1OSA0KKyBNaW5uZWFwb2xpcy1TdCBQYXVsLUJsb29taW5ndG9uLCBNTi1XSQ0KKyBOZXcgWW9yay1Ob3J0aGVybiBOZXcgSmVyc2V5LUxvbmcgSXNsYW5kLCBOWS1OSi1QQQ0KKyBXYXNoaW5ndG9uLUFybGluZ3Rvbi1BbGV4YW5kcmlhLCBEQy1WQS1NRC1XVg0KDQpgYGB7cn0NCg0KYGBgDQoNCg0KDQoNCg0KDQo=