Latar Belakang

Dalam dunia bisnis, Coffee Chain merujuk kepada jaringan bisnis yang terdiri dari beberapa kedai kopi (coffee shops) yang dimiliki atau dioperasikan oleh satu perusahaan yang sama. Dataset yang digunakan dalam analisis ini adalah Coffee Chain Datasets yang merupakan kumpulan data penjualan dan keuangan dari bisnis produk kopi dan teh di pasar Amerika Serikat pada tahun 2012-2013. Dataset ini mencakup berbagai variabel yang menggambarkan karakteristik pasar, seperti kode area, letak pasar (central, east, south, west), state (20 state di Amerika Serikat), ukuran pasar (major market dan small market), tipe pasar (regular dan decaf), jenis produk (coffee, tea, espresso, herbal tea), asal produk (beans dan leaves), nama produk (amaretto, colombian, decaf irish cream, green tea, dsb), tanggal, serta metrik keuangan berupa budget COGS, budget margain, budget sales, budget profit, COGS, inventory, margin, marketing, profit, sales, dan total expenses. Dataset ini memungkinkan analisis perbandingan antara perencanaan dan realisasi.

Dalam bisnis coffee chain, memahami faktor-faktor penentu Profit (laba) yang dihasilkan merupakan hal yang penting dalam pengambilan keputusan yang strategis. Ada banyak faktor yang dapat memengaruhi nilai Profit (laba), dua diantaranya adalah Sales (penjualan) dan Total Expenses (total pengeluaran). Sales merupakan varianel yang mencerminkan kemampuan bisnis dalam menghasilkan pendapatan, sementara Total Expenses mewakili seluruh biaya operasional yang dikeluarkan untuk mempertahankan bisnis. Dalam analisis ini, akan diukur pengaruh Sales dan Total Expenses terhadap Profit yang dihasilkan tiap State di Amerika. Dengan demikian, hasil analisis ini dapat memberikan informasi penting bagi manajemen dalam mengoptimalkan strategi bisnis, seperti meningkatkan efisiensi operasional atau fokus pada pertumbuhan penjualan.


Metode Analisis

Metode yang dapat digunakan untuk analisis ini adalah regresi linear berganda. Analisis regresi berganda merupakan metode statistik yang digunakan untuk memahami hubungan antara satu variabel dependen dan dua atau lebih variabel independen. Tujuan utama dari metode ini adalah untuk menentukan sejauh mana variabel-variabel independen tersebut berpengaruh terhadap variasi variabel dependennya. Bentuk umum model regresi berganda dengan k variabel independen adalah:

\[ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_pX_p + \epsilon\] dimana \(Y\) adalah variabel dependen, \(X_1,X_2,...,X_n\) adalah variabel independen, \(\beta_0,\beta_1,...,\beta_n\) adalah parameter regresi, dan \(\epsilon\) adalah sesatan.


Data

Data yang digunakan dalam analisis ini dikelompokkan berdasarkan State di Amerika Serikat, dengan variabel independen yang digunakan adalah Sales \((X_1)\) dan Total Expenses \((X_2)\), sedangkan variabel dependen nya adalah Profit \((Y)\).

# Memuat package yang dibutuhkan
library(readxl)
library(rmarkdown)
library(dplyr)
library(tidyverse)
library(car)
library(lmtest)
library(ggplot2)
# Mengimport datasets dari file excel
Coffee_Chain_Datasets <- read_excel("~/@ SIM 2025/DATA CM 1/3. CM1 - Coffee Chain Datasets/3. CM1 - Coffee Chain Datasets.xlsx")
# Membuat filter data sesuai variabel yang dibutuhkan
Data_Filter <- Coffee_Chain_Datasets %>%
  group_by(State) %>%
  summarise(
    Y = sum(Profit, na.rm = TRUE),
    X1 = sum(Sales, na.rm = TRUE),
    X2 = sum(`Total Expenses`, na.rm = TRUE)
  )
print(Data_Filter)
## # A tibble: 20 × 4
##    State             Y    X1    X2
##    <chr>         <dbl> <dbl> <dbl>
##  1 California    31785 96892 23222
##  2 Colorado      17743 48179 12143
##  3 Connecticut    7621 25429  8096
##  4 Florida       12310 37443 11009
##  5 Illinois      30821 69883 13653
##  6 Iowa          22212 54750 11838
##  7 Louisiana      7355 23161  7182
##  8 Massachusetts 16442 29965  6765
##  9 Missouri       3601 24647  9641
## 10 Nevada        10616 60159 18586
## 11 New Hampshire  2748 14887  6606
## 12 New Mexico      799 15892  7243
## 13 New York      20096 70852 17637
## 14 Ohio          10773 34517 10251
## 15 Oklahoma       8558 27463  8577
## 16 Oregon        12439 40899 12448
## 17 Texas         15766 37410  8000
## 18 Utah           7751 35384 12409
## 19 Washington    11405 38930 12849
## 20 Wisconsin      8702 33069 11507

Analisis

Statistika Deskriptif

Statistika deskriptif merupakan metode analisis yang digunakan untuk merangkum, menyajikan data, serta memberikan gambaran yang jelas tentang karakteristiknya. Beberapa ukuran statistik yang umum digunakan adalah nilai minimun \((Min)\), nilai maksimum \((Max)\), kuartil pertama \((Q_1)\), kuartil kedua atau median \((Q_2)\), kuartil ketiga \((Q_3)\), serta nilai rata-rata \((Mean)\).

# Statistik deskriptif dari semua variabel yang digunakan
summary(Data_Filter)
##     State                 Y               X1              X2       
##  Length:20          Min.   :  799   Min.   :14887   Min.   : 6606  
##  Class :character   1st Qu.: 7718   1st Qu.:26955   1st Qu.: 8072  
##  Mode  :character   Median :11089   Median :36397   Median :11258  
##                     Mean   :12977   Mean   :40991   Mean   :11483  
##                     3rd Qu.:16767   3rd Qu.:49822   3rd Qu.:12548  
##                     Max.   :31785   Max.   :96892   Max.   :23222

Interpretasi: Dari output diperoleh informasi bahwa variabel State bersifat kategorikal dengan jumlah 20 observasi. Secara umum, ketiga variabel numerik yaitu \(Y\), \(X_1\), dan \(X_2\) menunjukkan variasi data yang besar dengan variabel yang memiliki rentang terlebar adalah \(X_1\).

##   Kategori         State Nilai
## 1   Y Maks    California 31785
## 2    Y Min    New Mexico   799
## 3  X1 Maks    California 96892
## 4   X1 Min New Hampshire 14887
## 5  X2 Maks    California 23222
## 6   X2 Min New Hampshire  6606

Interpretasi: Diketahui variabel \(X_1\) mewakili Sales, \(X_2\) mewakili Total Expenses, dan \(Y\) mewakili Profit. Dari output \(data.frame\) di atas, diperoleh informasi bahwa State yang memiliki nilai Profit, Sales, dan Total Expenses tertinggi adalah California, hal ini menandai adanya kinerja bisnis yang kuat meski dengan pengeluaran tinggi. Di sisi lain, New Mexico memiliki Profit terendah meski Sales, dan Total Expenses nya bukan yang paling rendah. Sementara New Hampshire beroperasi dengan Sales, dan Total Expenses paling rendah.

Scatter Plot tiap Variabel

Scatter Plot Y vs X1

# Scatterplot Y vs X1
ggplot(Data_Filter, aes(x = X1, y = Y)) +
    geom_point(color = "#1E5128") +         # menciptakan titik
    ggtitle("Scatterplot of Y vs X1") +
    xlab("X1") +
    ylab("Y")

Interpretasi: Scatter plot ini menunjukkan hubungan antara variabel \(Y\) (sumbu vertikal) dan \(X_1\) (sumbu horizontal). Pola yang dihasilkan mengindikasikan adanya kemungkinan hubungan positif antara \(Y\) dan \(X_1\), di mana peningkatan nilai \(X_1\) cenderung diikuti peningkatan nilai \(Y\), meskipun tidak terlalu kuat karena sebaran data yang cukup lebar.

Scatter Plot Y vs X2

# Scatterplot Y vs X2
ggplot(Data_Filter, aes(x = X2, y = Y)) +
    geom_point(color = "#1E5128") +         # menciptakan titik
    ggtitle("Scatterplot of Y vs X2") +
    xlab("X2") +
    ylab("Y")

Interpretasi: Scatter plot ini menunjukkan hubungan antara variabel \(Y\) (sumbu vertikal) dan \(X_2\) (sumbu horizontal). Pola yang dihasilkan menunjukkan kemungkinan hubungan negatif antara \(X_2\) dan \(Y\), di mana peningkatan nilai \(X_2\) justru diikuti oleh penurunan nilai \(Y\).

Uji Asumsi Klasik

# Membuat persamaan model regresi linier berganda
model <- lm(Y ~ X1+X2, data=Data_Filter)
model
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
## 
## Coefficients:
## (Intercept)           X1           X2  
##   5695.9338       0.7534      -2.0554

Uji Non-Multikolinearitas

  1. Hipotesis

    \(H_0\) : Tidak terjadi gejala multikolinearitas

    \(H_1\) : Terjadi gejala multikolinearitas

  2. Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(VIF > 10\)

  4. Statistik Uji

# Plot VIF
nilai_vif <- vif(model)
plot(nilai_vif, type = "bar", main = "VIF Plot")

# Uji Non-Multikolinearitas
vif(model)
##       X1       X2 
## 6.095037 6.095037
  1. Kesimpulan

    Karena dari perhitungan, diperoleh nilai \(VIF\) kedua variabel \(< 10\), maka \(H_0\) gagal ditolak, yang artinya model tidak mengalami gejala multikolinearitas.

Uji Normalitas Residu

  1. Hipotesis

    \(H_0\) : Residu data berdistribusi normal

    \(H_1\) : Residu data tidak berdistribusi normal

  2. Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(p-value < \alpha = 0.05\)

  4. Statistik Uji

# Q-Q Plot
qqnorm(resid(model))
qqline(resid(model))

# Uji Normalitas Residu
shapiro.test(resid(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(model)
## W = 0.98436, p-value = 0.9774
  1. Kesimpulan

    Karena jika dilihat plot normal Q-Q nya, dapat terlihat bahwa titik-titik menyebar di sekitar grafik normal mengikuti garis diagonal dan nilai \(p-value = 0.9774 > \alpha = 0.05\) maka \(H_0\) gagal ditolak, yang artinya residu data berdistribusi normal.

Uji Non-Autokorelasi

  1. Hipotesis

    \(H_0\) : Tidak ada autokorelasi antar residu data

    \(H_1\) : Terjadi autokorelasi antar residu data

  2. Tingkat Signifikansi \((\alpha)\) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(p-value < \alpha = 0.05\)

  4. Statistik Uji

# Uji Autokorelasi
dwtest(model)
## 
##  Durbin-Watson test
## 
## data:  model
## DW = 1.5004, p-value = 0.1046
## alternative hypothesis: true autocorrelation is greater than 0
  1. Kesimpulan

    Karena dari perhitungan, diperoleh nilai \(p-value = 0.1046 > \alpha = 0.05\) maka \(H_0\) gagal ditolak, yang artinya tidak ada autokorelasi antar residu data

Uji Homoskedastisitas

  1. Hipotesis

    \(H_0\) : Terdapat homoskedastisitas dalam residu data

    \(H_1\) : Tidak terdapat homoskedastisitas dalam residu data

  2. Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(p-value < \alpha = 0.05\)

  4. Statistik Uji

# Plot
plot(model, which = 1)

# Uji Homoskedastisitas
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 2.1651, df = 2, p-value = 0.3387
  1. Kesimpulan

    Karena dari perhitungan, diperoleh nilai \(p-value = 0.3387 > \alpha = 0.05\) maka \(H_0\) gagal ditolak, yang artinya terdapat homoskedastisitas dalam residu data.

Analisis Regresi Linear Berganda

# Membuat persamaan model regresi linier berganda
model <- lm(Y ~ X1+X2, data=Data_Filter)
model
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
## 
## Coefficients:
## (Intercept)           X1           X2  
##   5695.9338       0.7534      -2.0554
summary(model)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2730.98  -893.82   -29.75   933.62  2787.80 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5695.93380 1099.66103    5.18 7.54e-05 ***
## X1             0.75343    0.04344   17.34 3.03e-12 ***
## X2            -2.05540    0.20719   -9.92 1.74e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared:  0.9681, Adjusted R-squared:  0.9643 
## F-statistic: 257.7 on 2 and 17 DF,  p-value: 1.928e-13

Berdasarkan hasil analisis regresi di atas, diperoleh persamaan regresi untuk model ini : \[ Y = 5696.93380 + 0.75343X_1 - 2.05540X_2\] Interpretasi model:

  1. Jika variabel Sales \((X_1)\) dan Total Expenses \((X_2)\) diasumsikan bernilai nol, maka nilai Profit \((Y)\) akan bernilai 5696,93380.
  2. Setiap kenaikan satu nilai Sales \((X_1)\), akan menaikkan nilai Profit \((Y)\) sebesar 0,75343.
  3. Setiap kenaikan satu nilai Total Expenses \((X_2)\) akan menurunkan nilai Profit \((Y)\) sebesar 2,05540.

Selain itu, dari hasil \(summary(model)\) juga diperoleh bahwa nilai Koefisien Determinasi (Adjusted R-Squared) bernilai 96,43%. Hal ini menunjukkan bahwa variabel independen \((X)\) dalam model regresi ini mampu menjelaskan variansi dari variabel dependen \((Y)\) sebesar 96,43%, sedangkan sisanya yaitu 3,57% dijelaskan oleh variabel lain yang tidak digunakan dalam model.

Uji Hipotesis

Uji Simultan (F)

  1. Hipotesis

    \(H_0\) : Variabel independen secara simultan tidak berpengaruh signifikan terhadap variabel dependen

    \(H_1\) : Variabel independen secara simultan berpengaruh signifikan terhadap variabel dependennya

  2. Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(p-value < \alpha = 0.05\)

  4. Statistik Uji

# Uji F
summary(model)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2730.98  -893.82   -29.75   933.62  2787.80 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5695.93380 1099.66103    5.18 7.54e-05 ***
## X1             0.75343    0.04344   17.34 3.03e-12 ***
## X2            -2.05540    0.20719   -9.92 1.74e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared:  0.9681, Adjusted R-squared:  0.9643 
## F-statistic: 257.7 on 2 and 17 DF,  p-value: 1.928e-13
  1. Kesimpulan

    Karena dari perhitungan, diperoleh nilai \(p-value = 1.928*10^{-13} < \alpha = 0.05\) maka \(H_0\) ditolak, yang artinya semua variabel independen berpengaruh signifikan terhadap variabel dependen secara simultan.

Uji Parsial (T)

  1. Hipotesis

    • Untuk \(X_1\) = Sales

      \(H_0\) : Sales tidak berpengaruh signifikan terhadap Profit

      \(H_1\) : Sales berpengaruh signifikan terhadap Profit

    • Untuk \(X_2\) = Total Expenses

      \(H_0\) : Total Expenses tidak berpengaruh signifikan terhadap Profit

      \(H_1\) : Total Expenses berpengaruh signifikan terhadap Profit

  2. Tingkat Signifikansi (\(\alpha\)) = \(5\)% = \(0.05\)

  3. Daerah Kritis

    \(H_0\) ditolak jika \(p-value < \alpha = 0.05\)

  4. Statistik Uji

# Uji T
summary(model)
## 
## Call:
## lm(formula = Y ~ X1 + X2, data = Data_Filter)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2730.98  -893.82   -29.75   933.62  2787.80 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5695.93380 1099.66103    5.18 7.54e-05 ***
## X1             0.75343    0.04344   17.34 3.03e-12 ***
## X2            -2.05540    0.20719   -9.92 1.74e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1581 on 17 degrees of freedom
## Multiple R-squared:  0.9681, Adjusted R-squared:  0.9643 
## F-statistic: 257.7 on 2 and 17 DF,  p-value: 1.928e-13
  1. Kesimpulan
  • Untuk \(X_1\) = Sales

    Karena dari perhitungan, diperoleh nilai \(p-value = 3.03*10^{-12} < \alpha = 0.05\) maka \(H_0\) ditolak, yang artinya Sales memiliki pengaruh yang signifikan terhadap Profit secara parsial.

  • Untuk \(X_2\) = Total Expenses

    Karena dari perhitungan, diperoleh nilai \(p-value = 1.74*10^{-8} < \alpha = 0.05\) maka \(H_0\) ditolak, yang artinya Total Expenses memiliki pengaruh yang signifikan terhadap Profit secara parsial.


Kesimpulan Hasil Analisis

Berdasarkan analisis yang sudah dilakukan dapat disimpulkan bahwa variabel independen \(X_1\) yaitu Sales dan \(X_2\) yaitu Total Expenses berpengaruh secara signfikan terhadap variabel dependen Y yaitu Profit secara bersama-sama atau simultan dan secara parsial dengan persamaan model regresi linear bergandanya adalah \(Y = 5696.93380 + 0.75343X_1 - 2.05540X_2\). Model regresi ini memiliki nilai koefisien determinasi sebesar 96,43% yang berarti variabel independen \((X)\) dalam model regresi ini mampu menjelaskan variansi dari variabel dependen sebesar 96,43%, sedangkan sisanya yaitu sebesar 3,57% dijelaskan oleh variabel lain yang tidak digunakan dalam model. Selain itu, berdasarkan uji asumsi klasik, semua uji asumsi yakni, uji non-multikolinearitas, uji normalitas residu, uji non-autokorelasi, dan uji homoskedastisitas terpenuhi sehingga model regresi ini layak untuk digunakan.

Analisis ini menunjukkan bahwa Profit (laba) perusahaan coffee chain sangat dipengaruhi oleh penjualan (Sales) dan pengeluaran (Total Expenses), di mana kontrol biaya memegang peran lebih kritis dibandingkan peningkatan penjualan. Model regresi yang dihasilkan memiliki nilai koefisien determinasi yang cukup tinggi, sehingga perusahaan dapat menggunakannya untuk mengambil keputusan strategis seperti optimalisasi biaya, alokasi sumber daya, dan evaluasi kinerja per State di Amerika Serikat. Kunci utamanya adalah menyeimbangkan pertumbuhan penjualan dengan efisiensi biaya, sambil mempertimbangkan faktor eksternal lain yang mungkin berdampak kecil namun signifikan. Dengan pendekatan ini, perusahaan dapat meningkatkan profit secara lebih efektif dan terukur.


Daftar Pustaka

Purba, R. L. (2022, Mei 22). Penerapan regresi berganda dengan R Studio. RPubs.

Sholihah, S.M., Aditiya, N.Y., Evani, E.S., & Maghfiroh, S. (2023). Konsep uji asumsi klasik pada regresi linier berganda. Jurnal Riset Akuntansi Soedirman (JRAS), 2(2), [102-110].

LS0tDQp0aXRsZTogIkFuYWxpc2lzIFJlZ3Jlc2kgTGluZWFyIEJlcmdhbmRhIFBlbmdhcnVoIFNhbGVzIGRhbiBUb3RhbCBFeHBlbnNlcyB0ZXJoYWRhcCBQcm9maXQgUGVuanVhbGFuIERhdGEgQ29mZmVlIENoYWluIHBhZGEgU2V0aWFwIFN0YXRlIGRpIEFtZXJpa2EgdGFodW4gMjAxMi0yMDEzIg0KYXV0aG9yOiAiQW1hbGlhIFJpemt5IEFsIE1haWRhaCB8IE0wNzIzMDA3Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogeWV0aQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgIGhpZ2hsaWdodCA6IGhhZGRvY2sNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCi0tLQ0KDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIGZvbnQtZmFtaWx5OiBUaW1lcyBOZXcgUm9tYW4sIHNhbnMtc2VyaWY7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2RiZGJkYjsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQogIGgxIHsNCiAgICBjb2xvcjogIzA0MjkzQTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCiAgaDIgew0KICAgIGNvbG9yOiAjMDA1ODdBOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgfQ0KICBoMyB7DQogICAgY29sb3I6IGJsYWNrOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0NCiAgLnRpdGxlIHsNCiAgICBjb2xvcjogIzBGMzA1NzsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIH0gIA0KICAuYXV0aG9yLCAuZGF0ZSB7DQogICAgY29sb3I6ICMyNzY2ODg7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBwIHsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBjb2xvcjogI2JsYWNrOw0KICB9DQogIHByZSB7DQogICAgY29sb3I6IGJsYWNrOw0KICAgIG92ZXJmbG93LXg6IGF1dG87IA0KICB9DQo8L3N0eWxlPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCi0tLS0tLS0NCg0KIyAqKkxhdGFyIEJlbGFrYW5nKioNCg0KRGFsYW0gZHVuaWEgYmlzbmlzLCAqQ29mZmVlIENoYWluKiBtZXJ1anVrIGtlcGFkYSBqYXJpbmdhbiBiaXNuaXMgeWFuZyB0ZXJkaXJpIGRhcmkgYmViZXJhcGEga2VkYWkga29waSAoKmNvZmZlZSBzaG9wcyopIHlhbmcgZGltaWxpa2kgYXRhdSBkaW9wZXJhc2lrYW4gb2xlaCBzYXR1IHBlcnVzYWhhYW4geWFuZyBzYW1hLiBEYXRhc2V0IHlhbmcgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGluaSBhZGFsYWggKipDb2ZmZWUgQ2hhaW4gRGF0YXNldHMqKiB5YW5nIG1lcnVwYWthbiBrdW1wdWxhbiBkYXRhIHBlbmp1YWxhbiBkYW4ga2V1YW5nYW4gZGFyaSBiaXNuaXMgcHJvZHVrIGtvcGkgZGFuIHRlaCBkaSBwYXNhciBBbWVyaWthIFNlcmlrYXQgcGFkYSB0YWh1biAyMDEyLTIwMTMuIERhdGFzZXQgaW5pIG1lbmNha3VwIGJlcmJhZ2FpIHZhcmlhYmVsIHlhbmcgbWVuZ2dhbWJhcmthbiBrYXJha3RlcmlzdGlrIHBhc2FyLCBzZXBlcnRpIGtvZGUgYXJlYSwgbGV0YWsgcGFzYXIgKCpjZW50cmFsKiwgKmVhc3QqLCAqc291dGgqLCAqd2VzdCopLCAqc3RhdGUqICgyMCAqc3RhdGUqIGRpIEFtZXJpa2EgU2VyaWthdCksIHVrdXJhbiBwYXNhciAoKm1ham9yIG1hcmtldCogZGFuICpzbWFsbCBtYXJrZXQqKSwgdGlwZSBwYXNhciAoKnJlZ3VsYXIqIGRhbiAqZGVjYWYqKSwgamVuaXMgcHJvZHVrICgqY29mZmVlKiwgKnRlYSosICplc3ByZXNzbyosICpoZXJiYWwgdGVhKiksIGFzYWwgcHJvZHVrICgqYmVhbnMqIGRhbiAqbGVhdmVzKiksIG5hbWEgcHJvZHVrICgqYW1hcmV0dG8qLCAqY29sb21iaWFuKiwgKmRlY2FmIGlyaXNoIGNyZWFtKiwgKmdyZWVuIHRlYSosIGRzYiksIHRhbmdnYWwsIHNlcnRhIG1ldHJpayBrZXVhbmdhbiBiZXJ1cGEgKmJ1ZGdldCBDT0dTKiwgKmJ1ZGdldCBtYXJnYWluKiwgKmJ1ZGdldCBzYWxlcyosICpidWRnZXQgcHJvZml0KiwgKkNPR1MqLCAqaW52ZW50b3J5KiwgKm1hcmdpbiosICptYXJrZXRpbmcqLCAqcHJvZml0KiwgKnNhbGVzKiwgZGFuICp0b3RhbCBleHBlbnNlcyouIERhdGFzZXQgaW5pIG1lbXVuZ2tpbmthbiBhbmFsaXNpcyBwZXJiYW5kaW5nYW4gYW50YXJhIHBlcmVuY2FuYWFuIGRhbiByZWFsaXNhc2kuDQoNCkRhbGFtIGJpc25pcyAqY29mZmVlIGNoYWluKiwgbWVtYWhhbWkgZmFrdG9yLWZha3RvciBwZW5lbnR1ICpQcm9maXQqIChsYWJhKSB5YW5nIGRpaGFzaWxrYW4gbWVydXBha2FuIGhhbCB5YW5nIHBlbnRpbmcgZGFsYW0gcGVuZ2FtYmlsYW4ga2VwdXR1c2FuIHlhbmcgc3RyYXRlZ2lzLiBBZGEgYmFueWFrIGZha3RvciB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIG5pbGFpICpQcm9maXQqIChsYWJhKSwgZHVhIGRpYW50YXJhbnlhIGFkYWxhaCAqU2FsZXMqIChwZW5qdWFsYW4pIGRhbiAqVG90YWwgRXhwZW5zZXMqICh0b3RhbCBwZW5nZWx1YXJhbikuICpTYWxlcyogbWVydXBha2FuIHZhcmlhbmVsIHlhbmcgbWVuY2VybWlua2FuIGtlbWFtcHVhbiBiaXNuaXMgZGFsYW0gbWVuZ2hhc2lsa2FuIHBlbmRhcGF0YW4sIHNlbWVudGFyYSAqVG90YWwgRXhwZW5zZXMqIG1ld2FraWxpIHNlbHVydWggYmlheWEgb3BlcmFzaW9uYWwgeWFuZyBkaWtlbHVhcmthbiB1bnR1ayBtZW1wZXJ0YWhhbmthbiBiaXNuaXMuIERhbGFtIGFuYWxpc2lzIGluaSwgYWthbiBkaXVrdXIgcGVuZ2FydWggKlNhbGVzKiBkYW4gKlRvdGFsIEV4cGVuc2VzKiB0ZXJoYWRhcCAqUHJvZml0KiB5YW5nIGRpaGFzaWxrYW4gdGlhcCAqU3RhdGUqIGRpIEFtZXJpa2EuIERlbmdhbiBkZW1pa2lhbiwgaGFzaWwgYW5hbGlzaXMgaW5pIGRhcGF0IG1lbWJlcmlrYW4gaW5mb3JtYXNpIHBlbnRpbmcgYmFnaSBtYW5hamVtZW4gZGFsYW0gbWVuZ29wdGltYWxrYW4gc3RyYXRlZ2kgYmlzbmlzLCBzZXBlcnRpIG1lbmluZ2thdGthbiBlZmlzaWVuc2kgb3BlcmFzaW9uYWwgYXRhdSBmb2t1cyBwYWRhIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbi4NCg0KLS0tLS0tLQ0KDQojICoqTWV0b2RlIEFuYWxpc2lzKioNCg0KTWV0b2RlIHlhbmcgZGFwYXQgZGlndW5ha2FuIHVudHVrIGFuYWxpc2lzIGluaSBhZGFsYWggcmVncmVzaSBsaW5lYXIgYmVyZ2FuZGEuIEFuYWxpc2lzIHJlZ3Jlc2kgYmVyZ2FuZGEgbWVydXBha2FuIG1ldG9kZSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVtYWhhbWkgaHVidW5nYW4gYW50YXJhIHNhdHUgdmFyaWFiZWwgZGVwZW5kZW4gZGFuIGR1YSBhdGF1IGxlYmloIHZhcmlhYmVsIGluZGVwZW5kZW4uIFR1anVhbiB1dGFtYSBkYXJpIG1ldG9kZSBpbmkgYWRhbGFoIHVudHVrIG1lbmVudHVrYW4gc2VqYXVoIG1hbmEgdmFyaWFiZWwtdmFyaWFiZWwgaW5kZXBlbmRlbiB0ZXJzZWJ1dCBiZXJwZW5nYXJ1aCB0ZXJoYWRhcCB2YXJpYXNpIHZhcmlhYmVsIGRlcGVuZGVubnlhLiBCZW50dWsgdW11bSBtb2RlbCByZWdyZXNpIGJlcmdhbmRhIGRlbmdhbiBrIHZhcmlhYmVsIGluZGVwZW5kZW4gYWRhbGFoOg0KDQokJCBZID0gXGJldGFfMCArIFxiZXRhXzFYXzEgKyBcYmV0YV8yWF8yICsgLi4uICsgXGJldGFfcFhfcCArIFxlcHNpbG9uJCQNCmRpbWFuYSAkWSQgYWRhbGFoIHZhcmlhYmVsIGRlcGVuZGVuLCAkWF8xLFhfMiwuLi4sWF9uJCBhZGFsYWggdmFyaWFiZWwgaW5kZXBlbmRlbiwgJFxiZXRhXzAsXGJldGFfMSwuLi4sXGJldGFfbiQgYWRhbGFoIHBhcmFtZXRlciByZWdyZXNpLCBkYW4gJFxlcHNpbG9uJCBhZGFsYWggc2VzYXRhbi4NCg0KLS0tLS0tLQ0KDQojICoqRGF0YSoqDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gZGFsYW0gYW5hbGlzaXMgaW5pIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4gKlN0YXRlKiBkaSBBbWVyaWthIFNlcmlrYXQsIGRlbmdhbiB2YXJpYWJlbCBpbmRlcGVuZGVuIHlhbmcgZGlndW5ha2FuIGFkYWxhaCAqU2FsZXMqICQoWF8xKSQgZGFuICpUb3RhbCBFeHBlbnNlcyogJChYXzIpJCwgc2VkYW5na2FuIHZhcmlhYmVsIGRlcGVuZGVuIG55YSBhZGFsYWggKlByb2ZpdCogJChZKSQuDQogDQpgYGB7ciBMaWJyYXJ5IHlhbmcgRGlidXR1aGthbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IHBhY2thZ2UgeWFuZyBkaWJ1dHVoa2FuDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQpgYGB7ciBJbXBvcnQgRGF0YX0NCiMgTWVuZ2ltcG9ydCBkYXRhc2V0cyBkYXJpIGZpbGUgZXhjZWwNCkNvZmZlZV9DaGFpbl9EYXRhc2V0cyA8LSByZWFkX2V4Y2VsKCJ+L0AgU0lNIDIwMjUvREFUQSBDTSAxLzMuIENNMSAtIENvZmZlZSBDaGFpbiBEYXRhc2V0cy8zLiBDTTEgLSBDb2ZmZWUgQ2hhaW4gRGF0YXNldHMueGxzeCIpDQpgYGANCg0KYGBge3IgRmlsdGVyIERhdGF9DQojIE1lbWJ1YXQgZmlsdGVyIGRhdGEgc2VzdWFpIHZhcmlhYmVsIHlhbmcgZGlidXR1aGthbg0KRGF0YV9GaWx0ZXIgPC0gQ29mZmVlX0NoYWluX0RhdGFzZXRzICU+JQ0KICBncm91cF9ieShTdGF0ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBZID0gc3VtKFByb2ZpdCwgbmEucm0gPSBUUlVFKSwNCiAgICBYMSA9IHN1bShTYWxlcywgbmEucm0gPSBUUlVFKSwNCiAgICBYMiA9IHN1bShgVG90YWwgRXhwZW5zZXNgLCBuYS5ybSA9IFRSVUUpDQogICkNCnByaW50KERhdGFfRmlsdGVyKQ0KYGBgDQoNCi0tLS0tLS0NCg0KIyAqKkFuYWxpc2lzKioNCiMjIFN0YXRpc3Rpa2EgRGVza3JpcHRpZg0KDQpTdGF0aXN0aWthIGRlc2tyaXB0aWYgbWVydXBha2FuIG1ldG9kZSBhbmFsaXNpcyB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZXJhbmdrdW0sIG1lbnlhamlrYW4gZGF0YSwgc2VydGEgbWVtYmVyaWthbiBnYW1iYXJhbiB5YW5nIGplbGFzIHRlbnRhbmcga2FyYWt0ZXJpc3Rpa255YS4gQmViZXJhcGEgdWt1cmFuIHN0YXRpc3RpayB5YW5nIHVtdW0gZGlndW5ha2FuIGFkYWxhaCBuaWxhaSBtaW5pbXVuICQoTWluKSQsIG5pbGFpIG1ha3NpbXVtICQoTWF4KSQsIGt1YXJ0aWwgcGVydGFtYSAkKFFfMSkkLCBrdWFydGlsIGtlZHVhIGF0YXUgbWVkaWFuICQoUV8yKSQsIGt1YXJ0aWwga2V0aWdhICQoUV8zKSQsIHNlcnRhIG5pbGFpIHJhdGEtcmF0YSAkKE1lYW4pJC4NCg0KYGBge3IgU3RhdGlzdGlrIERlc2tyaXB0aWZ9DQojIFN0YXRpc3RpayBkZXNrcmlwdGlmIGRhcmkgc2VtdWEgdmFyaWFiZWwgeWFuZyBkaWd1bmFrYW4NCnN1bW1hcnkoRGF0YV9GaWx0ZXIpDQpgYGANCg0KKipJbnRlcnByZXRhc2kqKjoNCkRhcmkgb3V0cHV0IGRpcGVyb2xlaCBpbmZvcm1hc2kgYmFod2EgdmFyaWFiZWwgKlN0YXRlKiBiZXJzaWZhdCBrYXRlZ29yaWthbCBkZW5nYW4ganVtbGFoIDIwIG9ic2VydmFzaS4gU2VjYXJhIHVtdW0sIGtldGlnYSB2YXJpYWJlbCBudW1lcmlrIHlhaXR1ICRZJCwgJFhfMSQsIGRhbiAkWF8yJCBtZW51bmp1a2thbiB2YXJpYXNpIGRhdGEgeWFuZyBiZXNhciBkZW5nYW4gdmFyaWFiZWwgeWFuZyBtZW1pbGlraSByZW50YW5nIHRlcmxlYmFyIGFkYWxhaCAkWF8xJC4gIA0KDQpgYGB7ciBOaWxhaSBUZXJ0aW5nZ2kgVGVyZW5kYWgsIGVjaG89RkFMU0V9DQojIE5pbGFpIE1ha3NpbXVtIGRhbiBNaW5pbXVtIHNldGlhcCBWYXJpYWJlbA0Kc3VtbWFyeV9tYXhtaW4gPC0gZGF0YS5mcmFtZSgNCiAgS2F0ZWdvcmkgPSBjKCJZIE1ha3MiLCAiWSBNaW4iLCAiWDEgTWFrcyIsICJYMSBNaW4iLCAiWDIgTWFrcyIsICJYMiBNaW4iKSwNCiAgU3RhdGUgPSBjKA0KICAgIERhdGFfRmlsdGVyJFN0YXRlW3doaWNoLm1heChEYXRhX0ZpbHRlciRZKV0sDQogICAgRGF0YV9GaWx0ZXIkU3RhdGVbd2hpY2gubWluKERhdGFfRmlsdGVyJFkpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5tYXgoRGF0YV9GaWx0ZXIkWDEpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5taW4oRGF0YV9GaWx0ZXIkWDEpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5tYXgoRGF0YV9GaWx0ZXIkWDIpXSwNCiAgICBEYXRhX0ZpbHRlciRTdGF0ZVt3aGljaC5taW4oRGF0YV9GaWx0ZXIkWDIpXQ0KICApLA0KICBOaWxhaSA9IGMoDQogICAgbWF4KERhdGFfRmlsdGVyJFkpLA0KICAgIG1pbihEYXRhX0ZpbHRlciRZKSwNCiAgICBtYXgoRGF0YV9GaWx0ZXIkWDEpLA0KICAgIG1pbihEYXRhX0ZpbHRlciRYMSksDQogICAgbWF4KERhdGFfRmlsdGVyJFgyKSwNCiAgICBtaW4oRGF0YV9GaWx0ZXIkWDIpDQogICkNCikNCiMgVGFtcGlsa2FuIGhhc2lsDQpwcmludChzdW1tYXJ5X21heG1pbikNCmBgYA0KDQoqKkludGVycHJldGFzaSoqOiBEaWtldGFodWkgdmFyaWFiZWwgJFhfMSQgbWV3YWtpbGkgKlNhbGVzKiwgJFhfMiQgbWV3YWtpbGkgKlRvdGFsIEV4cGVuc2VzKiwgZGFuICRZJCBtZXdha2lsaSAqUHJvZml0Ki4gRGFyaSBvdXRwdXQgJGRhdGEuZnJhbWUkIGRpIGF0YXMsIGRpcGVyb2xlaCBpbmZvcm1hc2kgYmFod2EgKlN0YXRlKiB5YW5nIG1lbWlsaWtpIG5pbGFpICpQcm9maXQqLCAqU2FsZXMqLCBkYW4gKlRvdGFsIEV4cGVuc2VzKiB0ZXJ0aW5nZ2kgYWRhbGFoIENhbGlmb3JuaWEsIGhhbCBpbmkgbWVuYW5kYWkgYWRhbnlhIGtpbmVyamEgYmlzbmlzIHlhbmcga3VhdCBtZXNraSBkZW5nYW4gcGVuZ2VsdWFyYW4gdGluZ2dpLiBEaSBzaXNpIGxhaW4sIE5ldyBNZXhpY28gbWVtaWxpa2kgKlByb2ZpdCogdGVyZW5kYWggbWVza2kgKlNhbGVzKiwgZGFuICpUb3RhbCBFeHBlbnNlcyogbnlhIGJ1a2FuIHlhbmcgcGFsaW5nIHJlbmRhaC4gU2VtZW50YXJhIE5ldyBIYW1wc2hpcmUgYmVyb3BlcmFzaSBkZW5nYW4gKlNhbGVzKiwgZGFuICpUb3RhbCBFeHBlbnNlcyogcGFsaW5nIHJlbmRhaC4NCg0KIyMgU2NhdHRlciBQbG90IHRpYXAgVmFyaWFiZWwNCiMjIyBTY2F0dGVyIFBsb3QgWSB2cyBYMQ0KYGBge3IgU2NhdHRlciBQbG90IDF9DQojIFNjYXR0ZXJwbG90IFkgdnMgWDENCmdncGxvdChEYXRhX0ZpbHRlciwgYWVzKHggPSBYMSwgeSA9IFkpKSArDQogICAgZ2VvbV9wb2ludChjb2xvciA9ICIjMUU1MTI4IikgKyAgICAgICAgICMgbWVuY2lwdGFrYW4gdGl0aWsNCiAgICBnZ3RpdGxlKCJTY2F0dGVycGxvdCBvZiBZIHZzIFgxIikgKw0KICAgIHhsYWIoIlgxIikgKw0KICAgIHlsYWIoIlkiKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKio6IFNjYXR0ZXIgcGxvdCBpbmkgbWVudW5qdWtrYW4gaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsICRZJCAoc3VtYnUgdmVydGlrYWwpIGRhbiAkWF8xJCAoc3VtYnUgaG9yaXpvbnRhbCkuIFBvbGEgeWFuZyBkaWhhc2lsa2FuIG1lbmdpbmRpa2FzaWthbiBhZGFueWEga2VtdW5na2luYW4gaHVidW5nYW4gcG9zaXRpZiBhbnRhcmEgJFkkIGRhbiAkWF8xJCwgZGkgbWFuYSBwZW5pbmdrYXRhbiBuaWxhaSAkWF8xJCBjZW5kZXJ1bmcgZGlpa3V0aSBwZW5pbmdrYXRhbiBuaWxhaSAkWSQsIG1lc2tpcHVuIHRpZGFrIHRlcmxhbHUga3VhdCBrYXJlbmEgc2ViYXJhbiBkYXRhIHlhbmcgY3VrdXAgbGViYXIuDQoNCiMjIyBTY2F0dGVyIFBsb3QgWSB2cyBYMg0KYGBge3IgU2NhdHRlciBQbG90IDJ9DQojIFNjYXR0ZXJwbG90IFkgdnMgWDINCmdncGxvdChEYXRhX0ZpbHRlciwgYWVzKHggPSBYMiwgeSA9IFkpKSArDQogICAgZ2VvbV9wb2ludChjb2xvciA9ICIjMUU1MTI4IikgKyAgICAgICAgICMgbWVuY2lwdGFrYW4gdGl0aWsNCiAgICBnZ3RpdGxlKCJTY2F0dGVycGxvdCBvZiBZIHZzIFgyIikgKw0KICAgIHhsYWIoIlgyIikgKw0KICAgIHlsYWIoIlkiKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpKio6IFNjYXR0ZXIgcGxvdCBpbmkgbWVudW5qdWtrYW4gaHVidW5nYW4gYW50YXJhIHZhcmlhYmVsICRZJCAoc3VtYnUgdmVydGlrYWwpIGRhbiAkWF8yJCAoc3VtYnUgaG9yaXpvbnRhbCkuIFBvbGEgeWFuZyBkaWhhc2lsa2FuIG1lbnVuanVra2FuIGtlbXVuZ2tpbmFuIGh1YnVuZ2FuIG5lZ2F0aWYgYW50YXJhICRYXzIkIGRhbiAkWSQsIGRpIG1hbmEgcGVuaW5na2F0YW4gbmlsYWkgJFhfMiQganVzdHJ1IGRpaWt1dGkgb2xlaCBwZW51cnVuYW4gbmlsYWkgJFkkLg0KDQojIyBVamkgQXN1bXNpIEtsYXNpaw0KDQpgYGB7ciBNZW1idWF0IG1vZGVsIHJlZ3Jlc2kgbGluaWVyfQ0KIyBNZW1idWF0IHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmllciBiZXJnYW5kYQ0KbW9kZWwgPC0gbG0oWSB+IFgxK1gyLCBkYXRhPURhdGFfRmlsdGVyKQ0KbW9kZWwNCmBgYA0KDQojIyMgVWppIE5vbi1NdWx0aWtvbGluZWFyaXRhcw0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFRpZGFrIHRlcmphZGkgZ2VqYWxhIG11bHRpa29saW5lYXJpdGFzDQogICAgDQogICAgJEhfMSQgOiBUZXJqYWRpIGdlamFsYSBtdWx0aWtvbGluZWFyaXRhcw0KICAgIA0KMi4gVGluZ2thdCBTaWduaWZpa2Fuc2kgKCRcYWxwaGEkKSA9ICQ1JCUgPSAkMC4wNSQNCg0KMy4gRGFlcmFoIEtyaXRpcyANCg0KICAgICRIXzAkIGRpdG9sYWsgamlrYSAkVklGID4gMTAkDQogIA0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgTm9uLU11bHRpa29saW5lYXJpdGFzLCB3YXJuaW5nPUZBTFNFfQ0KIyBQbG90IFZJRg0KbmlsYWlfdmlmIDwtIHZpZihtb2RlbCkNCnBsb3QobmlsYWlfdmlmLCB0eXBlID0gImJhciIsIG1haW4gPSAiVklGIFBsb3QiKQ0KDQojIFVqaSBOb24tTXVsdGlrb2xpbmVhcml0YXMNCnZpZihtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkVklGJCBrZWR1YSB2YXJpYWJlbCAkPCAxMCQsIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIG1vZGVsIHRpZGFrIG1lbmdhbGFtaSBnZWphbGEgbXVsdGlrb2xpbmVhcml0YXMuDQoNCiMjIyBVamkgTm9ybWFsaXRhcyBSZXNpZHUNCg0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFJlc2lkdSBkYXRhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsDQogICAgDQogICAgJEhfMSQgOiBSZXNpZHUgZGF0YSB0aWRhayBiZXJkaXN0cmlidXNpIG5vcm1hbA0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgTm9ybWFsaXRhcyBSZXNpZHVhbH0NCiMgUS1RIFBsb3QNCnFxbm9ybShyZXNpZChtb2RlbCkpDQpxcWxpbmUocmVzaWQobW9kZWwpKQ0KDQojIFVqaSBOb3JtYWxpdGFzIFJlc2lkdQ0Kc2hhcGlyby50ZXN0KHJlc2lkKG1vZGVsKSkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGppa2EgZGlsaWhhdCBwbG90IG5vcm1hbCBRLVEgbnlhLCBkYXBhdCB0ZXJsaWhhdCBiYWh3YSB0aXRpay10aXRpayBtZW55ZWJhciBkaSBzZWtpdGFyIGdyYWZpayBub3JtYWwgbWVuZ2lrdXRpIGdhcmlzIGRpYWdvbmFsIGRhbiBuaWxhaSAkcC12YWx1ZSA9IDAuOTc3NCA+IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIHJlc2lkdSBkYXRhIGJlcmRpc3RyaWJ1c2kgbm9ybWFsLg0KDQojIyMgVWppIE5vbi1BdXRva29yZWxhc2kNCg0KMS4gSGlwb3Rlc2lzDQoNCiAgICAkSF8wJCA6IFRpZGFrIGFkYSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KICAgICRIXzEkIDogVGVyamFkaSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KMi4gVGluZ2thdCBTaWduaWZpa2Fuc2kgJChcYWxwaGEpJCA9ICQ1JCUgPSAkMC4wNSQNCg0KMy4gRGFlcmFoIEtyaXRpcyANCg0KICAgICRIXzAkIGRpdG9sYWsgamlrYSAkcC12YWx1ZSA8IFxhbHBoYSA9IDAuMDUkDQoNCjQuIFN0YXRpc3RpayBVamkNCg0KYGBge3IgVWppIE5vbi1BdXRva29yZWxhc2l9DQojIFVqaSBBdXRva29yZWxhc2kNCmR3dGVzdChtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkcC12YWx1ZSA9IDAuMTA0NiA+IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZ2FnYWwgZGl0b2xhaywgeWFuZyBhcnRpbnlhIHRpZGFrIGFkYSBhdXRva29yZWxhc2kgYW50YXIgcmVzaWR1IGRhdGENCg0KIyMjIFVqaSBIb21vc2tlZGFzdGlzaXRhcw0KDQoxLiBIaXBvdGVzaXMNCg0KICAgICRIXzAkIDogVGVyZGFwYXQgaG9tb3NrZWRhc3Rpc2l0YXMgZGFsYW0gcmVzaWR1IGRhdGEgDQoNCiAgICAkSF8xJCA6IFRpZGFrIHRlcmRhcGF0IGhvbW9za2VkYXN0aXNpdGFzICBkYWxhbSByZXNpZHUgZGF0YQ0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgSG9tb3NrZWRhc3Rpc2l0YXN9DQojIFBsb3QNCnBsb3QobW9kZWwsIHdoaWNoID0gMSkNCiMgVWppIEhvbW9za2VkYXN0aXNpdGFzDQpicHRlc3QobW9kZWwpDQpgYGANCg0KNS4gS2VzaW1wdWxhbiANCg0KICAgIEthcmVuYSBkYXJpIHBlcmhpdHVuZ2FuLCBkaXBlcm9sZWggbmlsYWkgJHAtdmFsdWUgPSAwLjMzODcgPiBcYWxwaGEgPSAwLjA1JCBtYWthICRIXzAkIGdhZ2FsIGRpdG9sYWssIHlhbmcgYXJ0aW55YSB0ZXJkYXBhdCBob21vc2tlZGFzdGlzaXRhcyBkYWxhbSByZXNpZHUgZGF0YS4gDQoNCiMjIEFuYWxpc2lzIFJlZ3Jlc2kgTGluZWFyIEJlcmdhbmRhDQoNCmBgYHtyIE1lbWJ1YXQgcGVyc2FtYWFuIG1vZGVsIHJlZ3Jlc2kgbGluaWVyIGJlcmdhbmRhfQ0KIyBNZW1idWF0IHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmllciBiZXJnYW5kYQ0KbW9kZWwgPC0gbG0oWSB+IFgxK1gyLCBkYXRhPURhdGFfRmlsdGVyKQ0KbW9kZWwNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgcmVncmVzaSBkaSBhdGFzLCBkaXBlcm9sZWggcGVyc2FtYWFuIHJlZ3Jlc2kgdW50dWsgbW9kZWwgaW5pIDoNCiQkIFkgPSA1Njk2LjkzMzgwICsgMC43NTM0M1hfMSAtIDIuMDU1NDBYXzIkJA0KKipJbnRlcnByZXRhc2kgbW9kZWwqKjoNCg0KMS4gSmlrYSB2YXJpYWJlbCAqU2FsZXMqICQoWF8xKSQgZGFuICpUb3RhbCBFeHBlbnNlcyogJChYXzIpJCBkaWFzdW1zaWthbiBiZXJuaWxhaSBub2wsIG1ha2EgbmlsYWkgKlByb2ZpdCogJChZKSQgYWthbiBiZXJuaWxhaSA1Njk2LDkzMzgwLg0KMi4gU2V0aWFwIGtlbmFpa2FuIHNhdHUgbmlsYWkgKlNhbGVzKiAkKFhfMSkkLCBha2FuIG1lbmFpa2thbiBuaWxhaSAqUHJvZml0KiAkKFkpJCBzZWJlc2FyIDAsNzUzNDMuDQozLiBTZXRpYXAga2VuYWlrYW4gc2F0dSBuaWxhaSAqVG90YWwgRXhwZW5zZXMqICQoWF8yKSQgYWthbiBtZW51cnVua2FuIG5pbGFpICpQcm9maXQqICQoWSkkIHNlYmVzYXIgMiwwNTU0MC4NCg0KU2VsYWluIGl0dSwgZGFyaSBoYXNpbCAkc3VtbWFyeShtb2RlbCkkIGp1Z2EgZGlwZXJvbGVoIGJhaHdhIG5pbGFpIEtvZWZpc2llbiBEZXRlcm1pbmFzaSAoKkFkanVzdGVkIFItU3F1YXJlZCopIGJlcm5pbGFpIDk2LDQzJS4gSGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSB2YXJpYWJlbCBpbmRlcGVuZGVuICQoWCkkIGRhbGFtIG1vZGVsIHJlZ3Jlc2kgaW5pIG1hbXB1IG1lbmplbGFza2FuIHZhcmlhbnNpIGRhcmkgdmFyaWFiZWwgZGVwZW5kZW4gJChZKSQgc2ViZXNhciA5Niw0MyUsIHNlZGFuZ2thbiBzaXNhbnlhIHlhaXR1IDMsNTclIGRpamVsYXNrYW4gb2xlaCB2YXJpYWJlbCBsYWluIHlhbmcgdGlkYWsgZGlndW5ha2FuIGRhbGFtIG1vZGVsLiANCg0KIyMgVWppIEhpcG90ZXNpcyANCiMjIyBVamkgU2ltdWx0YW4gKEYpDQoxLiBIaXBvdGVzaXMNCg0KICAgICRIXzAkIDogVmFyaWFiZWwgaW5kZXBlbmRlbiBzZWNhcmEgc2ltdWx0YW4gdGlkYWsgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCB2YXJpYWJlbCBkZXBlbmRlbg0KDQogICAgJEhfMSQgOiBWYXJpYWJlbCBpbmRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIHZhcmlhYmVsIGRlcGVuZGVubnlhDQoNCjIuIFRpbmdrYXQgU2lnbmlmaWthbnNpICgkXGFscGhhJCkgPSAkNSQlID0gJDAuMDUkDQoNCjMuIERhZXJhaCBLcml0aXMgDQoNCiAgICAkSF8wJCBkaXRvbGFrIGppa2EgJHAtdmFsdWUgPCBcYWxwaGEgPSAwLjA1JA0KDQo0LiBTdGF0aXN0aWsgVWppDQoNCmBgYHtyIFVqaSBGfQ0KIyBVamkgRg0Kc3VtbWFyeShtb2RlbCkNCmBgYA0KDQo1LiBLZXNpbXB1bGFuIA0KDQogICAgS2FyZW5hIGRhcmkgcGVyaGl0dW5nYW4sIGRpcGVyb2xlaCBuaWxhaSAkcC12YWx1ZSA9IDEuOTI4KjEwXnstMTN9IDwgXGFscGhhID0gMC4wNSQgbWFrYSAkSF8wJCBkaXRvbGFrLCB5YW5nIGFydGlueWEgc2VtdWEgdmFyaWFiZWwgaW5kZXBlbmRlbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIHZhcmlhYmVsIGRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbi4NCg0KIyMjIFVqaSBQYXJzaWFsIChUKQ0KMS4gSGlwb3Rlc2lzDQoNCiAgICAtIFVudHVrICRYXzEkID0gKlNhbGVzKiANCg0KICAgICAgJEhfMCQgOiAqU2FsZXMqIHRpZGFrIGJlcnBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCoNCg0KICAgICAgJEhfMSQgOiAqU2FsZXMqIGJlcnBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCoNCg0KICAgIC0gVW50dWsgJFhfMiQgPSAqVG90YWwgRXhwZW5zZXMqIA0KDQogICAgICAkSF8wJCA6ICpUb3RhbCBFeHBlbnNlcyogdGlkYWsgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCAqUHJvZml0Kg0KDQogICAgICAkSF8xJCA6ICpUb3RhbCBFeHBlbnNlcyogYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCAqUHJvZml0Kg0KDQoyLiBUaW5na2F0IFNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpID0gJDUkJSA9ICQwLjA1JA0KDQozLiBEYWVyYWggS3JpdGlzIA0KDQogICAgJEhfMCQgZGl0b2xhayBqaWthICRwLXZhbHVlIDwgXGFscGhhID0gMC4wNSQNCg0KNC4gU3RhdGlzdGlrIFVqaQ0KDQpgYGB7ciBVamkgVH0NCiMgVWppIFQNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KNS4gS2VzaW1wdWxhbiANCg0KICAtIFVudHVrICRYXzEkID0gKlNhbGVzKiANCg0KICAgIEthcmVuYSBkYXJpICBwZXJoaXR1bmdhbiwgZGlwZXJvbGVoIG5pbGFpICRwLXZhbHVlID0gMy4wMyoxMF57LTEyfSA8IFxhbHBoYSA9IDAuMDUkIG1ha2EgJEhfMCQgZGl0b2xhaywgeWFuZyBhcnRpbnlhICpTYWxlcyogbWVtaWxpa2kgcGVuZ2FydWggeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwICpQcm9maXQqIHNlY2FyYSBwYXJzaWFsLiANCg0KICAtIFVudHVrICRYXzIkID0gKlRvdGFsIEV4cGVuc2VzKiANCg0KICAgIEthcmVuYSBkYXJpICBwZXJoaXR1bmdhbiwgZGlwZXJvbGVoIG5pbGFpICRwLXZhbHVlID0gMS43NCoxMF57LTh9IDwgXGFscGhhID0gMC4wNSQgbWFrYSAkSF8wJCBkaXRvbGFrLCB5YW5nIGFydGlueWEgKlRvdGFsIEV4cGVuc2VzKiBtZW1pbGlraSBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgKlByb2ZpdCogc2VjYXJhIHBhcnNpYWwuDQoNCi0tLS0tLS0NCg0KIyAqKktlc2ltcHVsYW4gSGFzaWwgQW5hbGlzaXMqKg0KDQpCZXJkYXNhcmthbiBhbmFsaXNpcyB5YW5nIHN1ZGFoIGRpbGFrdWthbiBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSB2YXJpYWJlbCBpbmRlcGVuZGVuICRYXzEkIHlhaXR1ICpTYWxlcyogZGFuICRYXzIkIHlhaXR1ICpUb3RhbCBFeHBlbnNlcyogYmVycGVuZ2FydWggc2VjYXJhIHNpZ25maWthbiB0ZXJoYWRhcCB2YXJpYWJlbCBkZXBlbmRlbiBZIHlhaXR1ICpQcm9maXQqIHNlY2FyYSBiZXJzYW1hLXNhbWEgYXRhdSBzaW11bHRhbiBkYW4gc2VjYXJhIHBhcnNpYWwgZGVuZ2FuIHBlcnNhbWFhbiBtb2RlbCByZWdyZXNpIGxpbmVhciBiZXJnYW5kYW55YSBhZGFsYWggJFkgPSA1Njk2LjkzMzgwICsgMC43NTM0M1hfMSAtIDIuMDU1NDBYXzIkLiBNb2RlbCByZWdyZXNpIGluaSBtZW1pbGlraSBuaWxhaSBrb2VmaXNpZW4gZGV0ZXJtaW5hc2kgc2ViZXNhciA5Niw0MyUgeWFuZyBiZXJhcnRpIHZhcmlhYmVsIGluZGVwZW5kZW4gJChYKSQgZGFsYW0gbW9kZWwgcmVncmVzaSBpbmkgbWFtcHUgbWVuamVsYXNrYW4gdmFyaWFuc2kgZGFyaSB2YXJpYWJlbCBkZXBlbmRlbiBzZWJlc2FyIDk2LDQzJSwgc2VkYW5na2FuIHNpc2FueWEgeWFpdHUgc2ViZXNhciAzLDU3JSBkaWplbGFza2FuIG9sZWggdmFyaWFiZWwgbGFpbiB5YW5nIHRpZGFrIGRpZ3VuYWthbiBkYWxhbSBtb2RlbC4gU2VsYWluIGl0dSwgYmVyZGFzYXJrYW4gdWppIGFzdW1zaSBrbGFzaWssIHNlbXVhIHVqaSBhc3Vtc2kgeWFrbmksIHVqaSBub24tbXVsdGlrb2xpbmVhcml0YXMsIHVqaSBub3JtYWxpdGFzIHJlc2lkdSwgdWppIG5vbi1hdXRva29yZWxhc2ksIGRhbiB1amkgaG9tb3NrZWRhc3Rpc2l0YXMgdGVycGVudWhpIHNlaGluZ2dhIG1vZGVsIHJlZ3Jlc2kgaW5pIGxheWFrIHVudHVrIGRpZ3VuYWthbi4NCg0KQW5hbGlzaXMgaW5pIG1lbnVuanVra2FuIGJhaHdhICpQcm9maXQqIChsYWJhKSBwZXJ1c2FoYWFuICpjb2ZmZWUgY2hhaW4qIHNhbmdhdCBkaXBlbmdhcnVoaSBvbGVoIHBlbmp1YWxhbiAoKlNhbGVzKikgZGFuIHBlbmdlbHVhcmFuICgqVG90YWwgRXhwZW5zZXMqKSwgZGkgbWFuYSBrb250cm9sIGJpYXlhIG1lbWVnYW5nIHBlcmFuIGxlYmloIGtyaXRpcyBkaWJhbmRpbmdrYW4gcGVuaW5na2F0YW4gcGVuanVhbGFuLiBNb2RlbCByZWdyZXNpIHlhbmcgZGloYXNpbGthbiBtZW1pbGlraSBuaWxhaSBrb2VmaXNpZW4gZGV0ZXJtaW5hc2kgeWFuZyBjdWt1cCB0aW5nZ2ksIHNlaGluZ2dhIHBlcnVzYWhhYW4gZGFwYXQgbWVuZ2d1bmFrYW5ueWEgdW50dWsgbWVuZ2FtYmlsIGtlcHV0dXNhbiBzdHJhdGVnaXMgc2VwZXJ0aSBvcHRpbWFsaXNhc2kgYmlheWEsIGFsb2thc2kgc3VtYmVyIGRheWEsIGRhbiBldmFsdWFzaSBraW5lcmphIHBlciAqU3RhdGUqIGRpIEFtZXJpa2EgU2VyaWthdC4gS3VuY2kgdXRhbWFueWEgYWRhbGFoIG1lbnllaW1iYW5na2FuIHBlcnR1bWJ1aGFuIHBlbmp1YWxhbiBkZW5nYW4gZWZpc2llbnNpIGJpYXlhLCBzYW1iaWwgbWVtcGVydGltYmFuZ2thbiBmYWt0b3IgZWtzdGVybmFsIGxhaW4geWFuZyBtdW5na2luIGJlcmRhbXBhayBrZWNpbCBuYW11biBzaWduaWZpa2FuLiBEZW5nYW4gcGVuZGVrYXRhbiBpbmksIHBlcnVzYWhhYW4gZGFwYXQgbWVuaW5na2F0a2FuIHByb2ZpdCBzZWNhcmEgbGViaWggZWZla3RpZiBkYW4gdGVydWt1ci4NCg0KLS0tLS0tLQ0KDQojICoqRGFmdGFyIFB1c3Rha2EqKg0KDQpQdXJiYSwgUi4gTC4gKDIwMjIsIE1laSAyMikuIFBlbmVyYXBhbiByZWdyZXNpIGJlcmdhbmRhIGRlbmdhbiBSIFN0dWRpby4gUlB1YnMuDQoNClNob2xpaGFoLCBTLk0uLCBBZGl0aXlhLCBOLlkuLCBFdmFuaSwgRS5TLiwgJiBNYWdoZmlyb2gsIFMuICgyMDIzKS4gS29uc2VwIHVqaSBhc3Vtc2kga2xhc2lrIHBhZGEgcmVncmVzaSBsaW5pZXIgYmVyZ2FuZGEuIEp1cm5hbCBSaXNldCBBa3VudGFuc2kgU29lZGlybWFuIChKUkFTKSwgMigyKSwgWzEwMi0xMTBdLg==