1. Đọc file dữ liệu

d <- read.csv("D:/PTDLDT/Supermarket Transactions.csv")

2. Chọn các biến định tính

dldt <- c("Gender", "MaritalStatus", "Homeowner","City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
dldt
## [1] "Gender"            "MaritalStatus"     "Homeowner"        
## [4] "City"              "StateorProvince"   "Country"          
## [7] "ProductFamily"     "ProductDepartment" "ProductCategory"

3. Tạo bộ dữ liệu mới chỉ chứa các biến định tính

dt <- d[, dldt]

4. Xem trước dữ liệu

head(dt)
##   Gender MaritalStatus Homeowner          City StateorProvince Country
## 1      F             S         Y   Los Angeles              CA     USA
## 2      M             M         Y   Los Angeles              CA     USA
## 3      F             M         N     Bremerton              WA     USA
## 4      M             M         Y      Portland              OR     USA
## 5      F             S         Y Beverly Hills              CA     USA
## 6      F             M         Y Beverly Hills              CA     USA
##   ProductFamily ProductDepartment      ProductCategory
## 1          Food       Snack Foods          Snack Foods
## 2          Food           Produce           Vegetables
## 3          Food       Snack Foods          Snack Foods
## 4          Food            Snacks                Candy
## 5         Drink         Beverages Carbonated Beverages
## 6          Food              Deli          Side Dishes

5. Phân tích các biến định tính

5.1 Biến Gender

#Lập bảng tần suất của biến Gender
table(dt$Gender)/sum(nrow(dt))
## 
##         F         M 
## 0.5099936 0.4900064
#Lập bảng tần số biến Gender
table(dt$Gender)
## 
##    F    M 
## 7170 6889

Biểu đồ

# Bảng tần suất và tỷ lệ %
gender_freq  <- table(dt$Gender)
gender_pct   <- gender_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(gender_freq,
    main   = "Phân bố giới tính (Gender)",
    labels = paste0(names(gender_freq),
                    " (", round(gender_pct*100, 1), "%)"),
    col    = c("lightpink", "green"))

Vậy trong bộ dữ liệu này có 50.9993598 % nữ và 49.0006402% nam.

5.2 Biến Homeowner

#Lập bảng tần suất của biến Homeowner
table(dt$Homeowner)/sum(nrow(dt))
## 
##         N         Y 
## 0.3993883 0.6006117
#Lập bảng tần số biến Homeowner
table(dt$Homeowner)
## 
##    N    Y 
## 5615 8444
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(dt, aes(x = Homeowner)) +
  geom_bar(fill = "red") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Người có nhà hay không", x = "Nhà riêng", y = "Tần suất")

Vậy trong bộ dữ liệu này có 39.9388292 % không có nhà và 60.0611708% có nhà.

5.3 Biến MaritalStatus

#Lập bảng tần suất của biến MaritalStatus
table(dt$MaritalStatus)/sum(nrow(dt))
## 
##         M         S 
## 0.4883704 0.5116296
#Lập bảng tần số của biến MaritalStatus
table(dt$MaritalStatus)
## 
##    M    S 
## 6866 7193
library(ggplot2)
ggplot(dt, aes(x = MaritalStatus)) +
  geom_bar(fill = "steelblue") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Trạng thái hôn nhân", x = "Trạng thái", y = "Tần suất")

Vậy trong bộ dữ liệu này có 48.8370439 % đã kết hôn và 51.1629561% độc thân.

5.4 Biến City

#Lập bảng tần suất của biến City
table(dt$City)/sum(nrow(dt))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434
#Lập bảng tần số của biến City
table(dt$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
ggplot(dt, aes(x = City)) +
  geom_bar() +
  coord_flip() +                             # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo City",
       x = "City", y = "Số giao dịch")

Trong bộ dữ liệu này, thành phố có tỷ lệ giao dịch cao nhất là Salem với khoảng 9.86%, tiếp theo là Tacoma (8.94%), Los Angeles (6.59%) và Seattle (6.56%).

Các thành phố nhỏ hơn như Hidalgo (6.01%) hoặc Guadalajara (0.53%) có tỷ lệ thấp hơn nhiều.

Dữ liệu này cho thấy các giao dịch chủ yếu diễn ra tại một số thành phố lớn – nơi có mật độ dân cư cao hoặc hoạt động kinh tế sôi động hơn. Ngược lại, các thành phố nhỏ đóng góp tỷ trọng giao dịch thấp hơn, có thể do thị trường hạn chế về quy mô hoặc sản phẩm chưa được biết đến rộng rãi.

Bên cạnh đó, xu hướng phân bố này cũng phần nào phản ánh chiến lược tiếp thị và định hướng kênh phân phối của siêu thị, với trọng tâm đặt vào các khu vực đô thị lớn.

5.5 Biến StateorProvince

#Lập bảng tần suất của biến StateorProvince
table(dt$StateorProvince)/sum(nrow(dt))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072
#Lập bảng tần số của biến StateorProvince
table(dt$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
ggplot(dt, aes(x = StateorProvince)) +
  geom_bar(fill = "orange") +
  coord_flip() +
  labs(title = "Tần suất giao dịch theo Tiểu bang hoặc tỉnh",
       x = "StateorProvince", y = "Số giao dịch")

Trong bộ dữ liệu này, bang hoặc tỉnh có tỷ lệ giao dịch lớn nhất là WA với khoảng 32.48%, tiếp theo là CA (19.44%) và OR (16.09%). Các bang như Jalisco (0.53%) và Guerrero (2.72%) chiếm tỷ lệ thấp hơn. Từ đó, ta kết luận được rằng dữ liệu cho thấy sự tập trung giao dịch cao ở một số bang chính.

5.6 Biến Country

#Lập bảng tần suất của biến Country
table(dt$Country)/sum(nrow(dt))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372
#Lập bảng tần suất của biến Country
table(dt$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
# Bảng tần suất và tỷ lệ %
gender_freq  <- table(dt$ Country)
gender_pct   <- gender_freq / nrow(dt)

# Vẽ biểu đồ tròn
pie(gender_freq,
    main   = "Phân bố Country",
    labels = paste0(names(gender_freq),
                    " (", round(gender_pct*100, 1), "%)"),
    col    = c("lightpink", "green", "yellow"))

Vậy trong bộ dữ liệu này có 5.7543211 % ở Canada, 26.2323067% ở Mexico và 68.0133722% ở USA.

5.7 Biến ProductFamily

#Lập bảng tần suất của biến ProductFamily
table(dt$ProductFamily)/sum(nrow(dt))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813
#Lập bảng tần suất của biến ProductFamily
table(dt$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
library(ggplot2)
ggplot(dt, aes(x = ProductFamily)) +
  geom_bar(fill = "pink") +
  theme_minimal() +
  labs(title = "Biểu đồ tần suất theo Sản phẩm gia đình", x = "Sản phẩm", y = "Tần suất")

Vậy trong bộ dữ liệu này có 8.8911018 % đồ uống, 72.2170851% thức ăn và 18.8918131% không tiêu thụ được.

5.8 Biến ProductDepartment

#Lập bảng tần suất của biến ProductDepartment
table(dt$ProductDepartment)/sum(nrow(dt))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682
#Lập bảng tần suất của biến ProductDepartment
table(dt$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
ggplot(dt, aes(x = ProductDepartment)) +
  geom_bar() +
  coord_flip() +                             # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo ProductDepartment",
       x = "ProductDepartment", y = "Số giao dịch")

Trong bộ dữ liệu, nhóm sản phẩm có tỷ lệ giao dịch cao nhất là Produce với 14.18%, tiếp theo là Snack Foods (11.38%) và Household (10.1%). Nhóm Frozen Foods cũng chiếm tỷ lệ đáng kể là 9.83%. Các nhóm như Carousel (0.42%) và Checkout (0.58%) có tỷ lệ thấp hơn nhiều.

5.9 Biến ProductCategory

#Lập bảng tần suất của biến ProductCategory
table(dt$ProductCategory)/sum(nrow(dt))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591
#Lập bảng tần suất của biến ProductCategory
table(dt$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
ggplot(dt, aes(x = ProductCategory, fill = ProductCategory)) +
  geom_bar() +
  coord_flip() +  # xoay ngang cho gọn
  labs(title = "Tần suất giao dịch theo ProductCategory",
       x = "ProductCategory", y = "Số giao dịch") +
  theme(legend.position = "none")  # ẩn chú thích nếu muốn

Trong bộ dữ liệu, nhóm sản phẩm có tỷ lệ giao dịch cao nhất là Vegetables với 12.29%, tiếp theo là Snack Foods (11.38%) và Dairy (6.42%). Các nhóm đóng hộp như Canned Oysters (0.25%) và Canned Clams (0.38%) chiếm tỷ lệ rất nhỏ, cho thấy sự ưu tiên mua hàng tươi và đồ ăn nhẹ.

LS0tDQp0aXRsZTogIlRo4buxYyBow6BuaCINCmF1dGhvcjogIkxhbSBUYW0gTmh1Ig0KZGF0ZTogIjIwMjUtMDUtMTkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHkgew0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIHNhbnMtc2VyaWY7DQogIGZvbnQtc2l6ZTogMTZweDsNCiAgdGV4dC1hbGlnbjoganVzdGlmeTsNCiAgbGluZS1oZWlnaHQ6IDEuNTsNCn0NCmgyIHsNCiAgY29sb3I6IHJlZDsNCn0NCmgzIHsNCiAgY29sb3I6IGRhcmtibHVlOw0KfQ0KPC9zdHlsZT4NCmBgYA0KDQojIDEuIMSQ4buNYyBmaWxlIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KZCA8LSByZWFkLmNzdigiRDovUFRETERUL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiKQ0KYGBgDQoNCiMgMi4gQ2jhu41uIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KYGBge3J9DQpkbGR0IDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50cnkiLCAiUHJvZHVjdEZhbWlseSIsICJQcm9kdWN0RGVwYXJ0bWVudCIsICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KZGxkdA0KYGBgDQoNCiMgMy4gVOG6oW8gYuG7mSBk4buvIGxp4buHdSBt4bubaSBjaOG7iSBjaOG7qWEgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQpgYGB7cn0NCmR0IDwtIGRbLCBkbGR0XQ0KYGBgDQoNCiMgNC4gWGVtIHRyxrDhu5tjIGThu68gbGnhu4d1DQoNCmBgYHtyfQ0KaGVhZChkdCkNCmBgYA0KDQojIDUuIFBow6JuIHTDrWNoIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KIyMgNS4xIEJp4bq/biBHZW5kZXINCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpL3N1bShucm93KGR0KSkNCmBgYA0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBiaeG6v24gR2VuZGVyDQp0YWJsZShkdCRHZW5kZXIpDQpgYGANCg0KKipCaeG7g3UgxJHhu5MqKg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHN14bqldCB2w6AgdOG7tyBs4buHICUNCmdlbmRlcl9mcmVxICA8LSB0YWJsZShkdCRHZW5kZXIpDQpnZW5kZXJfcGN0ICAgPC0gZ2VuZGVyX2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZ2VuZGVyX2ZyZXEsDQogICAgbWFpbiAgID0gIlBow6JuIGLhu5EgZ2nhu5tpIHTDrW5oIChHZW5kZXIpIiwNCiAgICBsYWJlbHMgPSBwYXN0ZTAobmFtZXMoZ2VuZGVyX2ZyZXEpLA0KICAgICAgICAgICAgICAgICAgICAiICgiLCByb3VuZChnZW5kZXJfcGN0KjEwMCwgMSksICIlKSIpLA0KICAgIGNvbCAgICA9IGMoImxpZ2h0cGluayIsICJncmVlbiIpKQ0KYGBgDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkR2VuZGVyKVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSBu4buvIHbDoCBgciB0YWJsZShkdCRHZW5kZXIpWzJdL3N1bShucm93KGR0KSkqMTAwYCUgbmFtLg0KDQojIyA1LjIgQmnhur9uIEhvbWVvd25lcg0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBIb21lb3duZXINCnRhYmxlKGR0JEhvbWVvd25lcikvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGJp4bq/biBIb21lb3duZXINCnRhYmxlKGR0JEhvbWVvd25lcikNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGR0LCBhZXMoeCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJyZWQiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIE5nxrDhu51pIGPDsyBuaMOgIGhheSBraMO0bmciLCB4ID0gIk5ow6AgcmnDqm5nIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KDQpgYGANCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkdCRIb21lb3duZXIpWzFdL3N1bShucm93KGR0KSkqMTAwYCAlIGtow7RuZyBjw7MgbmjDoCB2w6AgYHIgdGFibGUoZHQkSG9tZW93bmVyKVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIGPDsyBuaMOgLg0KDQojIyA1LjMgQmnhur9uIE1hcml0YWxTdGF0dXMNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gTWFyaXRhbFN0YXR1cw0KdGFibGUoZHQkTWFyaXRhbFN0YXR1cykvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBz4buRIGPhu6dhIGJp4bq/biBNYXJpdGFsU3RhdHVzDQp0YWJsZShkdCRNYXJpdGFsU3RhdHVzKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZHQsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIFRy4bqhbmcgdGjDoWkgaMO0biBuaMOibiIsIHggPSAiVHLhuqFuZyB0aMOhaSIsIHkgPSAiVOG6p24gc3XhuqV0IikNCg0KYGBgDQoNClbhuq15IHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjw7MgYHIgdGFibGUoZHQkTWFyaXRhbFN0YXR1cylbMV0vc3VtKG5yb3coZHQpKSoxMDBgICUgxJHDoyBr4bq/dCBow7RuIHbDoCBgciB0YWJsZShkdCRNYXJpdGFsU3RhdHVzKVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIMSR4buZYyB0aMOibi4NCg0KIyMgNS40IEJp4bq/biBDaXR5DQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIENpdHkNCnRhYmxlKGR0JENpdHkpL3N1bShucm93KGR0KSkNCmBgYA0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBj4bunYSBiaeG6v24gQ2l0eQ0KdGFibGUoZHQkQ2l0eSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkdCwgYWVzKHggPSBDaXR5KSkgKw0KICBnZW9tX2JhcigpICsNCiAgY29vcmRfZmxpcCgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeG9heSBuZ2FuZyBjaG8gZ+G7jW4NCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgZ2lhbyBk4buLY2ggdGhlbyBDaXR5IiwNCiAgICAgICB4ID0gIkNpdHkiLCB5ID0gIlPhu5EgZ2lhbyBk4buLY2giKQ0KYGBgDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSwgdGjDoG5oIHBo4buRIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCBsw6AgU2FsZW0gduG7m2kga2hv4bqjbmcgYHIgcm91bmQodGFibGUoZHQkQ2l0eSlbIlNhbGVtIl0vbnJvdyhkdCkqMTAwLCAyKWAlLCB0aeG6v3AgdGhlbyBsw6AgVGFjb21hIChgciByb3VuZCh0YWJsZShkdCRDaXR5KVsiVGFjb21hIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSwgTG9zIEFuZ2VsZXMgKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJMb3MgQW5nZWxlcyJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIFNlYXR0bGUgKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJTZWF0dGxlIl0vbnJvdyhkdCkqMTAwLCAyKWAlKS4NCg0KQ8OhYyB0aMOgbmggcGjhu5Egbmjhu48gaMahbiBuaMawIEhpZGFsZ28gKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJIaWRhbGdvIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSBob+G6t2MgR3VhZGFsYWphcmEgKGByIHJvdW5kKHRhYmxlKGR0JENpdHkpWyJHdWFkYWxhamFyYSJdL25yb3coZHQpKjEwMCwgMilgJSkgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbiBuaGnhu4F1Lg0KDQpE4buvIGxp4buHdSBuw6B5IGNobyB0aOG6pXkgY8OhYyBnaWFvIGThu4tjaCBjaOG7pyB54bq/dSBkaeG7hW4gcmEgdOG6oWkgbeG7mXQgc+G7kSB0aMOgbmggcGjhu5EgbOG7m24g4oCTIG7GoWkgY8OzIG3huq10IMSR4buZIGTDom4gY8awIGNhbyBob+G6t2MgaG/huqF0IMSR4buZbmcga2luaCB04bq/IHPDtGkgxJHhu5luZyBoxqFuLiBOZ8aw4bujYyBs4bqhaSwgY8OhYyB0aMOgbmggcGjhu5Egbmjhu48gxJHDs25nIGfDs3AgdOG7tyB0cuG7jW5nIGdpYW8gZOG7i2NoIHRo4bqlcCBoxqFuLCBjw7MgdGjhu4MgZG8gdGjhu4sgdHLGsOG7nW5nIGjhuqFuIGNo4bq/IHbhu4EgcXV5IG3DtCBob+G6t2Mgc+G6o24gcGjhuqltIGNoxrBhIMSRxrDhu6NjIGJp4bq/dCDEkeG6v24gcuG7mW5nIHLDo2kuDQoNCkLDqm4gY+G6oW5oIMSRw7MsIHh1IGjGsOG7m25nIHBow6JuIGLhu5EgbsOgeSBjxaluZyBwaOG6p24gbsOgbyBwaOG6o24gw6FuaCBjaGnhur9uIGzGsOG7o2MgdGnhur9wIHRo4buLIHbDoCDEkeG7i25oIGjGsOG7m25nIGvDqm5oIHBow6JuIHBo4buRaSBj4bunYSBzacOqdSB0aOG7iywgduG7m2kgdHLhu41uZyB0w6JtIMSR4bq3dCB2w6BvIGPDoWMga2h1IHbhu7FjIMSRw7QgdGjhu4sgbOG7m24uDQoNCiMjIDUuNSBCaeG6v24gU3RhdGVvclByb3ZpbmNlDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFN0YXRlb3JQcm92aW5jZQ0KdGFibGUoZHQkU3RhdGVvclByb3ZpbmNlKS9zdW0obnJvdyhkdCkpDQpgYGANCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY+G7p2EgYmnhur9uIFN0YXRlb3JQcm92aW5jZQ0KdGFibGUoZHQkU3RhdGVvclByb3ZpbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGR0LCBhZXMoeCA9IFN0YXRlb3JQcm92aW5jZSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJvcmFuZ2UiKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiVOG6p24gc3XhuqV0IGdpYW8gZOG7i2NoIHRoZW8gVGnhu4N1IGJhbmcgaG/hurdjIHThu4luaCIsDQogICAgICAgeCA9ICJTdGF0ZW9yUHJvdmluY2UiLCB5ID0gIlPhu5EgZ2lhbyBk4buLY2giKQ0KYGBgDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSwgYmFuZyBob+G6t2MgdOG7iW5oIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggbOG7m24gbmjhuqV0IGzDoCBXQSB24bubaSBraG/huqNuZyBgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJXQSJdL25yb3coZHQpKjEwMCwgMilgJSwgdGnhur9wIHRoZW8gbMOgIENBIChgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJDQSJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIE9SIChgciByb3VuZCh0YWJsZShkdCRTdGF0ZW9yUHJvdmluY2UpWyJPUiJdL25yb3coZHQpKjEwMCwgMilgJSkuIEPDoWMgYmFuZyBuaMawIEphbGlzY28gKGByIHJvdW5kKHRhYmxlKGR0JFN0YXRlb3JQcm92aW5jZSlbIkphbGlzY28iXS9ucm93KGR0KSoxMDAsIDIpYCUpIHbDoCBHdWVycmVybyAoYHIgcm91bmQodGFibGUoZHQkU3RhdGVvclByb3ZpbmNlKVsiR3VlcnJlcm8iXS9ucm93KGR0KSoxMDAsIDIpYCUpIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBoxqFuLiBU4burIMSRw7MsIHRhIGvhur90IGx14bqtbiDEkcaw4bujYyBy4bqxbmcgZOG7ryBsaeG7h3UgY2hvIHRo4bqleSBz4buxIHThuq1wIHRydW5nIGdpYW8gZOG7i2NoIGNhbyDhu58gbeG7mXQgc+G7kSBiYW5nIGNow61uaC4NCg0KIyMgNS42IEJp4bq/biBDb3VudHJ5DQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIENvdW50cnkNCnRhYmxlKGR0JENvdW50cnkpL3N1bShucm93KGR0KSkNCmBgYA0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBDb3VudHJ5DQp0YWJsZShkdCRDb3VudHJ5KQ0KYGBgDQoNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBzdeG6pXQgdsOgIHThu7cgbOG7hyAlDQpnZW5kZXJfZnJlcSAgPC0gdGFibGUoZHQkIENvdW50cnkpDQpnZW5kZXJfcGN0ICAgPC0gZ2VuZGVyX2ZyZXEgLyBucm93KGR0KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZ2VuZGVyX2ZyZXEsDQogICAgbWFpbiAgID0gIlBow6JuIGLhu5EgQ291bnRyeSIsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGdlbmRlcl9mcmVxKSwNCiAgICAgICAgICAgICAgICAgICAgIiAoIiwgcm91bmQoZ2VuZGVyX3BjdCoxMDAsIDEpLCAiJSkiKSwNCiAgICBjb2wgICAgPSBjKCJsaWdodHBpbmsiLCAiZ3JlZW4iLCAieWVsbG93IikpDQpgYGANCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkdCRDb3VudHJ5KVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSDhu58gQ2FuYWRhLCBgciB0YWJsZShkdCRDb3VudHJ5KVsyXS9zdW0obnJvdyhkdCkpKjEwMGAlIOG7nyBNZXhpY28gdsOgIGByIHRhYmxlKGR0JENvdW50cnkpWzNdL3N1bShucm93KGR0KSkqMTAwYCUg4bufIFVTQS4NCg0KIyMgNS43IEJp4bq/biBQcm9kdWN0RmFtaWx5DQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFByb2R1Y3RGYW1pbHkNCnRhYmxlKGR0JFByb2R1Y3RGYW1pbHkpL3N1bShucm93KGR0KSkNCmBgYA0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBQcm9kdWN0RmFtaWx5DQp0YWJsZShkdCRQcm9kdWN0RmFtaWx5KQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZHQsIGFlcyh4ID0gUHJvZHVjdEZhbWlseSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJwaW5rIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBT4bqjbiBwaOG6qW0gZ2lhIMSRw6xuaCIsIHggPSAiU+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KDQpgYGANCg0KVuG6rXkgdHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IGPDsyBgciB0YWJsZShkdCRQcm9kdWN0RmFtaWx5KVsxXS9zdW0obnJvdyhkdCkpKjEwMGAgJSDEkeG7kyB14buRbmcsIGByIHRhYmxlKGR0JFByb2R1Y3RGYW1pbHkpWzJdL3N1bShucm93KGR0KSkqMTAwYCUgdGjhu6ljIMSDbiB2w6AgYHIgdGFibGUoZHQkUHJvZHVjdEZhbWlseSlbM10vc3VtKG5yb3coZHQpKSoxMDBgJSBraMO0bmcgdGnDqnUgdGjhu6UgxJHGsOG7o2MuDQoNCiMjIDUuOCBCaeG6v24gUHJvZHVjdERlcGFydG1lbnQNCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdERlcGFydG1lbnQNCnRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KS9zdW0obnJvdyhkdCkpDQpgYGANCg0KYGBge3J9DQojTOG6rXAgYuG6o25nIHThuqduIHN14bqldCBj4bunYSBiaeG6v24gUHJvZHVjdERlcGFydG1lbnQNCnRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGR0LCBhZXMoeCA9IFByb2R1Y3REZXBhcnRtZW50KSkgKw0KICBnZW9tX2JhcigpICsNCiAgY29vcmRfZmxpcCgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeG9heSBuZ2FuZyBjaG8gZ+G7jW4NCiAgbGFicyh0aXRsZSA9ICJU4bqnbiBzdeG6pXQgZ2lhbyBk4buLY2ggdGhlbyBQcm9kdWN0RGVwYXJ0bWVudCIsDQogICAgICAgeCA9ICJQcm9kdWN0RGVwYXJ0bWVudCIsIHkgPSAiU+G7kSBnaWFvIGThu4tjaCIpDQpgYGANCg0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSwgbmjDs20gc+G6o24gcGjhuqltIGPDsyB04bu3IGzhu4cgZ2lhbyBk4buLY2ggY2FvIG5o4bqldCBsw6AgUHJvZHVjZSB24bubaSBgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0RGVwYXJ0bWVudClbIlByb2R1Y2UiXS9ucm93KGR0KSoxMDAsIDIpYCUsIHRp4bq/cCB0aGVvIGzDoCBTbmFjayBGb29kcyAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpWyJTbmFjayBGb29kcyJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIEhvdXNlaG9sZCAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpWyJIb3VzZWhvbGQiXS9ucm93KGR0KSoxMDAsIDIpYCUpLiBOaMOzbSBGcm96ZW4gRm9vZHMgY8WpbmcgY2hp4bq/bSB04bu3IGzhu4cgxJHDoW5nIGvhu4MgbMOgIGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KVsiRnJvemVuIEZvb2RzIl0vbnJvdyhkdCkqMTAwLCAyKWAlLiBDw6FjIG5ow7NtIG5oxrAgQ2Fyb3VzZWwgKGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3REZXBhcnRtZW50KVsiQ2Fyb3VzZWwiXS9ucm93KGR0KSoxMDAsIDIpYCUpIHbDoCBDaGVja291dCAoYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdERlcGFydG1lbnQpWyJDaGVja291dCJdL25yb3coZHQpKjEwMCwgMilgJSkgY8OzIHThu7cgbOG7hyB0aOG6pXAgaMahbiBuaGnhu4F1Lg0KDQojIyA1LjkgQmnhur9uIFByb2R1Y3RDYXRlZ29yeQ0KDQpgYGB7cn0NCiNM4bqtcCBi4bqjbmcgdOG6p24gc3XhuqV0IGPhu6dhIGJp4bq/biBQcm9kdWN0Q2F0ZWdvcnkNCnRhYmxlKGR0JFByb2R1Y3RDYXRlZ29yeSkvc3VtKG5yb3coZHQpKQ0KYGBgDQoNCmBgYHtyfQ0KI0zhuq1wIGLhuqNuZyB04bqnbiBzdeG6pXQgY+G7p2EgYmnhur9uIFByb2R1Y3RDYXRlZ29yeQ0KdGFibGUoZHQkUHJvZHVjdENhdGVnb3J5KQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGR0LCBhZXMoeCA9IFByb2R1Y3RDYXRlZ29yeSwgZmlsbCA9IFByb2R1Y3RDYXRlZ29yeSkpICsNCiAgZ2VvbV9iYXIoKSArDQogIGNvb3JkX2ZsaXAoKSArICAjIHhvYXkgbmdhbmcgY2hvIGfhu41uDQogIGxhYnModGl0bGUgPSAiVOG6p24gc3XhuqV0IGdpYW8gZOG7i2NoIHRoZW8gUHJvZHVjdENhdGVnb3J5IiwNCiAgICAgICB4ID0gIlByb2R1Y3RDYXRlZ29yeSIsIHkgPSAiU+G7kSBnaWFvIGThu4tjaCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgIyDhuqluIGNow7ogdGjDrWNoIG7hur91IG114buRbg0KYGBgDQoNClRyb25nIGLhu5kgZOG7ryBsaeG7h3UsIG5ow7NtIHPhuqNuIHBo4bqpbSBjw7MgdOG7tyBs4buHIGdpYW8gZOG7i2NoIGNhbyBuaOG6pXQgbMOgIFZlZ2V0YWJsZXMgduG7m2kgYHIgcm91bmQodGFibGUoZHQkUHJvZHVjdENhdGVnb3J5KVsiVmVnZXRhYmxlcyJdL25yb3coZHQpKjEwMCwgMilgJSwgdGnhur9wIHRoZW8gbMOgIFNuYWNrIEZvb2RzIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpWyJTbmFjayBGb29kcyJdL25yb3coZHQpKjEwMCwgMilgJSkgdsOgIERhaXJ5IChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpWyJEYWlyeSJdL25yb3coZHQpKjEwMCwgMilgJSkuIEPDoWMgbmjDs20gxJHDs25nIGjhu5lwIG5oxrAgQ2FubmVkIE95c3RlcnMgKGByIHJvdW5kKHRhYmxlKGR0JFByb2R1Y3RDYXRlZ29yeSlbIkNhbm5lZCBPeXN0ZXJzIl0vbnJvdyhkdCkqMTAwLCAyKWAlKSB2w6AgQ2FubmVkIENsYW1zIChgciByb3VuZCh0YWJsZShkdCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5uZWQgQ2xhbXMiXS9ucm93KGR0KSoxMDAsIDIpYCUpIGNoaeG6v20gdOG7tyBs4buHIHLhuqV0IG5o4buPLCBjaG8gdGjhuqV5IHPhu7EgxrB1IHRpw6puIG11YSBow6BuZyB0xrDGoWkgdsOgIMSR4buTIMSDbiBuaOG6uS4NCg0KDQoNCg0K