GIỚI THIỆU
Bộ dữ liệu gồm 1199 quan sát và 12 biến, số liệu sau đây nói về tình
trạng ô tô đã qua sử dụng
- Year : Năm sản xuất của ô tô
- Make: Hãng sản xuất ô tô
- Model: Kiểu máy của ô tô
- Trim: Phiên bản của ô tô
- Body: Kiểu dáng xe (sedan, SUV, v.v.)
- Condition: Tình trạng của ô tô (mới, đã qua sử dụng, v.v.)
- Odometer: Số km đã đi của ô tô
- Color: Màu sắc của ô tô
- Interior: Màu sắc nội thất của ô tô
- Seller: Người bán ô tô
- Sellingprice: Giá bán của ô tô
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
p <- read_excel("C:/Users/Dell/Desktop/dữ liệu.xlsx")
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ ggplot2 3.5.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(gganimate)
## Warning: package 'gganimate' was built under R version 4.3.3
library(magick)
## Warning: package 'magick' was built under R version 4.3.3
## Linking to ImageMagick 6.9.12.98
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(readr)
p <- read_csv("C:/Users/Dell/Desktop/dữ liệu.csv")
## Rows: 1199 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): make, model, trim, body, color, interior, seller
## dbl (5): year, condition, odometer, mmr, sellingprice
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datatable(p)
II.Đồ thị dạng Histogram
1.Hình 2.1
p %>% ggplot(aes(x = sellingprice)) +
geom_histogram(binwidth = 5000, fill = 'blue', color = 'red')

Hình 2.1 cho ta thấy giá bán của các loại ô tô
- cột cao nhất có giá bán khoảng 13000 với hơn 200 xe được bán
- Cột thấp nhất có giá 150000
- Cho thấy các loại xe đắt tiền ít được bán chạy hơn các loại xe khác
có giá tầm trung
2.Hình 2.2
p %>% ggplot(aes(x = sellingprice, fill = color)) +
geom_histogram(binwidth = 5000)

Hình 2.2 cho ta thấy giá bán của ô tô theo màu
- Màu black chiếm số lượng nhiều nhất ### 3.Hình
2.3
p %>% ggplot(aes(x = sellingprice)) +
geom_histogram(binwidth = 5000, fill = 'blue', color = 'red') +
facet_wrap(~color)

Hình 2.3 phân tích biểu đồ cột theo giá của từng màu
- Màu black và white chiếm số lượng nhiều nhất với giá bán dưới
50000
4.Hình 2.4
p %>% ggplot(aes(x = sellingprice)) +
geom_histogram(data = p %>% filter(color == 'black'), binwidth = 5000, fill = 'salmon') +
geom_histogram(data = p %>% filter(color == 'white'), binwidth = 5000, fill = 'yellow')

Hình 2.4 cho ta thấy các xe màu white chiếm số lượng mua nhiều hơn
các xe màu black với giá cao nhất khoảng 10000
- Số lượng ít nhất là xe màu black với giá hơn 75000
III. Đồ thị dạng Density
1. Hình 3.1
p %>% ggplot(aes(x =sellingprice)) +
geom_density(fill = 'red')

2. Hình 3.2
p %>% ggplot(aes(x = condition, fill = make )) +
geom_density()
## Warning: Removed 41 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning: Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

Hình 3.2 cho thấy tình trạng của ô tô đã qua sử dụng, trong đó Honda
chiếm số lượng nhiều nhất, qua đó ta biết được
- Honda có tuổi đời khoảng 35 năm dài hơn các loại xe khác
- Thấp nhất là Volvo khoảng 5 năm
3. Hình 3.3
p %>% ggplot(aes(x = sellingprice)) +
geom_density(fill = 'green') +
facet_wrap(~color)
## Warning: Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

Hình 3.3 cho thấy giá bán của xe theo các màu
- Màu purple cao nhất
- Màu thấp nhất là gold
- Hầu như k có là màu yellow
IV. Đồ thị dạng Pie Chart
1. Hình 4.1
p <- p %>% filter(make == 'Audi' )
p %>% group_by(interior) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = interior)) +
geom_col() +
geom_text(aes(label = n),position = position_stack(vjust = 0.75))

Hình 4.1 cho thấy xe hãng Audi có màu black chiếm sồ lương nhiều nhất
chiếm 21
- Còn lại là các màu beige, brown, gray có ít chỉ chiếm 1
2. Hình 4.2
p %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = color)) +
geom_col() +
coord_polar('y')

Hình 4.2 cho ta thấy biểu đồ tròn thể hiện số lượng theo từng màu
- Chiếm phần lớn là màu black
3. Hình 4.3
p %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = color )) +
geom_col(color = 'white') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = 0.5)) +
theme_void()

- Cũng giống như hình 4.2 thì hình 4.3 thể hiện số liệu cụ thể
hơn
- Nhiều nhất là màu white và black
- Qua đó cho thấy đa số người mua sẽ chuộng màu white và black
hơn
V. Đồ thị dạng Scatter
1. Hình 5.1
p %>% ggplot(aes(x = year, y = interior)) +
geom_point() +
xlab('Năm') +
ylab('Màu sắc nội thất')

Hình 5.1 thể hiện màu sắc nội thất qua các năm
2. Hình 5.2
p %>% ggplot(aes(x = year, y = interior, color = make)) +
geom_point()

Hình 5.2 thể hiện màu nội thất của các hãng xe qua từng
năm
Màu gray, brown, black chiếm số lượng nhiều ở các hãng
xe
3. Hình 5.3
p %>% ggplot(aes(x = year , y = make , shape = color)) +
geom_point()

Hình 5.3 thể hiện các màu như white, silver, red, gray, brown, blue,
black, beige của các loại xe qua từng năm từ 2012-2015 bằng kí hiệu
4. Hình 5.4
p %>% ggplot(aes(x = year, y = color, size = sellingprice)) +
geom_point()

- Hình 5.4 cho ta thấy giá của các xe theo màu sắc qua từng năm
- Chấm càng lớn thì giá càng cao
- Và ngược lại chấm càng nhỏ thì giá càng thấp
- Năm 2012 giá cao nhất là màu gray
- Các năm còn lại giá tương đối ổn định
5. Hình 5.5
p %>% ggplot(aes(x = year, y = interior, alpha = sellingprice)) +
geom_point()

- Hình 5.5 cho ta biết được giá bán xe tưng năm theo màu bằng độ đậm
nhạt
- Chấm càng đậm thì giá càng cao
- Chấm càng nhạt thì giá càng thấp
6. Hình 5.6
p %>% ggplot(aes(x = year, y = condition)) +
geom_point(color = 'red') +
geom_smooth(method = 'lm', color = 'green')
## `geom_smooth()` using formula = 'y ~ x'

7. Hình 5.7
p %>% ggplot(aes(x = year, y = condition)) +
geom_point(color = 'red') +
geom_smooth(method = 'lm', color = 'green') +
facet_wrap(~color)
## `geom_smooth()` using formula = 'y ~ x'

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOqIFRo4buLIFRoYW5oIFBow7oiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICAgIGh0bWxfZG9jdW1lbnQ6IA0KICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICAgICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyAqKkdJ4buaSSBUSEnhu4ZVKioNCg0KQuG7mSBk4buvIGxp4buHdSBn4buTbSAxMTk5IHF1YW4gc8OhdCB2w6AgMTIgYmnhur9uLCBz4buRIGxp4buHdSBzYXUgxJHDonkgbsOzaSB24buBIHTDrG5oIHRy4bqhbmcgw7QgdMO0IMSRw6MgcXVhIHPhu60gZOG7pW5nDQoNCi0gWWVhciA6IE7Eg20gc+G6o24geHXhuqV0IGPhu6dhIMO0IHTDtA0KLSBNYWtlOiBIw6NuZyBz4bqjbiB4deG6pXQgw7QgdMO0DQotIE1vZGVsOiBLaeG7g3UgbcOheSBj4bunYSDDtCB0w7QNCi0gVHJpbTogUGhpw6puIGLhuqNuIGPhu6dhIMO0IHTDtA0KLSBCb2R5OiBLaeG7g3UgZMOhbmcgeGUgKHNlZGFuLCBTVVYsIHYudi4pDQotIENvbmRpdGlvbjogVMOsbmggdHLhuqFuZyBj4bunYSDDtCB0w7QgKG3hu5tpLCDEkcOjIHF1YSBz4butIGThu6VuZywgdi52LikNCi0gT2RvbWV0ZXI6IFPhu5Ega20gxJHDoyDEkWkgY+G7p2Egw7QgdMO0DQotIENvbG9yOiBNw6B1IHPhuq9jIGPhu6dhIMO0IHTDtA0KLSBJbnRlcmlvcjogTcOgdSBz4bqvYyBu4buZaSB0aOG6pXQgY+G7p2Egw7QgdMO0DQotIFNlbGxlcjogTmfGsOG7nWkgYsOhbiDDtCB0w7QNCi0gU2VsbGluZ3ByaWNlOiBHacOhIGLDoW4gY+G7p2Egw7QgdMO0DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KcCA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9EZWxsL0Rlc2t0b3AvZOG7ryBsaeG7h3UueGxzeCIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ2FuaW1hdGUpDQpsaWJyYXJ5KG1hZ2ljaykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHJlYWRyKQ0KcCA8LSByZWFkX2NzdigiQzovVXNlcnMvRGVsbC9EZXNrdG9wL2Thu68gbGnhu4d1LmNzdiIpIA0KZGF0YXRhYmxlKHApDQpgYGANCg0KIyMgKipJLsSQ4buTIHRo4buLIGThuqFuZyBCYXIgQ2hhcnQqKg0KIyMjICoqMS5Iw6xuaCAxLjEqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ07Eg20nLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KSMOsbmggMS4xIGNobyB0YSB0aOG6pXkgc+G7kSBsxrDhu6NuZyBz4bqjbiB4deG6pXQgw7QgdMO0IHF1YSBjw6FjIG7Eg20gdOG7qyAyMDEyLTIwMTUNCg0KKyBOxINtIDIwMTIgY2hp4bq/bSA0NTcgc+G7kSBsxrDhu6NuZw0KKyBOxINtIDIwMTMgY2hp4bq/bSA2MjAgc+G7kSBsxrDhu6NuZyAobmhp4buBdSBuaOG6pXQpDQorIE7Eg20gMjAxNCBjaGnhur9tIDY2IHPhu5EgbMaw4bujbmcNCisgTsSDbSAyMDE1IGNoaeG6v20gNTYgc+G7kSBsxrDhu6NuZyAow610IG5o4bqldCkNCg0KIyMjICoqMi4gSMOsbmggMS4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gaW50ZXJpb3IpKSArDQogICAgZ2VvbV9iYXIoKSArDQogICAgbGFicyh4ID0gJ03DoHUgbuG7mWkgdGjhuqV0JywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICAgIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCkjDrG5oIDEuMiBjaG8gdGEgdGjhuqV5IG3DoHUgYmxhY2sgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IGfhuqduIDcwMCB0csOqbiB04buVbmcgc+G7kSBsxrDhu6NuZw0KDQotIE3DoHUgYmx1ZSwgYnVyZ3VuZHksIHJlZCwgd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIMOtdA0KDQojIyAqKklJLsSQ4buTIHRo4buLIGThuqFuZyBIaXN0b2dyYW0qKg0KIyMjICoqMS5Iw6xuaCAyLjEqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCwgZmlsbCA9ICdibHVlJywgY29sb3IgPSAncmVkJykNCmBgYA0KDQpIw6xuaCAyLjEgY2hvIHRhIHRo4bqleSBnacOhIGLDoW4gY+G7p2EgY8OhYyBsb+G6oWkgw7QgdMO0DQoNCisgY+G7mXQgY2FvIG5o4bqldCBjw7MgZ2nDoSBiw6FuIGtob+G6o25nIDEzMDAwIHbhu5tpIGjGoW4gMjAwIHhlIMSRxrDhu6NjIGLDoW4NCisgQ+G7mXQgdGjhuqVwIG5o4bqldCBjw7MgZ2nDoSAxNTAwMDANCisgQ2hvIHRo4bqleSBjw6FjIGxv4bqhaSB4ZSDEkeG6r3QgdGnhu4FuIMOtdCDEkcaw4bujYyBiw6FuIGNo4bqheSBoxqFuIGPDoWMgbG/huqFpIHhlIGtow6FjIGPDsyBnacOhIHThuqdtIHRydW5nDQoNCiMjIyAqKjIuSMOsbmggMi4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gc2VsbGluZ3ByaWNlLCBmaWxsID0gY29sb3IpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCkNCmBgYA0KDQpIw6xuaCAyLjIgY2hvIHRhIHRo4bqleSBnacOhIGLDoW4gY+G7p2Egw7QgdMO0IHRoZW8gbcOgdQ0KDQotIE3DoHUgYmxhY2sgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0DQojIyMgKiozLkjDrG5oIDIuMyoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHNlbGxpbmdwcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwLCBmaWxsID0gJ2JsdWUnLCBjb2xvciA9ICdyZWQnKSArDQogIGZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQoNCkjDrG5oIDIuMyBwaMOibiB0w61jaCBiaeG7g3UgxJHhu5MgY+G7mXQgdGhlbyBnacOhIGPhu6dhIHThu6tuZyBtw6B1DQoNCi0gTcOgdSBibGFjayB2w6Agd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IHbhu5tpIGdpw6EgYsOhbiBkxrDhu5tpIDUwMDAwDQoNCiMjIyAqKjQuSMOsbmggMi40KioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gc2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gcCAlPiUgZmlsdGVyKGNvbG9yID09ICdibGFjaycpLCBiaW53aWR0aCA9IDUwMDAsIGZpbGwgPSAnc2FsbW9uJykgKw0KICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gcCAlPiUgZmlsdGVyKGNvbG9yID09ICd3aGl0ZScpLCBiaW53aWR0aCA9IDUwMDAsIGZpbGwgPSAneWVsbG93JykNCmBgYA0KDQpIw6xuaCAyLjQgY2hvIHRhIHRo4bqleSBjw6FjIHhlIG3DoHUgd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIG11YSBuaGnhu4F1IGjGoW4gY8OhYyB4ZSBtw6B1IGJsYWNrIHbhu5tpIGdpw6EgY2FvIG5o4bqldCBraG/huqNuZyAxMDAwMA0KDQotIFPhu5EgbMaw4bujbmcgw610IG5o4bqldCBsw6AgeGUgbcOgdSBibGFjayB24bubaSBnacOhIGjGoW4gNzUwMDANCg0KIyMgKipJSUkuIMSQ4buTIHRo4buLIGThuqFuZyBEZW5zaXR5KioNCiMjIyAqKjEuIEjDrG5oIDMuMSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9c2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdyZWQnKQ0KYGBgDQoNCg0KDQojIyMgKioyLiBIw6xuaCAzLjIqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBjb25kaXRpb24sIGZpbGwgPSBtYWtlICkpICsNCiAgZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpIw6xuaCAzLjIgY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGPhu6dhIMO0IHTDtCDEkcOjIHF1YSBz4butIGThu6VuZywgdHJvbmcgxJHDsyBIb25kYSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQsIHF1YSDEkcOzIHRhIGJp4bq/dCDEkcaw4bujYw0KDQotIEhvbmRhIGPDsyB0deG7lWkgxJHhu51pIGtob+G6o25nIDM1IG7Eg20gZMOgaSBoxqFuIGPDoWMgbG/huqFpIHhlIGtow6FjDQotIFRo4bqlcCBuaOG6pXQgbMOgIFZvbHZvIGtob+G6o25nIDUgbsSDbQ0KDQojIyMgKiozLiBIw6xuaCAzLjMqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2dyZWVuJykgKw0KICBmYWNldF93cmFwKH5jb2xvcikNCmBgYA0KDQpIw6xuaCAzLjMgY2hvIHRo4bqleSBnacOhIGLDoW4gY+G7p2EgeGUgdGhlbyBjw6FjIG3DoHUgDQoNCi0gTcOgdSBwdXJwbGUgY2FvIG5o4bqldA0KLSBNw6B1IHRo4bqlcCBuaOG6pXQgbMOgIGdvbGQNCi0gSOG6p3UgbmjGsCBrIGPDsyBsw6AgbcOgdSB5ZWxsb3cNCg0KIyMgKipJVi4gxJDhu5MgdGjhu4sgZOG6oW5nIFBpZSBDaGFydCoqDQojIyMgKioxLiBIw6xuaCA0LjEqKg0KYGBge3J9DQpwIDwtIHAgJT4lIGZpbHRlcihtYWtlID09ICdBdWRpJyApDQpwICU+JSBncm91cF9ieShpbnRlcmlvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBpbnRlcmlvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNzUpKQ0KYGBgDQoNCkjDrG5oIDQuMSBjaG8gdGjhuqV5IHhlIGjDo25nIEF1ZGkgY8OzIG3DoHUgYmxhY2sgY2hp4bq/bSBz4buTIGzGsMahbmcgbmhp4buBdSBuaOG6pXQgY2hp4bq/bSAyMQ0KDQotIEPDsm4gbOG6oWkgbMOgIGPDoWMgbcOgdSBiZWlnZSwgYnJvd24sIGdyYXkgY8OzIMOtdCBjaOG7iSBjaGnhur9tIDENCiAgICAgDQojIyMgKioyLiBIw6xuaCA0LjIqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBjb29yZF9wb2xhcigneScpDQpgYGANCg0KSMOsbmggNC4yIGNobyB0YSB0aOG6pXkgYmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHRoZW8gdOG7q25nIG3DoHUNCg0KLSBDaGnhur9tIHBo4bqnbiBs4bubbiBsw6AgbcOgdSBibGFjaw0KDQojIyMgKiozLiBIw6xuaCA0LjMqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvciApKSArDQogICAgZ2VvbV9jb2woY29sb3IgPSAnd2hpdGUnKSArDQogICAgY29vcmRfcG9sYXIoJ3knKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gMS4zLCBsYWJlbCA9IG4pLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogICAgdGhlbWVfdm9pZCgpDQpgYGANCg0KLSBDxaluZyBnaeG7kW5nIG5oxrAgaMOsbmggNC4yIHRow6wgaMOsbmggNC4zIHRo4buDIGhp4buHbiBz4buRIGxp4buHdSBj4bulIHRo4buDIGjGoW4NCi0gTmhp4buBdSBuaOG6pXQgbMOgIG3DoHUgd2hpdGUgdsOgIGJsYWNrDQotIFF1YSDEkcOzIGNobyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgbXVhIHPhur0gY2h14buZbmcgbcOgdSB3aGl0ZSB2w6AgYmxhY2sgaMahbg0KDQojIyAqKlYuIMSQ4buTIHRo4buLIGThuqFuZyBTY2F0dGVyKioNCiMjIyAqKjEuIEjDrG5oIDUuMSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBpbnRlcmlvcikpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgeGxhYignTsSDbScpICsgDQogIHlsYWIoJ03DoHUgc+G6r2MgbuG7mWkgdGjhuqV0JykNCmBgYA0KDQpIw6xuaCA1LjEgdGjhu4MgaGnhu4duIG3DoHUgc+G6r2MgbuG7mWkgdGjhuqV0IHF1YSBjw6FjIG7Eg20NCg0KIyMjICoqMi4gSMOsbmggNS4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGludGVyaW9yLCBjb2xvciA9IG1ha2UpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNCi0gSMOsbmggNS4yIHRo4buDIGhp4buHbiBtw6B1IG7hu5lpIHRo4bqldCBj4bunYSBjw6FjIGjDo25nIHhlIHF1YSB04burbmcgbsSDbSANCg0KLSBNw6B1IGdyYXksIGJyb3duLCBibGFjayBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmhp4buBdSDhu58gY8OhYyBow6NuZyB4ZQ0KDQojIyMgKiozLiBIw6xuaCA1LjMqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyICwgeSA9IG1ha2UgLCBzaGFwZSA9IGNvbG9yKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQpIw6xuaCA1LjMgdGjhu4MgaGnhu4duIGPDoWMgbcOgdSBuaMawIHdoaXRlLCBzaWx2ZXIsIHJlZCwgZ3JheSwgYnJvd24sIGJsdWUsIGJsYWNrLCBiZWlnZSBj4bunYSBjw6FjIGxv4bqhaSB4ZSBxdWEgdOG7q25nIG7Eg20gdOG7qyAyMDEyLTIwMTUgYuG6sW5nIGvDrSBoaeG7h3UNCg0KIyMjICoqNC4gSMOsbmggNS40KioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGNvbG9yLCBzaXplID0gc2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQotIEjDrG5oIDUuNCBjaG8gdGEgdGjhuqV5IGdpw6EgY+G7p2EgY8OhYyB4ZSB0aGVvIG3DoHUgc+G6r2MgcXVhIHThu6tuZyBuxINtIA0KLSBDaOG6pW0gY8OgbmcgbOG7m24gdGjDrCBnacOhIGPDoG5nIGNhbw0KLSBWw6AgbmfGsOG7o2MgbOG6oWkgY2jhuqVtIGPDoG5nIG5o4buPIHRow6wgZ2nDoSBjw6BuZyB0aOG6pXANCi0gTsSDbSAyMDEyIGdpw6EgY2FvIG5o4bqldCBsw6AgbcOgdSBncmF5DQotIEPDoWMgbsSDbSBjw7JuIGzhuqFpIGdpw6EgdMawxqFuZyDEkeG7kWkg4buVbiDEkeG7i25oDQoNCiMjIyAqKjUuIEjDrG5oIDUuNSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBpbnRlcmlvciwgYWxwaGEgPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNCi0gSMOsbmggNS41IGNobyB0YSBiaeG6v3QgxJHGsOG7o2MgZ2nDoSBiw6FuIHhlIHTGsG5nIG7Eg20gdGhlbyBtw6B1IGLhurFuZyDEkeG7mSDEkeG6rW0gbmjhuqF0DQotIENo4bqlbSBjw6BuZyDEkeG6rW0gdGjDrCBnacOhIGPDoG5nIGNhbyANCi0gQ2jhuqVtIGPDoG5nIG5o4bqhdCB0aMOsIGdpw6EgY8OgbmcgdGjhuqVwDQoNCiMjIyAqKjYuIEjDrG5oIDUuNioqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBjb25kaXRpb24pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAncmVkJykgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdncmVlbicpDQpgYGANCg0KDQojIyMgKio3LiBIw6xuaCA1LjcqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gY29uZGl0aW9uKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnZ3JlZW4nKSArDQogIGZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQo=