Introduction

Market Basket Analysis, also know as affinity analysis or association rule mining, is a data mining technique used mostly in retail to increase sales by focusing on finding purchase patterns by extracting associations from transactional data. The Apriori algorithm generates association rules. An association rule says that if an product 1 occurs, then product 2 occurs with a certain probability

What do my customer buy? What did they buy together? These are the common question or analysis to be made. These analysis revel what people buy together and then can be used to create appropriate promotions or placements of the product in the store. Also to design promotional campaigns.

Code

Reading Data

  • read.transactions(): This is used to read data as the transactions data
  • summary(): It gives fiollowing output
    1. Number of unique transactions and unique items
    2. Most frequent items
    3. Number of items per transaction (distribution per transaction)
## transactions as itemMatrix in sparse format with
##  8833 rows (elements/itemsets/transactions) and
##  171 columns (items) and a density of 0.01560668 
## 
## most frequent items:
## Local Vegetables        Chocolate      Local Fruit  Regular Biscuit 
##             1860             1337             1129              802 
##           Spices          (Other) 
##              726            17719 
## 
## element (itemset/transaction) length distribution:
## sizes
##    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
## 4129 1909 1031  590  332  219  145  117   57   55   44   36   24   18   21   10 
##   17   18   19   20   21   22   23   24   25   26   27   28   29   32   33   34 
##    5    9   11    7   11   11    4    8    5    2    5    5    4    2    3    1 
##   36   38 
##    1    2 
## 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.669   3.000  38.000 
## 
## includes extended item information - examples:
##           labels
## 1 100 Pct Juices
## 2    After Shave
## 3     After-Wash
## 
## includes extended transaction information - examples:
##                    transactionID
## 1 1002_J3591_3591060710_01122015
## 2 1002_J3591_3591060711_01122015
## 3 1002_J3591_3591060712_01122015
##     items                        transactionID                 
## [1] {Local Vegetables}           1002_J3591_3591060710_01122015
## [2] {Toilet Cleaner}             1002_J3591_3591060711_01122015
## [3] {Cream Biscuit}              1002_J3591_3591060712_01122015
## [4] {Dessert,Sauce}              1002_J3591_3591060714_01122015
## [5] {Chocolate,Crisp Corn Snack} 1002_J3591_3591060715_01122015

Item Frequency

  • itemFrequencyPlot(): Plots item frequency (bar plot)

Sampling the data

If the data size is too big to handle we can do a sample selection. But for association rule sample selection one must consider the basic criterion of support of the itemset Formula for sample selection is, n=(−2)∗log(c)(support∗epsilon2) But before we go ahead with the sample, we must make sure that the sample is a good replica of the universe. In order to do that we will look at the item frequency plot with an additional paramerter of lift. Since our data is not that big we can consider entire datset.

Apriori Algorithm

Apriori is the command for association in R. data should be in transaction class. Support: This measure gives an idea of how frequent an itemset is in all the transactions Support({X} -> {Y}) = Transaction containing both X and Y / Total number of transaction Value of support helps us identify the rules worth considering for further analysis Confidence: This measure defines the likeliness of occurrence of consequent on the cart given that the cart already has the antecedents Confidence({X} -> {Y}) = Transaction containing both X and Y / Total number of transaction containing X

## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.8    0.1    1 none FALSE            TRUE       5   0.005      1
##  maxlen target   ext
##      10  rules FALSE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 44 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[171 item(s), 8833 transaction(s)] done [0.00s].
## sorting and recoding items ... [83 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 5 6 7 done [0.00s].
## writing ... [795 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].

Output Interpretation

##      lhs                            rhs          support confidence lift   
## [1]  {Pulses,Vermicelli}         => {Edible Oil} 0.0054  0.8136     11.3526
## [2]  {Flours,Pooja Needs}        => {Spices}     0.0055  0.8033      9.7732
## [3]  {Hair Oil,Pulses}           => {Spices}     0.0053  0.8103      9.8592
## [4]  {Marketing,Salt}            => {Pulses}     0.0053  0.8545     14.3230
## [5]  {Marketing,Salt}            => {Edible Oil} 0.0055  0.8909     12.4319
## [6]  {Marketing,Salt}            => {Flours}     0.0053  0.8545     10.5422
## [7]  {Marketing,Salt}            => {Spices}     0.0059  0.9455     11.5030
## [8]  {Marketing,Sugar}           => {Pulses}     0.0059  0.8125     13.6182
## [9]  {Marketing,Sugar}           => {Flours}     0.0059  0.8125     10.0235
## [10] {Marketing,Utensil Cleaner} => {In-Wash}    0.0065  0.8028     17.4662
##      count
## [1]  48   
## [2]  49   
## [3]  47   
## [4]  47   
## [5]  49   
## [6]  47   
## [7]  52   
## [8]  52   
## [9]  52   
## [10] 57

LHS is antecedent and RHS is consequent {Pulses,Vermicelli} implies {Edible Oil}

support: Of the total no of bills 0.54% bills contain {Pulses, Vermicelli & Edible Oil} confidence: Of the bills that contain {Pulses & Vermicelli} 81.36% also contains {Edible Oil} Looks like a high confidence value. There could be something misleading about this high confidence value. Lift is introduced to overcome this challenge.

lift: (Transaction containing both X and Y / Total number of transaction containing X) / Fraction of transaction containing Y

A value of lift greater than 1 vouches for high association between {Y} and {X}. The larger the lift ratio, the more significant the association.

Subsetting and pruning rules

##     lhs                  rhs               support confidence    lift count
## [1] {Edible Oil,                                                           
##      Marketing,                                                            
##      Spices}          => {Salt}             0.0052     0.8070 30.3336    46
## [2] {Edible Oil,                                                           
##      Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Spices,                                                               
##      Utensil Cleaner} => {Salt}             0.0051     0.8036 30.2040    45
## [3] {Flours,                                                               
##      In-Wash,                                                              
##      Marketing}       => {Utensil Cleaner}  0.0054     0.9057 21.9170    48
## [4] {Edible Oil,                                                           
##      Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Salt}            => {Utensil Cleaner}  0.0054     0.8727 21.1200    48
## [5] {Edible Oil,                                                           
##      Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Salt,                                                                 
##      Spices}          => {Utensil Cleaner}  0.0051     0.8654 20.9423    45
## set of 345 rules
##     lhs                  rhs               support confidence    lift count
## [1] {Edible Oil,                                                           
##      Marketing,                                                            
##      Spices}          => {Salt}             0.0052     0.8070 30.3336    46
## [2] {Edible Oil,                                                           
##      Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Spices,                                                               
##      Utensil Cleaner} => {Salt}             0.0051     0.8036 30.2040    45
## [3] {Flours,                                                               
##      In-Wash,                                                              
##      Marketing}       => {Utensil Cleaner}  0.0054     0.9057 21.9170    48
## [4] {Edible Oil,                                                           
##      Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Salt}            => {Utensil Cleaner}  0.0054     0.8727 21.1200    48
## [5] {Flours,                                                               
##      In-Wash,                                                              
##      Pulses,                                                               
##      Salt,                                                                 
##      Spices}          => {Utensil Cleaner}  0.0058     0.8644 20.9186    51

Visualization

Scatter Plot

This visualization method draws a two dimensional scatterplot with different measures of interestingness (parameter “measure”) on the axes and a third measure (parameter “shading”) is represented by the color of the points.

Graph

Represents the rules (or itemsets) as a graph with items as labeled vertices, and rules (or itemsets) represented as vertices connected to items using arrows. For rules, the LHS items are connected with arrows pointing to the vertex representing the rule and the RHS has an arrow pointing to the item.

## Warning: Unknown control parameters: type

Circular Graph

Graph visualization with different layout

What rules lead to consequent?

This can be done by filtering the rules to see what leads to a particular product

##      lhs                              rhs      support confidence    lift count
## [1]  {Flours,                                                                  
##       Salt,                                                                    
##       Tooth Paste}                 => {Spices}  0.0054     0.9600 11.6800    48
## [2]  {Flours,                                                                  
##       Salt,                                                                    
##       Sugar,                                                                   
##       Utensil Cleaner}             => {Spices}  0.0054     0.9600 11.6800    48
## [3]  {Marketing,                                                               
##       Salt}                        => {Spices}  0.0059     0.9455 11.5030    52
## [4]  {Flours,                                                                  
##       In-Wash,                                                                 
##       Salt,                                                                    
##       Sugar}                       => {Spices}  0.0058     0.9444 11.4907    51
## [5]  {Flours,                                                                  
##       Sugar,                                                                   
##       Tooth Paste}                 => {Spices}  0.0055     0.9423 11.4647    49
## [6]  {In-Wash,                                                                 
##       Salt,                                                                    
##       Sugar}                       => {Spices}  0.0063     0.9333 11.3556    56
## [7]  {Salt,                                                                    
##       Sugar,                                                                   
##       Utensil Cleaner}             => {Spices}  0.0058     0.9273 11.2818    51
## [8]  {Cereals,                                                                 
##       Flours,                                                                  
##       Salt}                        => {Spices}  0.0053     0.9216 11.2124    47
## [9]  {Salt,                                                                    
##       Soap,                                                                    
##       Sugar}                       => {Spices}  0.0052     0.9200 11.1933    46
## [10] {Flours,                                                                  
##       Fly Insecticide / Repellant,                                             
##       Soap}                        => {Spices}  0.0051     0.9184 11.1735    45
## [11] {Flours,                                                                  
##       Salt,                                                                    
##       Soap}                        => {Spices}  0.0062     0.9167 11.1528    55
## [12] {Edible Oil,                                                              
##       In-Wash,                                                                 
##       Sugar}                       => {Spices}  0.0076     0.9054 11.0158    67
## [13] {Edible Oil,                                                              
##       Sugar,                                                                   
##       Tooth Paste}                 => {Spices}  0.0052     0.9020 10.9739    46
## [14] {Flours,                                                                  
##       In-Wash,                                                                 
##       Sugar}                       => {Spices}  0.0080     0.8987 10.9346    71
## [15] {Flours,                                                                  
##       In-Wash,                                                                 
##       Salt}                        => {Spices}  0.0076     0.8933 10.8689    67
## [16] {Flours,                                                                  
##       Soap,                                                                    
##       Sugar}                       => {Spices}  0.0062     0.8871 10.7930    55
## [17] {Flours,                                                                  
##       In-Wash,                                                                 
##       Marketing}                   => {Spices}  0.0053     0.8868 10.7893    47
## [18] {In-Wash,                                                                 
##       Pulses,                                                                  
##       Salt}                        => {Spices}  0.0069     0.8841 10.7560    61
## [19] {Edible Oil,                                                              
##       Soap,                                                                    
##       Sugar}                       => {Spices}  0.0058     0.8793 10.6983    51
## [20] {Flours,                                                                  
##       Salt,                                                                    
##       Sugar}                       => {Spices}  0.0072     0.8767 10.6667    64
## [21] {Flours,                                                                  
##       Soap,                                                                    
##       Tooth Paste}                 => {Spices}  0.0055     0.8750 10.6458    49
## [22] {Flours,                                                                  
##       Fly Insecticide / Repellant,                                             
##       Salt}                        => {Spices}  0.0054     0.8727 10.6182    48
## [23] {Flours,                                                                  
##       In-Wash,                                                                 
##       Tooth Paste}                 => {Spices}  0.0067     0.8676 10.5564    59
## [24] {Salt,                                                                    
##       Tea}                         => {Spices}  0.0059     0.8667 10.5444    52
## [25] {Cereals,                                                                 
##       Salt}                        => {Spices}  0.0059     0.8667 10.5444    52
## [26] {Pulses,                                                                  
##       Soap,                                                                    
##       Sugar}                       => {Spices}  0.0058     0.8644 10.5169    51
## [27] {Flours,                                                                  
##       Fly Insecticide / Repellant,                                             
##       In-Wash}                     => {Spices}  0.0065     0.8636 10.5076    57
## [28] {In-Wash,                                                                 
##       Sugar,                                                                   
##       Utensil Cleaner}             => {Spices}  0.0066     0.8529 10.3775    58
## [29] {Flours,                                                                  
##       Tooth Paste,                                                             
##       Utensil Cleaner}             => {Spices}  0.0059     0.8525 10.3716    52
## [30] {Salt,                                                                    
##       Tooth Paste}                 => {Spices}  0.0063     0.8485 10.3232    56
## [31] {Edible Oil,                                                              
##       Pulses,                                                                  
##       Tea}                         => {Spices}  0.0061     0.8438 10.2656    54
## [32] {Edible Oil,                                                              
##       Fly Insecticide / Repellant,                                             
##       Pulses}                      => {Spices}  0.0054     0.8421 10.2456    48
## [33] {In-Wash,                                                                 
##       Sugar}                       => {Spices}  0.0096     0.8416 10.2393    85
## [34] {Cereals,                                                                 
##       Flours,                                                                  
##       Pulses}                      => {Spices}  0.0066     0.8406 10.2271    58
## [35] {Fly Insecticide / Repellant,                                             
##       Sugar}                       => {Spices}  0.0062     0.8333 10.1389    55
## [36] {Soap,                                                                    
##       Sugar,                                                                   
##       Utensil Cleaner}             => {Spices}  0.0051     0.8333 10.1389    45
## [37] {Edible Oil,                                                              
##       Pulses,                                                                  
##       Sugar}                       => {Spices}  0.0094     0.8300 10.0983    83
## [38] {Sugar,                                                                   
##       Tooth Paste}                 => {Spices}  0.0066     0.8286 10.0810    58
## [39] {Pulses,                                                                  
##       Tooth Paste,                                                             
##       Utensil Cleaner}             => {Spices}  0.0053     0.8246 10.0322    47
## [40] {In-Wash,                                                                 
##       Salt,                                                                    
##       Soap}                        => {Spices}  0.0058     0.8226 10.0081    51
## [41] {In-Wash,                                                                 
##       Salt}                        => {Spices}  0.0088     0.8211  9.9895    78
## [42] {Pulses,                                                                  
##       Salt}                        => {Spices}  0.0103     0.8198  9.9745    91
## [43] {Edible Oil,                                                              
##       In-Wash,                                                                 
##       Pulses}                      => {Spices}  0.0088     0.8125  9.8854    78
## [44] {Hair Oil,                                                                
##       Pulses}                      => {Spices}  0.0053     0.8103  9.8592    47
## [45] {Salt,                                                                    
##       Soap}                        => {Spices}  0.0072     0.8101  9.8565    64
## [46] {Flours,                                                                  
##       In-Wash,                                                                 
##       Soap}                        => {Spices}  0.0072     0.8101  9.8565    64
## [47] {Pulses,                                                                  
##       Tea}                         => {Spices}  0.0077     0.8095  9.8492    68
## [48] {Salt,                                                                    
##       Utensil Cleaner}             => {Spices}  0.0076     0.8072  9.8213    67
## [49] {Soap,                                                                    
##       Sugar}                       => {Spices}  0.0075     0.8049  9.7927    66
## [50] {Flours,                                                                  
##       Tooth Paste}                 => {Spices}  0.0084     0.8043  9.7862    74
## [51] {Flours,                                                                  
##       Pooja Needs}                 => {Spices}  0.0055     0.8033  9.7732    49
## [52] {Flours,                                                                  
##       Soap,                                                                    
##       Utensil Cleaner}             => {Spices}  0.0060     0.8030  9.7702    53
LS0tCnRpdGxlOiAiTWFya2V0IEJhc2tldCBBbmFseXNpcyIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBmaWdfaGVpZ2h0OiA0CiAgICBoaWdobGlnaHQ6IGhhZGRvY2sKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRoZW1lOiBkZWZhdWx0CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHllcwogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCnBhdGggPSBnZXR3ZCgpCnNldHdkKHBhdGgpCmBgYAoKYGBge3IgbG9hZHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpwYWNtYW46OnBfbG9hZChhcnVsZXNWaXosIGFydWxlcykKYGBgCiMgSW50cm9kdWN0aW9uCgpNYXJrZXQgQmFza2V0IEFuYWx5c2lzLCBhbHNvIGtub3cgYXMgYWZmaW5pdHkgYW5hbHlzaXMgb3IgYXNzb2NpYXRpb24gcnVsZSBtaW5pbmcsIGlzIGEgZGF0YSBtaW5pbmcgdGVjaG5pcXVlIHVzZWQgbW9zdGx5IGluIHJldGFpbCB0byBpbmNyZWFzZSBzYWxlcyBieSBmb2N1c2luZyBvbiBmaW5kaW5nIHB1cmNoYXNlIHBhdHRlcm5zIGJ5IGV4dHJhY3RpbmcgYXNzb2NpYXRpb25zIGZyb20gdHJhbnNhY3Rpb25hbCBkYXRhLgpUaGUgQXByaW9yaSBhbGdvcml0aG0gZ2VuZXJhdGVzIGFzc29jaWF0aW9uIHJ1bGVzLiBBbiBhc3NvY2lhdGlvbiBydWxlIHNheXMgdGhhdCBpZiBhbiBwcm9kdWN0IDEgb2NjdXJzLCB0aGVuIHByb2R1Y3QgMiBvY2N1cnMgd2l0aCBhIGNlcnRhaW4gcHJvYmFiaWxpdHkKCldoYXQgZG8gbXkgY3VzdG9tZXIgYnV5PyBXaGF0IGRpZCB0aGV5IGJ1eSB0b2dldGhlcj8gVGhlc2UgYXJlIHRoZSBjb21tb24gcXVlc3Rpb24gb3IgYW5hbHlzaXMgdG8gYmUgbWFkZS4gVGhlc2UgYW5hbHlzaXMgcmV2ZWwgd2hhdCBwZW9wbGUgYnV5IHRvZ2V0aGVyIGFuZCB0aGVuIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBwcm9tb3Rpb25zIG9yIHBsYWNlbWVudHMgb2YgdGhlIHByb2R1Y3QgaW4gdGhlIHN0b3JlLiBBbHNvIHRvIGRlc2lnbiBwcm9tb3Rpb25hbCBjYW1wYWlnbnMuCgoKIyBDb2RlCiMjIFJlYWRpbmcgRGF0YQoqIHJlYWQudHJhbnNhY3Rpb25zKCk6IFRoaXMgaXMgdXNlZCB0byByZWFkIGRhdGEgYXMgdGhlIHRyYW5zYWN0aW9ucyBkYXRhCiogc3VtbWFyeSgpOiBJdCBnaXZlcyBmaW9sbG93aW5nIG91dHB1dAogIDEuIE51bWJlciBvZiB1bmlxdWUgdHJhbnNhY3Rpb25zIGFuZCB1bmlxdWUgaXRlbXMKICAyLiBNb3N0IGZyZXF1ZW50IGl0ZW1zCiAgMy4gTnVtYmVyIG9mIGl0ZW1zIHBlciB0cmFuc2FjdGlvbiAoZGlzdHJpYnV0aW9uIHBlciB0cmFuc2FjdGlvbikKCmBgYHtyIGRhdGFsb2FkfQp0cmFuc2FjdGlvbnMgPC0gcmVhZC50cmFuc2FjdGlvbnMoJ3RyYW5zYWN0aW9uX3NhbXBsZS50eHQnLCBzZXAgPSAnfCcsIGZvcm1hdCA9ICdzaW5nbGUnLCBjb2xzID0gYygxLDIpKQpzdW1tYXJ5KHRyYW5zYWN0aW9ucykKaW5zcGVjdCh0cmFuc2FjdGlvbnNbMTo1XSkKYGBgCgojIyBJdGVtIEZyZXF1ZW5jeQoKKiBpdGVtRnJlcXVlbmN5UGxvdCgpOiBQbG90cyBpdGVtIGZyZXF1ZW5jeSAoYmFyIHBsb3QpCmBgYHtyIHBsb3R9Cml0ZW1GcmVxdWVuY3lQbG90KHRyYW5zYWN0aW9ucywgdG9wTiA9IDE1LCBtYWluID0gJ0l0ZW0gU3VwcG9ydCBQbG90JywgeGxhYiA9ICdJdGVtJykKYGBgCgoqKlNhbXBsaW5nIHRoZSBkYXRhKioKCklmIHRoZSBkYXRhIHNpemUgaXMgdG9vIGJpZyB0byBoYW5kbGUgd2UgY2FuIGRvIGEgc2FtcGxlIHNlbGVjdGlvbi4gQnV0IGZvciBhc3NvY2lhdGlvbiBydWxlIHNhbXBsZSBzZWxlY3Rpb24gb25lIG11c3QgY29uc2lkZXIgdGhlIGJhc2ljIGNyaXRlcmlvbiBvZiBzdXBwb3J0IG9mIHRoZSBpdGVtc2V0CkZvcm11bGEgZm9yIHNhbXBsZSBzZWxlY3Rpb24gaXMsIG49KOKIkjIp4oiXbG9nKGMpKHN1cHBvcnTiiJdlcHNpbG9uMikKQnV0IGJlZm9yZSB3ZSBnbyBhaGVhZCB3aXRoIHRoZSBzYW1wbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIHNhbXBsZSBpcyBhIGdvb2QgcmVwbGljYSBvZiB0aGUgdW5pdmVyc2UuIEluIG9yZGVyIHRvIGRvIHRoYXQgd2Ugd2lsbCBsb29rIGF0IHRoZSBpdGVtIGZyZXF1ZW5jeSBwbG90IHdpdGggYW4gYWRkaXRpb25hbCBwYXJhbWVydGVyIG9mIGxpZnQuIFNpbmNlIG91ciBkYXRhIGlzIG5vdCB0aGF0IGJpZyB3ZSBjYW4gY29uc2lkZXIgZW50aXJlIGRhdHNldC4KCgojIyBBcHJpb3JpIEFsZ29yaXRobQoqKkFwcmlvcmkqKiBpcyB0aGUgY29tbWFuZCBmb3IgYXNzb2NpYXRpb24gaW4gUi4gZGF0YSBzaG91bGQgYmUgaW4gdHJhbnNhY3Rpb24gY2xhc3MuClN1cHBvcnQ6IFRoaXMgbWVhc3VyZSBnaXZlcyBhbiBpZGVhIG9mIGhvdyBmcmVxdWVudCBhbiBpdGVtc2V0IGlzIGluIGFsbCB0aGUgdHJhbnNhY3Rpb25zCiAgICAgICAgIFN1cHBvcnQoe1h9IC0+IHtZfSkgPSBUcmFuc2FjdGlvbiBjb250YWluaW5nIGJvdGggWCBhbmQgWSAvIFRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbgogICAgICAgICBWYWx1ZSBvZiBzdXBwb3J0IGhlbHBzIHVzIGlkZW50aWZ5IHRoZSBydWxlcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgZnVydGhlciBhbmFseXNpcwpDb25maWRlbmNlOiBUaGlzIG1lYXN1cmUgZGVmaW5lcyB0aGUgbGlrZWxpbmVzcyBvZiBvY2N1cnJlbmNlIG9mIGNvbnNlcXVlbnQgb24gdGhlIGNhcnQgZ2l2ZW4gdGhhdCB0aGUgY2FydCBhbHJlYWR5IGhhcyB0aGUgYW50ZWNlZGVudHMKICAgICAgICAgICAgQ29uZmlkZW5jZSh7WH0gLT4ge1l9KSA9IFRyYW5zYWN0aW9uIGNvbnRhaW5pbmcgYm90aCBYIGFuZCBZIC8gVG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGNvbnRhaW5pbmcgWAogICAgICAgICAgICAKYGBge3IgYXByaW9yaX0KcnVsZXMgPC0gYXByaW9yaSh0cmFuc2FjdGlvbnMsIHBhcmFtZXRlciA9IGxpc3Qoc3VwcG9ydCA9IDAuMDA1LCBjb25maWRlbmNlID0gMC44MCkpCmBgYAoKIyMgT3V0cHV0IEludGVycHJldGF0aW9uIApgYGB7ciBhcHJpb3JpIG91dHB1dH0KcXVhbGl0eShydWxlcykgPC0gcm91bmQocXVhbGl0eShydWxlcyksIGRpZ2l0cyA9IDQpCmluc3BlY3QocnVsZXNbMToxMF0pCmBgYAoKTEhTIGlzIGFudGVjZWRlbnQgYW5kIFJIUyBpcyBjb25zZXF1ZW50CntQdWxzZXMsVmVybWljZWxsaX0gaW1wbGllcyB7RWRpYmxlIE9pbH0KCnN1cHBvcnQ6IE9mIHRoZSB0b3RhbCBubyBvZiBiaWxscyAwLjU0JSBiaWxscyBjb250YWluIHtQdWxzZXMsIFZlcm1pY2VsbGkgJiBFZGlibGUgT2lsfQpjb25maWRlbmNlOiBPZiB0aGUgYmlsbHMgdGhhdCBjb250YWluIHtQdWxzZXMgJiBWZXJtaWNlbGxpfSA4MS4zNiUgYWxzbyBjb250YWlucyB7RWRpYmxlIE9pbH0KTG9va3MgbGlrZSBhIGhpZ2ggY29uZmlkZW5jZSB2YWx1ZS4gVGhlcmUgY291bGQgYmUgc29tZXRoaW5nIG1pc2xlYWRpbmcgYWJvdXQgdGhpcyBoaWdoIGNvbmZpZGVuY2UgdmFsdWUuIExpZnQgaXMgaW50cm9kdWNlZCB0byBvdmVyY29tZSB0aGlzIGNoYWxsZW5nZS4KCmxpZnQ6IChUcmFuc2FjdGlvbiBjb250YWluaW5nIGJvdGggWCBhbmQgWSAvIFRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbiBjb250YWluaW5nIFgpIC8gRnJhY3Rpb24gb2YgdHJhbnNhY3Rpb24gY29udGFpbmluZyBZCgpBIHZhbHVlIG9mIGxpZnQgZ3JlYXRlciB0aGFuIDEgdm91Y2hlcyBmb3IgaGlnaCBhc3NvY2lhdGlvbiBiZXR3ZWVuIHtZfSBhbmQge1h9LiBUaGUgbGFyZ2VyIHRoZSBsaWZ0IHJhdGlvLCB0aGUgbW9yZSBzaWduaWZpY2FudCB0aGUgYXNzb2NpYXRpb24uCgoKIyMgU3Vic2V0dGluZyBhbmQgcHJ1bmluZyBydWxlcyAKCmBgYHtyIHJ1bGVzX3N1YnNldH0KcnVsZXNfc29ydGVkIDwtIHNvcnQocnVsZXMsIGJ5ID0gJ2xpZnQnKQppbnNwZWN0KHJ1bGVzX3NvcnRlZFsxOjVdKQpzdWJzZXQubWF0cml4IDwtIGlzLnN1YnNldChydWxlc19zb3J0ZWQsIHJ1bGVzX3NvcnRlZCwgc3BhcnNlID0gRkFMU0UpCnN1YnNldC5tYXRyaXhbbG93ZXIudHJpKHN1YnNldC5tYXRyaXgsIGRpYWcgPSBUKV0gPC0gTkEKcmVkdW5kYW50IDwtIGNvbFN1bXMoc3Vic2V0Lm1hdHJpeCwgbmEucm0gPSBUKSA+PSAxCnJ1bGVzX3BydW5lZCA8LSBydWxlc19zb3J0ZWRbIXJlZHVuZGFudF0KcnVsZXNfcHJ1bmVkCmluc3BlY3QocnVsZXNfcHJ1bmVkWzE6NV0pCmBgYAoKIyBWaXN1YWxpemF0aW9uCgojIyBTY2F0dGVyIFBsb3QKVGhpcyB2aXN1YWxpemF0aW9uIG1ldGhvZCBkcmF3cyBhIHR3byBkaW1lbnNpb25hbCBzY2F0dGVycGxvdCB3aXRoIGRpZmZlcmVudCBtZWFzdXJlcyBvZiBpbnRlcmVzdGluZ25lc3MgKHBhcmFtZXRlciAibWVhc3VyZSIpIG9uIHRoZSBheGVzIGFuZCBhIHRoaXJkIG1lYXN1cmUgKHBhcmFtZXRlciAic2hhZGluZyIpIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb2xvciBvZiB0aGUgcG9pbnRzLgoKYGBge3IgcGxvdDF9CnBsb3QocnVsZXNfcHJ1bmVkWzE6MjBdLCBtZWFzdXJlPWMoInN1cHBvcnQiLCJsaWZ0IiksIHNoYWRpbmc9ImNvbmZpZGVuY2UiKQpgYGAKCiMjIEdyYXBoClJlcHJlc2VudHMgdGhlIHJ1bGVzIChvciBpdGVtc2V0cykgYXMgYSBncmFwaCB3aXRoIGl0ZW1zIGFzIGxhYmVsZWQgdmVydGljZXMsIGFuZCBydWxlcyAob3IgaXRlbXNldHMpIHJlcHJlc2VudGVkIGFzIHZlcnRpY2VzIGNvbm5lY3RlZCB0byBpdGVtcyB1c2luZyBhcnJvd3MuIEZvciBydWxlcywgdGhlIExIUyBpdGVtcyBhcmUgY29ubmVjdGVkIHdpdGggYXJyb3dzIHBvaW50aW5nIHRvIHRoZSB2ZXJ0ZXggcmVwcmVzZW50aW5nIHRoZSBydWxlIGFuZCB0aGUgUkhTIGhhcyBhbgphcnJvdyBwb2ludGluZyB0byB0aGUgaXRlbS4KCmBgYHtyIHBsb3QyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KcGxvdChydWxlc19wcnVuZWRbMToyMF0sIG1ldGhvZD0iZ3JhcGgiLGNvbnRyb2w9bGlzdCh0eXBlPSJpdGVtcyIpKQpgYGAKCiMjIENpcmN1bGFyIEdyYXBoCgpHcmFwaCB2aXN1YWxpemF0aW9uIHdpdGggZGlmZmVyZW50IGxheW91dAoKYGBge3IgcGxvdDN9CnBsb3QocnVsZXNfcHJ1bmVkWzE6MjBdLG1ldGhvZD0iZ3JhcGgiLGNvbnRyb2w9bGlzdChsYXlvdXQgPSBpZ3JhcGg6OiBpbl9jaXJjbGUoKSkpCmBgYAoKCiMgV2hhdCBydWxlcyBsZWFkIHRvIGNvbnNlcXVlbnQ/CgpUaGlzIGNhbiBiZSBkb25lIGJ5IGZpbHRlcmluZyB0aGUgcnVsZXMgdG8gc2VlIHdoYXQgbGVhZHMgdG8gYSBwYXJ0aWN1bGFyIHByb2R1Y3QKCmBgYHtyIHJ1bGVzX2ZpbHRlcmluZ30KZmlsdGVyID0gJ1NwaWNlcycKcnVsZXNfZmlsdGVyZWQgPC0gc3Vic2V0KHJ1bGVzX3BydW5lZCwgc3Vic2V0ID0gcmhzICVpbiUgZmlsdGVyKQoKaW5zcGVjdChydWxlc19maWx0ZXJlZCkKYGBgCg==