knitr::opts_chunk$set(echo = TRUE)

1 Pendahuluan

Proses penyusunan Publikasi Statistik Kesejahteraan Rakyat baik di tingkat nasional maupun provinsi, menuntut ketepatan akurasi data yang sangat tinggi. Kesalahan sekecil apa pun pada level desimal dapat menyesatkan interpretasi indikator makro yang digunakan sebagai dasar pengambilan kebijakan publik. Dalam praktiknya, proses kompilasi sering kali melibatkan beberapa tim pengolah yang bekerja secara paralel, sehingga tahapan pemeriksaan mutlak diperlukan sebelum data dipublikasikan secara resmi.

Secara historis, pemeriksaan dan pembandingan antar-file hasil pengolahan dilakukan secara manual oleh tim (misalnya melalui metode eye-balling atau menyandingkan dua spreadsheet Excel berdampingan). Namun, pendekatan manual ini memiliki keterbatasan serius dan tidak lagi efisien untuk tata kelola data modern. Beralih dari pendekatan manual ke metode pemeriksaan berbasis otomatisasi menggunakan R memberikan lompatan efisiensi dan kualitas penjaminan mutu data (data quality assurance) yang signifikan.

2 Konfigurasi

Bagian konfigurasi merupakan tahap awal penyiapan kerja.

Pada bagian ini, program mendefinisikan lokasi direktori kerja (base_dir), file input dari Pengolah A (file_1), file pembanding dari Pengolah B (file_2), serta file output berbentuk spreadsheet (file_out).

base_dir <- "D:/2. Pengembangan diri/1 Exercise Bagus/Otomatisasi Pemeriksaan Tabel"
file_1   <- file.path(base_dir, "Nas_Pengolah A.xlsx")
file_2   <- file.path(base_dir, "Nas_Pengolah B.xlsx")
file_out <- file.path(base_dir, "Nas_Hasil_Cek_Bab 6.xlsx")

daftar_tabel <- list(
  "6.2"  = "Sheet1",
  "6.3"  = "Sheet1",
  "6.9"  = "Sheet2",  
  "6.14" = "Sheet2",
  "6.8"  = "Sheet7",
  "6.10" = "Sheet8",  
  "6.16" = "Sheet10",
  "6.11" = "Sheet10",
  "6.12" = "Sheet10"
  )

Waktu Mulai Run Data

## WAKTU MULAI RUN DATA: 2026-05-29 16:34:25

3 Fungsi

Dibangun dua fungsi bantu untuk melakukan standarisasi data teks maupun numerik:

  1. clean_text: Fungsi ini digunakan untuk membersihkan spasi berlebih, menghapus karakter whitespace tak terlihat (\r, \n, \t), dan mengubah seluruh huruf menjadi huruf kecil (lowercase). Standardisasi teks ini krusial agar proses pencarian kata kunci judul tabel maupun nama provinsi (misalnya baris “Aceh”) tidak mengalami kegagalan akibat perbedaan penulisan spasial.

  2. clean_num: Fungsi ini bertugas mengonversi sel data mentah ke bentuk angka numerik riil. Fungsi ini mampu mendeteksi serta membersihkan karakter strip (-), titik (.), atau sel kosong (NA/null) menjadi nilai netral 0. Selain itu, fungsi ini melakukan penyeragaman pemisah desimal dari format koma menjadi titik, serta mengunci presisi nilai tepat pada 2 digit desimal.

clean_text <- function(x) {
  sapply(x, function(val) {
    if (is.na(val) || is.null(val)) return("")
    res <- str_replace_all(as.character(val), "[\r\n\t]", " ")
    return(str_to_lower(str_trim(str_replace_all(res, "\\s+", " "))))
  }, USE.NAMES = FALSE)
}

clean_num <- function(x) {
  if (length(x) == 0 || is.null(x) || is.na(x)) return(0)
  if (is.numeric(x)) return(round(x, 2))
  
  val <- str_trim(as.character(x))
  if (val %in% c("-", ".", "", "null", "NA")) return(0) 
  
  val <- str_replace_all(val, ",", ".")
  res <- as.numeric(val)
  return(ifelse(is.na(res), 0, round(res, 2)))
}

4 Preparation Workbook

Untuk mempercepat durasi running, diterapkan metode caching data. File Excel dimuat ke dalam memori R (cached_sheets_a dan cached_sheets_b) hanya untuk lembar kerja (sheet) unik yang terdaftar pada konfigurasi.

Bersamaan dengan itu, file dokumen output baru (wb_utama) dibentuk. Seluruh struktur data asli dari Pengolah A disalin ke dalam dokumen baru ini sebagai template utama. Bab ini juga menyiapkan gaya penataan sel (cell styling) khusus: format desimal standar untuk sel normal (normalNumStyle) serta format penanda warna kuning terang dengan teks merah tebal (diffStyle) untuk menandai sel data yang terbukti memiliki selisih/perbedaan angka.

cat("[1/3] Membaca template dari File A dan data File B...\n")
## [1/3] Membaca template dari File A dan data File B...
wb_utama <- createWorkbook()

diffStyle <- createStyle(fgFill = "#FFFF00", fontColour = "#9C0006", textDecoration = "bold", numFmt = "0.00")
normalNumStyle <- createStyle(numFmt = "0.00")

unique_sheets <- unique(unlist(daftar_tabel))

cached_sheets_a <- list()
cached_sheets_b <- list()

for (sh in unique_sheets) {
  cached_sheets_a[[sh]] <- read_excel(file_1, sheet = sh, col_names = FALSE)
  cached_sheets_b[[sh]] <- read_excel(file_2, sheet = sh, col_names = FALSE)
  
  addWorksheet(wb_utama, sh)
  writeData(wb_utama, sh, cached_sheets_a[[sh]], colNames = FALSE)
}
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## New names:
## • `` -> `...1`
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`

5 Proses Pengecekan

Ini merupakan inti dari proses pemeriksaan, di mana program melakukan iterasi berlapis untuk menyisir setiap tabel yang didaftarkan secara simultan:

  • Deteksi Area Judul dan Wilayah: Program melakukan pencarian dinamis untuk menemukan baris judul spesifik (misal: "Tabel 6.2") di kedua file. Setelah judul ditemukan, rentang baris di bawahnya dipindai untuk mengunci posisi koordinat baris "Aceh" sebagai batas atas dan baris "Indonesia/Total/Nasional" sebagai batas bawah data.

  • Otomatisasi Batas Kolom: Program mengambil sampel baris data Aceh untuk mendeteksi seberapa jauh kolom terkanan yang terisi data angka. Hal ini memastikan bahwa batas kolom pencarian terkunci secara otomatis (2:max_col_tabel), sehingga proses pengecekan tidak akan mengalami error akibat menyisir kolom kosong di sisi kanan tabel.

  • Eksekusi Perbandingan Paralel: R akan membandingkan nilai sel pada Baris i Kolom j di file Pengolah A secara langsung dengan Baris i Kolom j file Pengolah B. Jika ditemukan selisih mutlak di atas ambang toleransi pembulatan desimal (> 0.01), maka sel terkait pada dokumen output akan langsung diwarnai kuning, dan detail inkonsistensinya (Nama Wilayah, Posisi Kolom, Nilai A, Nilai B, serta besaran Delta) akan dicetak sebagai log laporan pemeriksaan.

## [2/3] Memulai pengecekan data dan penyusunan format 2 desimal...
## [!] MEMPROSES TABEL: 6.2 di Sheet1
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.2: Kolom 2 s.d 16
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Aceh                 | Kolom 3     | 30.00      | 5.00       | [Delta: 25.00]
## Aceh                 | Kolom 5     | 5.00       | 30.00      | [Delta: 25.00]
## Jambi                | Kolom 7     | 15.00      | 20.00      | [Delta: 5.00]
## Jambi                | Kolom 8     | 30.00      | 20.00      | [Delta: 10.00]
## Jambi                | Kolom 10    | 5.00       | 10.00      | [Delta: 5.00]
## [DONE] Tabel 6.2 selesai. Ditemukan 5 perbedaan.
## [!] MEMPROSES TABEL: 6.3 di Sheet1
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.3: Kolom 2 s.d 10
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Aceh                 | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Aceh                 | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Sumatera Utara       | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Sumatera Utara       | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Sumatera Barat       | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Sumatera Barat       | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Riau                 | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Riau                 | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Jambi                | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Jambi                | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Sumatera Selatan     | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Sumatera Selatan     | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Bengkulu             | Kolom 5     | 15.00      | 40.00      | [Delta: 25.00]
## Bengkulu             | Kolom 6     | 30.00      | 60.00      | [Delta: 30.00]
## Jawa Barat           | Kolom 2     | 15.00      | 40.00      | [Delta: 25.00]
## Jawa Barat           | Kolom 3     | 30.00      | 60.00      | [Delta: 30.00]
## [DONE] Tabel 6.3 selesai. Ditemukan 16 perbedaan.
## [!] MEMPROSES TABEL: 6.9 di Sheet2
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.9: Kolom 2 s.d 13
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Bengkulu             | Kolom 2     | 99.35      | 90.00      | [Delta: 9.35]
## Bengkulu             | Kolom 3     | 0.65       | 10.00      | [Delta: 9.35]
## Lampung              | Kolom 2     | 99.12      | 98.00      | [Delta: 1.12]
## Lampung              | Kolom 3     | 0.38       | 9.00       | [Delta: 8.62]
## Lampung              | Kolom 4     | 0.49       | 3.00       | [Delta: 2.51]
## Kepulauan Bangka Belitung | Kolom 2     | 99.64      | 55.00      | [Delta: 44.64]
## Kepulauan Bangka Belitung | Kolom 3     | 0.17       | 40.00      | [Delta: 39.83]
## Kepulauan Bangka Belitung | Kolom 4     | 0.19       | 5.00       | [Delta: 4.81]
## [DONE] Tabel 6.9 selesai. Ditemukan 8 perbedaan.
## [!] MEMPROSES TABEL: 6.14 di Sheet2
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.14: Kolom 2 s.d 10
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Aceh                 | Kolom 5     | 99.96      | 40.00      | [Delta: 59.96]
## Aceh                 | Kolom 6     | 0.04       | 60.00      | [Delta: 59.96]
## Sumatera Utara       | Kolom 5     | 99.37      | 40.00      | [Delta: 59.37]
## Sumatera Utara       | Kolom 6     | 0.63       | 60.00      | [Delta: 59.37]
## Sumatera Barat       | Kolom 5     | 98.96      | 40.00      | [Delta: 58.96]
## Sumatera Barat       | Kolom 6     | 1.04       | 60.00      | [Delta: 58.96]
## Riau                 | Kolom 5     | 99.52      | 40.00      | [Delta: 59.52]
## Riau                 | Kolom 6     | 0.48       | 60.00      | [Delta: 59.52]
## Jambi                | Kolom 5     | 99.57      | 40.00      | [Delta: 59.57]
## Jambi                | Kolom 6     | 0.43       | 60.00      | [Delta: 59.57]
## Sumatera Selatan     | Kolom 5     | 99.78      | 40.00      | [Delta: 59.78]
## Sumatera Selatan     | Kolom 6     | 0.22       | 60.00      | [Delta: 59.78]
## Bengkulu             | Kolom 5     | 99.99      | 40.00      | [Delta: 59.99]
## Bengkulu             | Kolom 6     | 0.01       | 60.00      | [Delta: 59.99]
## [DONE] Tabel 6.14 selesai. Ditemukan 14 perbedaan.
## [!] MEMPROSES TABEL: 6.8 di Sheet7
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.8: Kolom 2 s.d 19
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Riau                 | Kolom 2     | 97.59      | 84.23      | [Delta: 13.36]
## Riau                 | Kolom 3     | 1.05       | 6.92       | [Delta: 5.87]
## Riau                 | Kolom 4     | 1.10       | 4.74       | [Delta: 3.64]
## Riau                 | Kolom 5     | 0.00       | 0.13       | [Delta: 0.13]
## Riau                 | Kolom 6     | 0.27       | 3.98       | [Delta: 3.71]
## Jambi                | Kolom 2     | 96.11      | 87.86      | [Delta: 8.25]
## Jambi                | Kolom 3     | 2.17       | 4.70       | [Delta: 2.53]
## Jambi                | Kolom 4     | 0.65       | 3.83       | [Delta: 3.18]
## Jambi                | Kolom 5     | 0.03       | 0.11       | [Delta: 0.08]
## Jambi                | Kolom 6     | 1.04       | 3.50       | [Delta: 2.46]
## Sumatera Selatan     | Kolom 2     | 95.12      | 94.05      | [Delta: 1.07]
## Sumatera Selatan     | Kolom 3     | 2.86       | 1.05       | [Delta: 1.81]
## Sumatera Selatan     | Kolom 4     | 1.30       | 2.40       | [Delta: 1.10]
## Sumatera Selatan     | Kolom 6     | 0.72       | 2.50       | [Delta: 1.78]
## Bengkulu             | Kolom 2     | 97.58      | 92.20      | [Delta: 5.38]
## Bengkulu             | Kolom 3     | 0.97       | 1.77       | [Delta: 0.80]
## Bengkulu             | Kolom 4     | 1.08       | 5.31       | [Delta: 4.23]
## Bengkulu             | Kolom 5     | 0.20       | 0.02       | [Delta: 0.18]
## Bengkulu             | Kolom 6     | 0.17       | 0.69       | [Delta: 0.52]
## Lampung              | Kolom 2     | 95.50      | 92.61      | [Delta: 2.89]
## Lampung              | Kolom 3     | 2.37       | 2.96       | [Delta: 0.59]
## Lampung              | Kolom 4     | 1.91       | 3.99       | [Delta: 2.08]
## Lampung              | Kolom 5     | 0.00       | 0.03       | [Delta: 0.03]
## Lampung              | Kolom 6     | 0.23       | 0.41       | [Delta: 0.18]
## Kepulauan Bangka Belitung | Kolom 2     | 97.32      | 95.38      | [Delta: 1.94]
## Kepulauan Bangka Belitung | Kolom 3     | 1.40       | 2.52       | [Delta: 1.12]
## Kepulauan Bangka Belitung | Kolom 4     | 0.93       | 1.69       | [Delta: 0.76]
## Kepulauan Bangka Belitung | Kolom 6     | 0.35       | 0.39       | [Delta: 0.04]
## Kepulauan Riau       | Kolom 2     | 93.76      | 94.15      | [Delta: 0.39]
## Kepulauan Riau       | Kolom 3     | 5.95       | 2.62       | [Delta: 3.33]
## Kepulauan Riau       | Kolom 4     | 0.24       | 1.50       | [Delta: 1.26]
## Kepulauan Riau       | Kolom 5     | 0.00       | 0.22       | [Delta: 0.22]
## Kepulauan Riau       | Kolom 6     | 0.05       | 1.51       | [Delta: 1.46]
## [DONE] Tabel 6.8 selesai. Ditemukan 33 perbedaan.
## [!] MEMPROSES TABEL: 6.10 di Sheet8
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.10: Kolom 2 s.d 19
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Riau                 | Kolom 2     | 95.36      | 85.47      | [Delta: 9.89]
## Riau                 | Kolom 4     | 1.39       | 2.70       | [Delta: 1.31]
## Riau                 | Kolom 5     | 3.18       | 11.30      | [Delta: 8.12]
## Riau                 | Kolom 6     | 0.07       | 0.53       | [Delta: 0.46]
## Jambi                | Kolom 2     | 88.03      | 75.95      | [Delta: 12.08]
## Jambi                | Kolom 3     | 1.47       | 1.15       | [Delta: 0.32]
## Jambi                | Kolom 4     | 2.98       | 4.15       | [Delta: 1.17]
## Jambi                | Kolom 5     | 6.76       | 18.20      | [Delta: 11.44]
## Jambi                | Kolom 6     | 0.77       | 0.56       | [Delta: 0.21]
## Sumatera Selatan     | Kolom 2     | 91.38      | 85.45      | [Delta: 5.93]
## Sumatera Selatan     | Kolom 3     | 0.82       | 0.39       | [Delta: 0.43]
## Sumatera Selatan     | Kolom 4     | 4.59       | 3.95       | [Delta: 0.64]
## Sumatera Selatan     | Kolom 5     | 3.01       | 9.96       | [Delta: 6.95]
## Sumatera Selatan     | Kolom 6     | 0.21       | 0.25       | [Delta: 0.04]
## Bengkulu             | Kolom 2     | 75.86      | 42.79      | [Delta: 33.07]
## Bengkulu             | Kolom 3     | 1.29       | 0.59       | [Delta: 0.70]
## Bengkulu             | Kolom 4     | 1.21       | 2.49       | [Delta: 1.28]
## Bengkulu             | Kolom 5     | 19.77      | 53.31      | [Delta: 33.54]
## Bengkulu             | Kolom 6     | 1.88       | 0.82       | [Delta: 1.06]
## Lampung              | Kolom 2     | 78.02      | 62.60      | [Delta: 15.42]
## Lampung              | Kolom 3     | 0.11       | 0.14       | [Delta: 0.03]
## Lampung              | Kolom 4     | 3.94       | 2.85       | [Delta: 1.09]
## Lampung              | Kolom 5     | 17.40      | 34.16      | [Delta: 16.76]
## Lampung              | Kolom 6     | 0.54       | 0.25       | [Delta: 0.29]
## Kepulauan Bangka Belitung | Kolom 2     | 98.55      | 97.96      | [Delta: 0.59]
## Kepulauan Bangka Belitung | Kolom 4     | 1.01       | 0.99       | [Delta: 0.02]
## Kepulauan Bangka Belitung | Kolom 5     | 0.40       | 0.97       | [Delta: 0.57]
## Kepulauan Bangka Belitung | Kolom 6     | 0.03       | 0.07       | [Delta: 0.04]
## [DONE] Tabel 6.10 selesai. Ditemukan 28 perbedaan.
## [!] MEMPROSES TABEL: 6.16 di Sheet10
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.16: Kolom 2 s.d 13
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Aceh                 | Kolom 6     | 5.98       | 12.22      | [Delta: 6.24]
## Aceh                 | Kolom 7     | 0.29       | 0.66       | [Delta: 0.37]
## Aceh                 | Kolom 8     | 93.73      | 87.12      | [Delta: 6.61]
## Sumatera Utara       | Kolom 6     | 4.53       | 18.11      | [Delta: 13.58]
## Sumatera Utara       | Kolom 7     | 0.41       | 1.54       | [Delta: 1.13]
## Sumatera Utara       | Kolom 8     | 95.06      | 80.35      | [Delta: 14.71]
## Sumatera Barat       | Kolom 6     | 8.60       | 10.18      | [Delta: 1.58]
## Sumatera Barat       | Kolom 7     | 0.03       | 0.60       | [Delta: 0.57]
## Sumatera Barat       | Kolom 8     | 91.37      | 89.21      | [Delta: 2.16]
## Riau                 | Kolom 6     | 3.64       | 10.81      | [Delta: 7.17]
## Riau                 | Kolom 7     | 0.68       | 0.52       | [Delta: 0.16]
## Riau                 | Kolom 8     | 95.67      | 88.67      | [Delta: 7.00]
## Jambi                | Kolom 6     | 8.71       | 6.90       | [Delta: 1.81]
## Jambi                | Kolom 7     | 0.54       | 0.65       | [Delta: 0.11]
## Jambi                | Kolom 8     | 90.75      | 92.45      | [Delta: 1.70]
## Sumatera Selatan     | Kolom 6     | 5.22       | 9.47       | [Delta: 4.25]
## Sumatera Selatan     | Kolom 7     | 0.70       | 0.61       | [Delta: 0.09]
## Sumatera Selatan     | Kolom 8     | 94.07      | 89.92      | [Delta: 4.15]
## Bengkulu             | Kolom 6     | 6.88       | 13.29      | [Delta: 6.41]
## Bengkulu             | Kolom 7     | 0.08       | 0.97       | [Delta: 0.89]
## Bengkulu             | Kolom 8     | 93.03      | 85.74      | [Delta: 7.29]
## Lampung              | Kolom 6     | 6.98       | 13.53      | [Delta: 6.55]
## Lampung              | Kolom 7     | 0.47       | 0.75       | [Delta: 0.28]
## Lampung              | Kolom 8     | 92.55      | 85.72      | [Delta: 6.83]
## Kepulauan Bangka Belitung | Kolom 6     | 6.42       | 9.55       | [Delta: 3.13]
## Kepulauan Bangka Belitung | Kolom 7     | 0.00       | 0.74       | [Delta: 0.74]
## Kepulauan Bangka Belitung | Kolom 8     | 93.58      | 89.71      | [Delta: 3.87]
## [DONE] Tabel 6.16 selesai. Ditemukan 27 perbedaan.
## [!] MEMPROSES TABEL: 6.11 di Sheet10
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.11: Kolom 2 s.d 25
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Sulawesi Tengah      | Kolom 2     | 76.24      | 23.40      | [Delta: 52.84]
## Sulawesi Tengah      | Kolom 3     | 7.44       | 5.87       | [Delta: 1.57]
## Sulawesi Tengah      | Kolom 4     | 9.99       | 9.49       | [Delta: 0.50]
## Sulawesi Tengah      | Kolom 5     | 1.47       | 34.42      | [Delta: 32.95]
## Sulawesi Tengah      | Kolom 6     | 0.05       | 10.48      | [Delta: 10.43]
## Sulawesi Tengah      | Kolom 7     | 2.75       | 11.15      | [Delta: 8.40]
## Sulawesi Tengah      | Kolom 8     | 2.06       | 5.19       | [Delta: 3.13]
## Sulawesi Selatan     | Kolom 2     | 61.88      | 16.94      | [Delta: 44.94]
## Sulawesi Selatan     | Kolom 3     | 20.47      | 5.78       | [Delta: 14.69]
## Sulawesi Selatan     | Kolom 4     | 11.22      | 19.02      | [Delta: 7.80]
## Sulawesi Selatan     | Kolom 5     | 4.49       | 36.38      | [Delta: 31.89]
## Sulawesi Selatan     | Kolom 6     | 0.25       | 6.88       | [Delta: 6.63]
## Sulawesi Selatan     | Kolom 7     | 1.23       | 11.22      | [Delta: 9.99]
## Sulawesi Selatan     | Kolom 8     | 0.45       | 3.78       | [Delta: 3.33]
## Sulawesi Tenggara    | Kolom 2     | 68.89      | 7.50       | [Delta: 61.39]
## Sulawesi Tenggara    | Kolom 3     | 7.54       | 10.64      | [Delta: 3.10]
## Sulawesi Tenggara    | Kolom 4     | 12.66      | 12.07      | [Delta: 0.59]
## Sulawesi Tenggara    | Kolom 5     | 6.91       | 32.34      | [Delta: 25.43]
## Sulawesi Tenggara    | Kolom 6     | 0.34       | 26.13      | [Delta: 25.79]
## Sulawesi Tenggara    | Kolom 7     | 3.64       | 6.30       | [Delta: 2.66]
## Sulawesi Tenggara    | Kolom 8     | 0.03       | 5.01       | [Delta: 4.98]
## Gorontalo            | Kolom 2     | 80.17      | 16.15      | [Delta: 64.02]
## Gorontalo            | Kolom 3     | 4.90       | 2.51       | [Delta: 2.39]
## Gorontalo            | Kolom 4     | 8.74       | 20.48      | [Delta: 11.74]
## Gorontalo            | Kolom 5     | 4.68       | 42.44      | [Delta: 37.76]
## Gorontalo            | Kolom 6     | 0.15       | 11.23      | [Delta: 11.08]
## Gorontalo            | Kolom 7     | 1.36       | 3.87       | [Delta: 2.51]
## Gorontalo            | Kolom 8     | 0.00       | 3.31       | [Delta: 3.31]
## Sulawesi Barat       | Kolom 2     | 64.15      | 58.00      | [Delta: 6.15]
## Sulawesi Barat       | Kolom 3     | 13.14      | 1.36       | [Delta: 11.78]
## Sulawesi Barat       | Kolom 4     | 10.72      | 8.82       | [Delta: 1.90]
## Sulawesi Barat       | Kolom 5     | 7.19       | 26.93      | [Delta: 19.74]
## Sulawesi Barat       | Kolom 6     | 0.00       | 3.57       | [Delta: 3.57]
## Sulawesi Barat       | Kolom 7     | 1.85       | 0.81       | [Delta: 1.04]
## Sulawesi Barat       | Kolom 8     | 2.95       | 0.51       | [Delta: 2.44]
## [DONE] Tabel 6.11 selesai. Ditemukan 35 perbedaan.
## [!] MEMPROSES TABEL: 6.12 di Sheet10
## [INFO] Kolom terdeteksi otomatis untuk Tabel 6.12: Kolom 2 s.d 13
## Wilayah              | Kolom      | File A     | File B     | Selisih
## --------------------------------------------------------------------------- 
## Aceh                 | Kolom 2     | 45.59      | 0.00       | [Delta: 45.59]
## Aceh                 | Kolom 3     | 49.38      | 0.00       | [Delta: 49.38]
## Aceh                 | Kolom 4     | 5.04       | 0.00       | [Delta: 5.04]
## Aceh                 | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Sumatera Utara       | Kolom 2     | 38.52      | 0.00       | [Delta: 38.52]
## Sumatera Utara       | Kolom 3     | 56.38      | 0.00       | [Delta: 56.38]
## Sumatera Utara       | Kolom 4     | 5.09       | 0.00       | [Delta: 5.09]
## Sumatera Utara       | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Sumatera Barat       | Kolom 2     | 28.95      | 0.00       | [Delta: 28.95]
## Sumatera Barat       | Kolom 3     | 68.26      | 0.00       | [Delta: 68.26]
## Sumatera Barat       | Kolom 4     | 2.79       | 0.00       | [Delta: 2.79]
## Sumatera Barat       | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Riau                 | Kolom 2     | 33.36      | 0.00       | [Delta: 33.36]
## Riau                 | Kolom 3     | 62.21      | 0.00       | [Delta: 62.21]
## Riau                 | Kolom 4     | 4.43       | 0.00       | [Delta: 4.43]
## Riau                 | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Jambi                | Kolom 2     | 28.24      | 0.00       | [Delta: 28.24]
## Jambi                | Kolom 3     | 70.98      | 0.00       | [Delta: 70.98]
## Jambi                | Kolom 4     | 0.77       | 0.00       | [Delta: 0.77]
## Jambi                | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Sumatera Selatan     | Kolom 2     | 41.13      | 0.00       | [Delta: 41.13]
## Sumatera Selatan     | Kolom 3     | 56.60      | 0.00       | [Delta: 56.60]
## Sumatera Selatan     | Kolom 4     | 2.26       | 0.00       | [Delta: 2.26]
## Sumatera Selatan     | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Bengkulu             | Kolom 2     | 31.27      | 0.00       | [Delta: 31.27]
## Bengkulu             | Kolom 3     | 68.02      | 0.00       | [Delta: 68.02]
## Bengkulu             | Kolom 4     | 0.72       | 0.00       | [Delta: 0.72]
## Bengkulu             | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Lampung              | Kolom 2     | 30.02      | 0.00       | [Delta: 30.02]
## Lampung              | Kolom 3     | 67.20      | 0.00       | [Delta: 67.20]
## Lampung              | Kolom 4     | 2.78       | 0.00       | [Delta: 2.78]
## Lampung              | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Kepulauan Bangka Belitung | Kolom 2     | 21.30      | 0.00       | [Delta: 21.30]
## Kepulauan Bangka Belitung | Kolom 3     | 75.11      | 0.00       | [Delta: 75.11]
## Kepulauan Bangka Belitung | Kolom 4     | 3.59       | 0.00       | [Delta: 3.59]
## Kepulauan Bangka Belitung | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Kepulauan Riau       | Kolom 2     | 22.19      | 0.00       | [Delta: 22.19]
## Kepulauan Riau       | Kolom 3     | 70.48      | 0.00       | [Delta: 70.48]
## Kepulauan Riau       | Kolom 4     | 7.33       | 0.00       | [Delta: 7.33]
## Kepulauan Riau       | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## Dki Jakarta          | Kolom 2     | 45.43      | 0.00       | [Delta: 45.43]
## Dki Jakarta          | Kolom 3     | 49.27      | 0.00       | [Delta: 49.27]
## Dki Jakarta          | Kolom 4     | 5.30       | 0.00       | [Delta: 5.30]
## Dki Jakarta          | Kolom 5     | 100.00     | 0.00       | [Delta: 100.00]
## [DONE] Tabel 6.12 selesai. Ditemukan 44 perbedaan.

6 Save Output

Setelah pemeriksaan tabel selesai dilakukan dan semua sel yang bermasalah berhasil ditandai dengan warna kuning, dokumen file kerja diekspor ke dalam spreadsheet Excel.

Hasil pemeriksaan disimpan pada folder output dengan status menimpa file lama jika sudah ada.

Tempat Penyimpanan File

## 
## [3/3] Menyimpan seluruh hasil pemeriksaan ...
## Hasil tersimpan di:D:/2. Pengembangan diri/1 Exercise Bagus/Otomatisasi Pemeriksaan Tabel/Nas_Hasil_Cek_Bab 6.xlsx

Lamanya Running

## WAKTU SELESAI RUN DATA: 2026-05-29 16:37:05
## TOTAL DURASI PROSES: 159.5 detik

Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIk90b21hdGlzYXNpIFBlbWVyaWtzYWFuIFRhYmVsIFB1Ymxpa2FzaSBTdGF0aXN0aWsiDQpzdWJ0aXRsZTogIkxldmVsIE5hc2lvbmFsIGRhbiBQcm92aW5zaSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMgUGVuZGFodWx1YW4NCg0KUHJvc2VzIHBlbnl1c3VuYW4gUHVibGlrYXNpIFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCBiYWlrIGRpIHRpbmdrYXQgbmFzaW9uYWwgbWF1cHVuIHByb3ZpbnNpLCBtZW51bnR1dCBrZXRlcGF0YW4gYWt1cmFzaSBkYXRhIHlhbmcgc2FuZ2F0IHRpbmdnaS4gS2VzYWxhaGFuIHNla2VjaWwgYXBhIHB1biBwYWRhIGxldmVsIGRlc2ltYWwgZGFwYXQgbWVueWVzYXRrYW4gaW50ZXJwcmV0YXNpIGluZGlrYXRvciBtYWtybyB5YW5nIGRpZ3VuYWthbiBzZWJhZ2FpIGRhc2FyIHBlbmdhbWJpbGFuIGtlYmlqYWthbiBwdWJsaWsuIERhbGFtIHByYWt0aWtueWEsIHByb3NlcyBrb21waWxhc2kgc2VyaW5nIGthbGkgbWVsaWJhdGthbiBiZWJlcmFwYSB0aW0gcGVuZ29sYWggeWFuZyBiZWtlcmphIHNlY2FyYSBwYXJhbGVsLCBzZWhpbmdnYSB0YWhhcGFuIHBlbWVyaWtzYWFuIG11dGxhayBkaXBlcmx1a2FuIHNlYmVsdW0gZGF0YSBkaXB1Ymxpa2FzaWthbiBzZWNhcmEgcmVzbWkuDQoNClNlY2FyYSBoaXN0b3JpcywgcGVtZXJpa3NhYW4gZGFuIHBlbWJhbmRpbmdhbiBhbnRhci1maWxlIGhhc2lsIHBlbmdvbGFoYW4gZGlsYWt1a2FuIHNlY2FyYSBtYW51YWwgb2xlaCB0aW0gKG1pc2FsbnlhIG1lbGFsdWkgbWV0b2RlICpleWUtYmFsbGluZyogYXRhdSBtZW55YW5kaW5na2FuIGR1YSBzcHJlYWRzaGVldCBFeGNlbCBiZXJkYW1waW5nYW4pLiBOYW11biwgcGVuZGVrYXRhbiBtYW51YWwgaW5pIG1lbWlsaWtpIGtldGVyYmF0YXNhbiBzZXJpdXMgZGFuIHRpZGFrIGxhZ2kgZWZpc2llbiB1bnR1ayB0YXRhIGtlbG9sYSBkYXRhIG1vZGVybi4gQmVyYWxpaCBkYXJpIHBlbmRla2F0YW4gbWFudWFsIGtlIG1ldG9kZSBwZW1lcmlrc2FhbiBiZXJiYXNpcyBvdG9tYXRpc2FzaSBtZW5nZ3VuYWthbiBSIG1lbWJlcmlrYW4gbG9tcGF0YW4gZWZpc2llbnNpIGRhbiBrdWFsaXRhcyBwZW5qYW1pbmFuIG11dHUgZGF0YSAoKmRhdGEgcXVhbGl0eSBhc3N1cmFuY2UqKSB5YW5nIHNpZ25pZmlrYW4uDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQoNCiMgS29uZmlndXJhc2kNCg0KQmFnaWFuIGtvbmZpZ3VyYXNpIG1lcnVwYWthbiB0YWhhcCBhd2FsIHBlbnlpYXBhbiBrZXJqYS4gDQoNClBhZGEgYmFnaWFuIGluaSwgcHJvZ3JhbSBtZW5kZWZpbmlzaWthbiBsb2thc2kgZGlyZWt0b3JpIGtlcmphIChgYmFzZV9kaXJgKSwgZmlsZSBpbnB1dCBkYXJpIFBlbmdvbGFoIEEgKGBmaWxlXzFgKSwgZmlsZSBwZW1iYW5kaW5nIGRhcmkgUGVuZ29sYWggQiAoYGZpbGVfMmApLCBzZXJ0YSBmaWxlIG91dHB1dCBiZXJiZW50dWsgc3ByZWFkc2hlZXQgKGBmaWxlX291dGApLiANCg0KYGBge3J9DQpiYXNlX2RpciA8LSAiRDovMi4gUGVuZ2VtYmFuZ2FuIGRpcmkvMSBFeGVyY2lzZSBCYWd1cy9PdG9tYXRpc2FzaSBQZW1lcmlrc2FhbiBUYWJlbCINCmZpbGVfMSAgIDwtIGZpbGUucGF0aChiYXNlX2RpciwgIk5hc19QZW5nb2xhaCBBLnhsc3giKQ0KZmlsZV8yICAgPC0gZmlsZS5wYXRoKGJhc2VfZGlyLCAiTmFzX1BlbmdvbGFoIEIueGxzeCIpDQpmaWxlX291dCA8LSBmaWxlLnBhdGgoYmFzZV9kaXIsICJOYXNfSGFzaWxfQ2VrX0JhYiA2Lnhsc3giKQ0KDQpkYWZ0YXJfdGFiZWwgPC0gbGlzdCgNCiAgIjYuMiIgID0gIlNoZWV0MSIsDQogICI2LjMiICA9ICJTaGVldDEiLA0KICAiNi45IiAgPSAiU2hlZXQyIiwgIA0KICAiNi4xNCIgPSAiU2hlZXQyIiwNCiAgIjYuOCIgID0gIlNoZWV0NyIsDQogICI2LjEwIiA9ICJTaGVldDgiLCAgDQogICI2LjE2IiA9ICJTaGVldDEwIiwNCiAgIjYuMTEiID0gIlNoZWV0MTAiLA0KICAiNi4xMiIgPSAiU2hlZXQxMCINCiAgKQ0KYGBgDQoNCg0KKipXYWt0dSBNdWxhaSBSdW4gRGF0YSoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd2FrdHVfbXVsYWkgPC0gU3lzLnRpbWUoKQ0KY2F0KCJXQUtUVSBNVUxBSSBSVU4gREFUQToiLCBmb3JtYXQod2FrdHVfbXVsYWksICIlWS0lbS0lZCAlSDolTTolUyIpLCAiXG4iKQ0KYGBgDQoNCg0KIyBGdW5nc2kNCg0KRGliYW5ndW4gZHVhIGZ1bmdzaSBiYW50dSB1bnR1ayBtZWxha3VrYW4gc3RhbmRhcmlzYXNpIGRhdGEgdGVrcyBtYXVwdW4gbnVtZXJpazoNCg0KMS4gKipgY2xlYW5fdGV4dGAqKjogRnVuZ3NpIGluaSBkaWd1bmFrYW4gdW50dWsgbWVtYmVyc2loa2FuIHNwYXNpIGJlcmxlYmloLCBtZW5naGFwdXMga2FyYWt0ZXIgKndoaXRlc3BhY2UqIHRhayB0ZXJsaWhhdCAoYFxyYCwgYFxuYCwgYFx0YCksIGRhbiBtZW5ndWJhaCBzZWx1cnVoIGh1cnVmIG1lbmphZGkgaHVydWYga2VjaWwgKCpsb3dlcmNhc2UqKS4gU3RhbmRhcmRpc2FzaSB0ZWtzIGluaSBrcnVzaWFsIGFnYXIgcHJvc2VzIHBlbmNhcmlhbiBrYXRhIGt1bmNpIGp1ZHVsIHRhYmVsIG1hdXB1biBuYW1hIHByb3ZpbnNpIChtaXNhbG55YSBiYXJpcyAiQWNlaCIpIHRpZGFrIG1lbmdhbGFtaSBrZWdhZ2FsYW4gYWtpYmF0IHBlcmJlZGFhbiBwZW51bGlzYW4gc3Bhc2lhbC4NCg0KMi4gKipgY2xlYW5fbnVtYCoqOiBGdW5nc2kgaW5pIGJlcnR1Z2FzIG1lbmdvbnZlcnNpIHNlbCBkYXRhIG1lbnRhaCBrZSBiZW50dWsgYW5na2EgbnVtZXJpayByaWlsLiBGdW5nc2kgaW5pIG1hbXB1IG1lbmRldGVrc2kgc2VydGEgbWVtYmVyc2loa2FuIGthcmFrdGVyIHN0cmlwIChgLWApLCB0aXRpayAoYC5gKSwgYXRhdSBzZWwga29zb25nIChgTkFgL2BudWxsYCkgbWVuamFkaSBuaWxhaSBuZXRyYWwgYDBgLiBTZWxhaW4gaXR1LCBmdW5nc2kgaW5pIG1lbGFrdWthbiBwZW55ZXJhZ2FtYW4gcGVtaXNhaCBkZXNpbWFsIGRhcmkgZm9ybWF0IGtvbWEgbWVuamFkaSB0aXRpaywgc2VydGEgbWVuZ3VuY2kgcHJlc2lzaSBuaWxhaSB0ZXBhdCBwYWRhICoqMiBkaWdpdCBkZXNpbWFsKiouDQoNCg0KYGBge3J9DQpjbGVhbl90ZXh0IDwtIGZ1bmN0aW9uKHgpIHsNCiAgc2FwcGx5KHgsIGZ1bmN0aW9uKHZhbCkgew0KICAgIGlmIChpcy5uYSh2YWwpIHx8IGlzLm51bGwodmFsKSkgcmV0dXJuKCIiKQ0KICAgIHJlcyA8LSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHZhbCksICJbXHJcblx0XSIsICIgIikNCiAgICByZXR1cm4oc3RyX3RvX2xvd2VyKHN0cl90cmltKHN0cl9yZXBsYWNlX2FsbChyZXMsICJcXHMrIiwgIiAiKSkpKQ0KICB9LCBVU0UuTkFNRVMgPSBGQUxTRSkNCn0NCg0KY2xlYW5fbnVtIDwtIGZ1bmN0aW9uKHgpIHsNCiAgaWYgKGxlbmd0aCh4KSA9PSAwIHx8IGlzLm51bGwoeCkgfHwgaXMubmEoeCkpIHJldHVybigwKQ0KICBpZiAoaXMubnVtZXJpYyh4KSkgcmV0dXJuKHJvdW5kKHgsIDIpKQ0KICANCiAgdmFsIDwtIHN0cl90cmltKGFzLmNoYXJhY3Rlcih4KSkNCiAgaWYgKHZhbCAlaW4lIGMoIi0iLCAiLiIsICIiLCAibnVsbCIsICJOQSIpKSByZXR1cm4oMCkgDQogIA0KICB2YWwgPC0gc3RyX3JlcGxhY2VfYWxsKHZhbCwgIiwiLCAiLiIpDQogIHJlcyA8LSBhcy5udW1lcmljKHZhbCkNCiAgcmV0dXJuKGlmZWxzZShpcy5uYShyZXMpLCAwLCByb3VuZChyZXMsIDIpKSkNCn0NCmBgYA0KDQoNCiMgX1ByZXBhcmF0aW9uIFdvcmtib29rXw0KDQpVbnR1ayBtZW1wZXJjZXBhdCBkdXJhc2kgKnJ1bm5pbmcqLCBkaXRlcmFwa2FuIG1ldG9kZSAqY2FjaGluZyBkYXRhKi4gRmlsZSBFeGNlbCBkaW11YXQga2UgZGFsYW0gbWVtb3JpIFIgKGBjYWNoZWRfc2hlZXRzX2FgIGRhbiBgY2FjaGVkX3NoZWV0c19iYCkgaGFueWEgdW50dWsgbGVtYmFyIGtlcmphICgqc2hlZXQqKSB1bmlrIHlhbmcgdGVyZGFmdGFyIHBhZGEga29uZmlndXJhc2kuIA0KDQpCZXJzYW1hYW4gZGVuZ2FuIGl0dSwgZmlsZSBkb2t1bWVuIG91dHB1dCBiYXJ1IChgd2JfdXRhbWFgKSBkaWJlbnR1ay4gU2VsdXJ1aCBzdHJ1a3R1ciBkYXRhIGFzbGkgZGFyaSBQZW5nb2xhaCBBIGRpc2FsaW4ga2UgZGFsYW0gZG9rdW1lbiBiYXJ1IGluaSBzZWJhZ2FpIHRlbXBsYXRlIHV0YW1hLiBCYWIgaW5pIGp1Z2EgbWVueWlhcGthbiBnYXlhIHBlbmF0YWFuIHNlbCAoKmNlbGwgc3R5bGluZyopIGtodXN1czogZm9ybWF0IGRlc2ltYWwgc3RhbmRhciB1bnR1ayBzZWwgbm9ybWFsIChgbm9ybWFsTnVtU3R5bGVgKSBzZXJ0YSBmb3JtYXQgcGVuYW5kYSB3YXJuYSBrdW5pbmcgdGVyYW5nIGRlbmdhbiB0ZWtzIG1lcmFoIHRlYmFsIChgZGlmZlN0eWxlYCkgdW50dWsgbWVuYW5kYWkgc2VsIGRhdGEgeWFuZyB0ZXJidWt0aSBtZW1pbGlraSBzZWxpc2loL3BlcmJlZGFhbiBhbmdrYS4NCg0KDQpgYGB7cn0NCmNhdCgiWzEvM10gTWVtYmFjYSB0ZW1wbGF0ZSBkYXJpIEZpbGUgQSBkYW4gZGF0YSBGaWxlIEIuLi5cbiIpDQp3Yl91dGFtYSA8LSBjcmVhdGVXb3JrYm9vaygpDQoNCmRpZmZTdHlsZSA8LSBjcmVhdGVTdHlsZShmZ0ZpbGwgPSAiI0ZGRkYwMCIsIGZvbnRDb2xvdXIgPSAiIzlDMDAwNiIsIHRleHREZWNvcmF0aW9uID0gImJvbGQiLCBudW1GbXQgPSAiMC4wMCIpDQpub3JtYWxOdW1TdHlsZSA8LSBjcmVhdGVTdHlsZShudW1GbXQgPSAiMC4wMCIpDQoNCnVuaXF1ZV9zaGVldHMgPC0gdW5pcXVlKHVubGlzdChkYWZ0YXJfdGFiZWwpKQ0KDQpjYWNoZWRfc2hlZXRzX2EgPC0gbGlzdCgpDQpjYWNoZWRfc2hlZXRzX2IgPC0gbGlzdCgpDQoNCmZvciAoc2ggaW4gdW5pcXVlX3NoZWV0cykgew0KICBjYWNoZWRfc2hlZXRzX2FbW3NoXV0gPC0gcmVhZF9leGNlbChmaWxlXzEsIHNoZWV0ID0gc2gsIGNvbF9uYW1lcyA9IEZBTFNFKQ0KICBjYWNoZWRfc2hlZXRzX2JbW3NoXV0gPC0gcmVhZF9leGNlbChmaWxlXzIsIHNoZWV0ID0gc2gsIGNvbF9uYW1lcyA9IEZBTFNFKQ0KICANCiAgYWRkV29ya3NoZWV0KHdiX3V0YW1hLCBzaCkNCiAgd3JpdGVEYXRhKHdiX3V0YW1hLCBzaCwgY2FjaGVkX3NoZWV0c19hW1tzaF1dLCBjb2xOYW1lcyA9IEZBTFNFKQ0KfQ0KYGBgDQoNCiMgUHJvc2VzIFBlbmdlY2VrYW4NCg0KSW5pIG1lcnVwYWthbiBpbnRpIGRhcmkgcHJvc2VzIHBlbWVyaWtzYWFuLCBkaSBtYW5hIHByb2dyYW0gbWVsYWt1a2FuIGl0ZXJhc2kgYmVybGFwaXMgdW50dWsgbWVueWlzaXIgc2V0aWFwIHRhYmVsIHlhbmcgZGlkYWZ0YXJrYW4gc2VjYXJhIHNpbXVsdGFuOg0KDQoqICoqRGV0ZWtzaSBBcmVhIEp1ZHVsIGRhbiBXaWxheWFoKio6IFByb2dyYW0gbWVsYWt1a2FuIHBlbmNhcmlhbiBkaW5hbWlzIHVudHVrIG1lbmVtdWthbiBiYXJpcyBqdWR1bCBzcGVzaWZpayAobWlzYWw6IGAiVGFiZWwgNi4yImApIGRpIGtlZHVhIGZpbGUuIFNldGVsYWgganVkdWwgZGl0ZW11a2FuLCByZW50YW5nIGJhcmlzIGRpIGJhd2FobnlhIGRpcGluZGFpIHVudHVrIG1lbmd1bmNpIHBvc2lzaSBrb29yZGluYXQgYmFyaXMgYCJBY2VoImAgc2ViYWdhaSBiYXRhcyBhdGFzIGRhbiBiYXJpcyBgIkluZG9uZXNpYS9Ub3RhbC9OYXNpb25hbCJgIHNlYmFnYWkgYmF0YXMgYmF3YWggZGF0YS4NCg0KKiAqKk90b21hdGlzYXNpIEJhdGFzIEtvbG9tKio6IFByb2dyYW0gbWVuZ2FtYmlsIHNhbXBlbCBiYXJpcyBkYXRhIEFjZWggdW50dWsgbWVuZGV0ZWtzaSBzZWJlcmFwYSBqYXVoIGtvbG9tIHRlcmthbmFuIHlhbmcgdGVyaXNpIGRhdGEgYW5na2EuIEhhbCBpbmkgbWVtYXN0aWthbiBiYWh3YSBiYXRhcyBrb2xvbSBwZW5jYXJpYW4gdGVya3VuY2kgc2VjYXJhIG90b21hdGlzIChgMjptYXhfY29sX3RhYmVsYCksIHNlaGluZ2dhIHByb3NlcyBwZW5nZWNla2FuIHRpZGFrIGFrYW4gbWVuZ2FsYW1pICplcnJvciogYWtpYmF0IG1lbnlpc2lyIGtvbG9tIGtvc29uZyBkaSBzaXNpIGthbmFuIHRhYmVsLg0KDQoqICoqRWtzZWt1c2kgUGVyYmFuZGluZ2FuIFBhcmFsZWwqKjogUiBha2FuIG1lbWJhbmRpbmdrYW4gbmlsYWkgc2VsIHBhZGEgQmFyaXMgYGlgIEtvbG9tIGBqYCBkaSBmaWxlIFBlbmdvbGFoIEEgc2VjYXJhIGxhbmdzdW5nIGRlbmdhbiBCYXJpcyBgaWAgS29sb20gYGpgIGZpbGUgUGVuZ29sYWggQi4gSmlrYSBkaXRlbXVrYW4gc2VsaXNpaCBtdXRsYWsgZGkgYXRhcyBhbWJhbmcgdG9sZXJhbnNpIHBlbWJ1bGF0YW4gZGVzaW1hbCAoYD4gMC4wMWApLCBtYWthIHNlbCB0ZXJrYWl0IHBhZGEgZG9rdW1lbiBvdXRwdXQgYWthbiBsYW5nc3VuZyAqKmRpd2FybmFpIGt1bmluZyoqLCBkYW4gZGV0YWlsIGlua29uc2lzdGVuc2lueWEgKE5hbWEgV2lsYXlhaCwgUG9zaXNpIEtvbG9tLCBOaWxhaSBBLCBOaWxhaSBCLCBzZXJ0YSBiZXNhcmFuIERlbHRhKSBha2FuIGRpY2V0YWsgc2ViYWdhaSBsb2cgbGFwb3JhbiBwZW1lcmlrc2Fhbi4NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0NCmNhdCgiWzIvM10gTWVtdWxhaSBwZW5nZWNla2FuIGRhdGEgZGFuIHBlbnl1c3VuYW4gZm9ybWF0IDIgZGVzaW1hbC4uLlxuIikNCg0KZm9yICh0YXJnZXRfanVkdWwgaW4gbmFtZXMoZGFmdGFyX3RhYmVsKSkgew0KICBzaGVldF90YXJnZXQgICAgIDwtIGRhZnRhcl90YWJlbFtbdGFyZ2V0X2p1ZHVsXV0NCiAgDQogICNjYXQocGFzdGUwKCJcbiIsIHJlcCgiPSIsIDc1KSwgY29sbGFwc2UgPSAiIiksICJcbiIpDQogIGNhdChwYXN0ZTAoIlshXSBNRU1QUk9TRVMgVEFCRUw6ICIsIHRhcmdldF9qdWR1bCwgIiBkaSAiLCBzaGVldF90YXJnZXQsICJcbiIpKQ0KICAjY2F0KHBhc3RlMChyZXAoIj0iLCA3NSksIGNvbGxhcHNlID0gIiIpLCAiXG4iKQ0KICANCiAgZGZfYSA8LSBjYWNoZWRfc2hlZXRzX2FbW3NoZWV0X3RhcmdldF1dDQogIGRmX2IgPC0gY2FjaGVkX3NoZWV0c19iW1tzaGVldF90YXJnZXRdXQ0KICANCiAgc2VhcmNoX2FfYWxsIDwtIGNsZWFuX3RleHQoYXBwbHkoZGZfYVssIDE6bWluKDUsIG5jb2woZGZfYSkpXSwgMSwgcGFzdGUsIGNvbGxhcHNlPSIgIikpDQogIHNlYXJjaF9iX2FsbCA8LSBjbGVhbl90ZXh0KGFwcGx5KGRmX2JbLCAxOm1pbig1LCBuY29sKGRmX2IpKV0sIDEsIHBhc3RlLCBjb2xsYXBzZT0iICIpKQ0KICANCiAgIyAtLS0gQ0FSSSBBUkVBIERBVEEgRklMRSBBIC0tLQ0KICByb3dfanVkdWxfYSA8LSB3aGljaChzdHJfZGV0ZWN0KHNlYXJjaF9hX2FsbCwgcmVnZXgocGFzdGUwKCJedGFiZWxcXHMrIiwgdGFyZ2V0X2p1ZHVsKSwgaWdub3JlX2Nhc2UgPSBUUlVFKSkpWzFdDQogIGlmIChpcy5uYShyb3dfanVkdWxfYSkpIHsNCiAgICBjYXQocGFzdGUoIlstXSBTa2lwOiBKdWR1bCB0YWJlbCIsIHRhcmdldF9qdWR1bCwgInRpZGFrIGRpdGVtdWthbiBkaSBGaWxlIEEgc2hlZXQiLCBzaGVldF90YXJnZXQsICJcbiIpKQ0KICAgIG5leHQNCiAgfQ0KICANCiAgcmFuZ2Vfc2VhcmNoX2EgPC0gcm93X2p1ZHVsX2E6bWluKHJvd19qdWR1bF9hICsgMTUwLCBucm93KGRmX2EpKQ0KICBzZWFyY2hfYV9wcm92ICA8LSBjbGVhbl90ZXh0KGRmX2FbWzFdXSlbcmFuZ2Vfc2VhcmNoX2FdDQogIA0KICBzdGFydF9yb3dfYSA8LSByYW5nZV9zZWFyY2hfYVt3aGljaChzdHJfZGV0ZWN0KHNlYXJjaF9hX3Byb3YsICJeYWNlaCQiKSlbMV1dDQogIGVuZF9yb3dfYSAgIDwtIHJhbmdlX3NlYXJjaF9hW3doaWNoKHN0cl9kZXRlY3Qoc2VhcmNoX2FfcHJvdiwgImluZG9uZXNpYXx0b3RhbHxuYXNpb25hbCIpKVsxXV0NCiAgDQogIGlmIChpcy5uYShzdGFydF9yb3dfYSkgfHwgaXMubmEoZW5kX3Jvd19hKSkgew0KICAgIGNhdCgiWy1dIFNraXA6IEJhcmlzICdBY2VoJyBhdGF1ICdJbmRvbmVzaWEnIHRpZGFrIGRpdGVtdWthbiBkaSBiYXdhaCBqdWR1bCBGaWxlIEEuXG4iKQ0KICAgIG5leHQNCiAgfQ0KICANCiAgIyAtLS0gQ0FSSSBBUkVBIERBVEEgRklMRSBCIC0tLQ0KICByb3dfanVkdWxfYiAgPC0gd2hpY2goc3RyX2RldGVjdChzZWFyY2hfYl9hbGwsIHJlZ2V4KHBhc3RlMCgiXnRhYmVsXFxzKyIsIHRhcmdldF9qdWR1bCksIGlnbm9yZV9jYXNlID0gVFJVRSkpKVsxXQ0KICBpZiAoaXMubmEocm93X2p1ZHVsX2IpKSB7DQogICAgY2F0KHBhc3RlKCJbLV0gU2tpcDogSnVkdWwgdGFiZWwiLCB0YXJnZXRfanVkdWwsICJ0aWRhayBkaXRlbXVrYW4gZGkgRmlsZSBCIHNoZWV0Iiwgc2hlZXRfdGFyZ2V0LCAiXG4iKSkNCiAgICBuZXh0DQogIH0NCiAgDQogIHJhbmdlX3NlYXJjaF9iIDwtIHJvd19qdWR1bF9iOm1pbihyb3dfanVkdWxfYiArIDE1MCwgbnJvdyhkZl9iKSkNCiAgc2VhcmNoX2JfcHJvdiAgPC0gY2xlYW5fdGV4dChkZl9iW1sxXV0pW3JhbmdlX3NlYXJjaF9iXQ0KICByb3dfYWNlaF9iICAgICA8LSByYW5nZV9zZWFyY2hfYlt3aGljaChzdHJfZGV0ZWN0KHNlYXJjaF9iX3Byb3YsICJeYWNlaCQiKSlbMV1dDQogIA0KICBpZiAoaXMubmEocm93X2FjZWhfYikpIHsNCiAgICBjYXQoIlstXSBTa2lwOiBCYXJpcyAnQWNlaCcgdGlkYWsgZGl0ZW11a2FuIGRpIGJhd2FoIGp1ZHVsIEZpbGUgQi5cbiIpDQogICAgbmV4dA0KICB9DQogIA0KICAjIC0tLSBPVE9NQVRJU0FTSSBCQVRBUyBLT0xPTSBEQVRBIChNZW5jZWdhaCBiYWJsYXMga2Uga29sb20ga29zb25nKSAtLS0NCiAgcm93X2RhdGFfc2FtcGVsIDwtIGRmX2Fbc3RhcnRfcm93X2EsIF0NCiAgbWF4X2NvbF90YWJlbCAgIDwtIG1heCh3aGljaCghaXMubmEocm93X2RhdGFfc2FtcGVsKSAmIHJvd19kYXRhX3NhbXBlbCAhPSAiIikpDQogIA0KICBjb2xzX2ZpbGVfMSAgICAgPC0gMjptYXhfY29sX3RhYmVsDQogIGNvbHNfZmlsZV8yICAgICA8LSBjb2xzX2ZpbGVfMQ0KICANCiAgY2F0KHBhc3RlMCgiW0lORk9dIEtvbG9tIHRlcmRldGVrc2kgb3RvbWF0aXMgdW50dWsgVGFiZWwgIiwgdGFyZ2V0X2p1ZHVsLCAiOiBLb2xvbSAyIHMuZCAiLCBtYXhfY29sX3RhYmVsLCAiXG4iKSkNCiAgDQogICMgLS0tIEVLU0VLVVNJIFBFUkJBTkRJTkdBTiBEQVRBIC0tLQ0KICBjYXQoc3ByaW50ZigiJS0yMHMgfCAlLTEwcyB8ICUtMTBzIHwgJS0xMHMgfCAlLXNcbiIsICJXaWxheWFoIiwgIktvbG9tIiwgIkZpbGUgQSIsICJGaWxlIEIiLCAiU2VsaXNpaCIpKQ0KICBjYXQocGFzdGUwKHJlcCgiLSIsIDc1KSwgY29sbGFwc2UgPSAiIiksICJcbiIpDQogIA0KICB0b3RhbF9iZWRhX3RhYmVsIDwtIDANCiAgDQogIGZvciAoaSBpbiAwOihlbmRfcm93X2EgLSBzdGFydF9yb3dfYSkpIHsNCiAgICByYSA8LSBzdGFydF9yb3dfYSArIGkNCiAgICByYiA8LSByb3dfYWNlaF9iICsgaQ0KICAgIA0KICAgIGlmIChyYSA+IG5yb3coZGZfYSkgfHwgcmIgPiBucm93KGRmX2IpKSBuZXh0DQogICAgDQogICAgcF9uYW1lIDwtIHNlYXJjaF9hX3Byb3ZbcmEgLSByb3dfanVkdWxfYSArIDFdIA0KICAgIGlmIChwX25hbWUgPT0gIiIgfHwgaXMubmEocF9uYW1lKSkgbmV4dA0KICAgIA0KICAgIGZvciAoaiBpbiAxOmxlbmd0aChjb2xzX2ZpbGVfMSkpIHsNCiAgICAgIGNhIDwtIGNvbHNfZmlsZV8xW2pdDQogICAgICBjYiA8LSBjb2xzX2ZpbGVfMltqXSANCiAgICAgIA0KICAgICAgaWYgKGNhID4gbmNvbChkZl9hKSB8fCBjYiA+IG5jb2woZGZfYikpIG5leHQNCiAgICAgIA0KICAgICAgdmFsX2EgPC0gY2xlYW5fbnVtKGRmX2FbW3JhLCBjYV1dKQ0KICAgICAgdmFsX2IgPC0gY2xlYW5fbnVtKGRmX2JbW3JiLCBjYl1dKQ0KICAgICAgDQogICAgICBpZiAoaXMubnVtZXJpYyh2YWxfYSkpIHsNCiAgICAgICAgd3JpdGVEYXRhKHdiX3V0YW1hLCBzaGVldF90YXJnZXQsIHggPSB2YWxfYSwgc3RhcnRSb3cgPSByYSwgc3RhcnRDb2wgPSBjYSwgY29sTmFtZXMgPSBGQUxTRSkNCiAgICAgICAgYWRkU3R5bGUod2JfdXRhbWEsIHNoZWV0X3RhcmdldCwgc3R5bGUgPSBub3JtYWxOdW1TdHlsZSwgcm93cyA9IHJhLCBjb2xzID0gY2EsIGdyaWRFeHBhbmQgPSBGQUxTRSkNCiAgICAgIH0NCiAgICAgIA0KICAgICAgc2VsaXNpaCA8LSBhYnModmFsX2EgLSB2YWxfYikNCiAgICAgIA0KICAgICAgaWYgKHNlbGlzaWggPiAwLjAxKSB7DQogICAgICAgIHRvdGFsX2JlZGFfdGFiZWwgPC0gdG90YWxfYmVkYV90YWJlbCArIDENCiAgICAgICAgDQogICAgICAgIGFkZFN0eWxlKHdiX3V0YW1hLCBzaGVldF90YXJnZXQsIHN0eWxlID0gZGlmZlN0eWxlLCByb3dzID0gcmEsIGNvbHMgPSBjYSwgZ3JpZEV4cGFuZCA9IEZBTFNFKQ0KICAgICAgICANCiAgICAgICAgY2F0KHNwcmludGYoIiUtMjBzIHwgS29sb20gJS01ZCB8ICUtMTAuMmYgfCAlLTEwLjJmIHwgW0RlbHRhOiAlLjJmXVxuIiwgDQogICAgICAgICAgICAgICAgICAgIHN0cl90b190aXRsZShwX25hbWUpLCBjYSwgdmFsX2EsIHZhbF9iLCBzZWxpc2loKSkNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgY2F0KHBhc3RlMCgiW0RPTkVdIFRhYmVsICIsIHRhcmdldF9qdWR1bCwgIiBzZWxlc2FpLiBEaXRlbXVrYW4gIiwgdG90YWxfYmVkYV90YWJlbCwgIiBwZXJiZWRhYW4uXG4iKSkNCn0NCmBgYA0KDQojIFNhdmUgT3V0cHV0DQoNClNldGVsYWggcGVtZXJpa3NhYW4gdGFiZWwgc2VsZXNhaSBkaWxha3VrYW4gZGFuIHNlbXVhIHNlbCB5YW5nIGJlcm1hc2FsYWggYmVyaGFzaWwgZGl0YW5kYWkgZGVuZ2FuIHdhcm5hIGt1bmluZywgZG9rdW1lbiBmaWxlIGtlcmphIGRpZWtzcG9yIGtlIGRhbGFtIHNwcmVhZHNoZWV0IEV4Y2VsLg0KDQpIYXNpbCBwZW1lcmlrc2FhbiBkaXNpbXBhbiBwYWRhIGZvbGRlciBvdXRwdXQgZGVuZ2FuIHN0YXR1cyBtZW5pbXBhIGZpbGUgbGFtYSBqaWthIHN1ZGFoIGFkYS4NCg0KKipUZW1wYXQgUGVueWltcGFuYW4gRmlsZSoqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KY2F0KCJcblszLzNdIE1lbnlpbXBhbiBzZWx1cnVoIGhhc2lsIHBlbWVyaWtzYWFuIC4uLlxuIikNCnNhdmVXb3JrYm9vayh3Yl91dGFtYSwgZmlsZV9vdXQsIG92ZXJ3cml0ZSA9IFRSVUUpDQpjYXQocGFzdGUwKCJIYXNpbCB0ZXJzaW1wYW4gZGk6IiwgZmlsZV9vdXQsICJcbiIpKQ0KYGBgDQoNCioqTGFtYW55YSBSdW5uaW5nKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9DQp3YWt0dV9zZWxlc2FpIDwtIFN5cy50aW1lKCkNCmR1cmFzaV9wcm9zZXMgPC0gZGlmZnRpbWUod2FrdHVfc2VsZXNhaSwgd2FrdHVfbXVsYWksIHVuaXRzID0gInNlY3MiKQ0KDQpjYXQoIldBS1RVIFNFTEVTQUkgUlVOIERBVEE6IiwgZm9ybWF0KHdha3R1X3NlbGVzYWksICIlWS0lbS0lZCAlSDolTTolUyIpLCAiXG4iKQ0KY2F0KCJUT1RBTCBEVVJBU0kgUFJPU0VTOiIsIHJvdW5kKGR1cmFzaV9wcm9zZXMsIDIpLCAiZGV0aWtcbiIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==