Email             :
RPubs            : https://rpubs.com/vanessasupit/
Github           : https://github.com/vanessasupit/
Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 Kata pengantar

dalam part 1, kita menggunakan uji log-rank dan regresi Cox untuk menguji hubungan antara kovariat dari interest dan hasil dari survival. namun analisis ini bergantung pada kovariat yang diukur pada baseline, yaitu sebelum waktu tindak lanjut untuk acara dimulai. apa yang terjadi jika kita tertarik pada kovariat yang diukur setelah waktu tindak lanjut dimulai?

2 Contoh: Respon Tumor

contoh : kelangsungan hidup keseluruhan diukur dari awal pengobatan, dan minat dalam hubungan antara respon lengkap terhadap pengobatan dan kelangsungan hidup.

  • Anderson et al (JCO, 1983) menjelaskan mengapa metode tradisional seperti tes log-rank atau regresi Cox adalah bias dalam mendukung responden dalam skenario ini dan mengusulkan pendekatan tengara.
  • Hipotesis nol dalam pendekatan landmark adalah bahwa kelangsungan hidup dari landmark tidak bergantung pada status respons di landmark.

Referensi Anderson, J., Cain, K., & Gelber, R.(1983). Analysis of survival by tumor response. Journal of Clinical Oncology, 1(11), 710-9.

3 Contoh Lain

beberapa kemungkinan kovariat lain yang menarik dalam penelitian kanker yang mungkin tidak diukur di awal meliputi:

  • kegagalan transplantasi
  • penyakit cangkok versus inang
  • reseksi kedua
  • terapi tambahan
  • kepatuhan
  • kejadian buruk

4 Contoh : BMT Dataset

Data 137 pasien transplantasi sumsum tulang (dari package SemiCompRisks). Variabel minat meliputi:

  • T1 waktu (dalam hari) sampai kematian atau tindak lanjut terakhir.
  • delta1 indikator kematian, 1=meninggal, 0=hidup.
  • TA waktu (dalam hari) untuk penyakit graft-versus-host akut.
  • deltaA indikator penyakit graft-versus-host akut, 1= Penyakit graft-versus-host akut berkembang, 0 = penyakit graft-versus-host akut tidak pernah berkembang.

berikut merupakan data akan digunakan dalam contoh:

library(SemiCompRisks)
## Loading required package: MASS
## Loading required package: survival
## Loading required package: Formula
library(DT)
data(BMT, package = "SemiCompRisks")
datatable(BMT,
          caption = htmltools::tags$caption(
            style ='caption-side:bottom;text-align:center;',
            htmltools::em('Table1 1 : the BMT data.')),
          extensions = 'FixedColumns',
          options = list(scrollX=TRUE, fixedColumns=TRUE))

5 Metode Landmark

  1. Pilih waktu tetap setelah baseline sebagai landmark time anda. Catata: ini harus dilakukan berdasarkan informasi klinis, sebelum isnpeksu data
  2. Subset populasi untuk mereka yang diikuti setidaknya sampai landmark time. catatan: selalu laporkan nomor yang dikecualikan karena acara yang menarik atau sesnosr sebelum waktu landmark.
  3. Hitung tindak lanjut dari landmark time dan terapkan tes log-rank tradisional atau regresi Cox.

dalam interest data BMT ada hubungan antara penyakit cangkok, inang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindaklanjut.

Langkah 1 Pilih landmark time

biasanya aGHVD terjadi dalam 90 haripertama setelah transplantasi, jadi kami menggunakan landmark 90 hari.
yang menarik adalah hubungan antara penyakit cangkok, ingang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindak lanjut.

Langkah 2 subset populasi untuk mereka yang diikuti setidaknya sampai landmark time.

ini mengurangi ukuran sampel dari 137 menjadi 122

  • semua 15 pasien yang dikecualikan meninggal sebelum landmark time 90 hari.

dalam interest data BMT ada hubungan antara penyakit cangkok, inang akut(aGVHD) dan kelangsungan hidup. tetapi aGVHD dinilai setelah transplantasi, yang merupakan waktu dasar kami, atau awal tindaklanjut.

Langkah 3 Hitung waktu tindak lanjut dari landmark dan terapkan metode tradisional.

lm_dat<-
  lm_dat%>%
  mutate(
    lm_T1=T1-90
  )

lm_fit <- survfit(Surv(lm_T1, delta1)~ deltaA, data=lm_dat)
require(survminer)
## Loading required package: survminer
## Loading required package: ggpubr
## 
## Attaching package: 'survminer'
## The following object is masked _by_ '.GlobalEnv':
## 
##     BMT
## The following object is masked from 'package:survival':
## 
##     myeloma
ggsurvplot(
  fit=lm_fit,
  data=lm_dat,
  xlab="Days from 90-day landmark",
  risk.table = T,
  risk.table.y.text=T,
  pval=TRUE
)

6 Regresi Cox

dalam rangka menggunakan regresi COx pada data BMT, kita dapat menggunakna opsi subset pada coxph untuk mengecualikan pasien yang tidak mengikuti ladnmark time.

coxph(
  Surv(T1, delta1)~ deltaA,
  subset = T1 >= 90,
  data=BMT
) %>% 
  gtsummary::tbl_regression(exp=TRUE)
Characteristic HR1 95% CI1 p-value
deltaA 1.08 0.57, 2.07 0.8

1 HR = Hazard Ratio, CI = Confidence Interval

7 Time-Dependent Cov

ada cara lain selain analisis dengan tolak ukur waktu tertentu, yaitu metode analisis survival dengan menggunakan time-dependent covariate. metode ini dapat digunakan ketika:

  • Nilai kovariat berubah setiap waktu
  • tidak terdapat landmark time yang jelas
  • Penggunaan landmark yang membawa terlalu banyak pengecualian

8 Setup Time-Dependent Cov

Analisis time-dependent cov dengan menggunakna pemrograman R membutuhkan dataset khusus. untuk lebih jelasnya dapat dilihat di Using Time dependent COvariates and Time Dependent Coefficients in the COx Model

Karena tidak terdapat ID pada data BMT, maka perlu dibuat dataset spesial. oleh karena itu, pada data MBT akan ditambahkan kolom my_id

bmt <- rowid_to_column(BMT, "my_id")

menggunakan fungsi t-merge dengan menggunakan fungsi event dan tdc untuk membuat dataset khusus

  • tmerge membuat dataset panjang dengan multiple time intervals untuk perbedaan nilai covariate pada setiap pasien.
  • event membuat indikator event baru untuk mengikuti time intervals yang baru terbentuk
  • tdc membuat indikator time-dependent covariate untuk mengikuti time intervals yang baru terbentuk
library(dplyr)
library(survival)
td_dat<-
  tmerge(
       data1 = bmt %>% select(my_id,T1,delta1),
       data2 = bmt %>% select(my_id,T1,delta1,TA,deltaA),
       id = my_id,
       death = event(T1,delta1),
       agvhd = tdc(TA))

9 Contoh Pasien tunggal

untuk mengetahui prosesnya, dapat kita lihat melalui data dari 5 pasien berikut.

  1. Variabel interest dari data asli
bmt %>% 
  select(my_id,T1,delta1,TA,deltaA)%>%
  filter(my_id %in% seq(1,5))
##   my_id   T1 delta1   TA deltaA
## 1     1 2081      0   67      1
## 2     2 1602      0 1602      0
## 3     3 1496      0 1496      0
## 4     4 1462      0   70      1
## 5     5 1433      0 1433      0
  1. Data yang baru
td_dat %>%
  filter(my_id %in% seq(1,5))
##   my_id   T1 delta1 tstart tstop death agvhd
## 1     1 2081      0      0    67     0     0
## 2     1 2081      0     67  2081     0     1
## 3     2 1602      0      0  1602     0     0
## 4     3 1496      0      0  1496     0     0
## 5     4 1462      0      0    70     0     0
## 6     4 1462      0     70  1462     0     1
## 7     5 1433      0      0  1433     0     0

10 Time-Dependent & Cox Regression

dengan itu, kita dapat menganalisis time-dependent covariate seperti biasa menggunakan Cox regression dengan coxph dan perubahan penggunaan surv kami untuk memasukkan argumen ke time dan time2.

coxph(
  Surv(time=tstart, time2=tstop, event=death)~agvhd,
  data=td_dat
) %>% 
  gtsummary::tbl_regression(exp=TRUE)
Characteristic HR1 95% CI1 p-value
agvhd 1.40 0.81, 2.43 0.2

1 HR = Hazard Ratio, CI = Confidence Interval

11 Kesimpulan

acute graft vs hot disease tidak berhubungan secara signifikan berhubungan dengan kematian dengan menggunakan landmark analysis atau time-dependent covariate

seringkali orang akan menggunakan landmark analysis untuk visualisasi kovariat tunggal, dengan regresi Cox dengan time-dependent covariate tergantung waktu untuk pemodelan univariabel dan multivariabel.

LS0tDQp0aXRsZTogIlR1Z2FzIFN1cnZpdmFsIE1vZGVsICINCnN1YnRpdGxlOiAiV2VlayAyIg0KYXV0aG9yOiAiVmFuZXNzYSBTdXBpdCAoMjAxOTQ5MjAwMTQpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nby5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIGRzY2llbmNlbGFic0BvdXRsb29rLmNvbSA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS92YW5lc3Nhc3VwaXQvIDxicj4NCkdpdGh1YiAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBodHRwczovL2dpdGh1Yi5jb20vdmFuZXNzYXN1cGl0LyA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgS2F0YSBwZW5nYW50YXINCg0KZGFsYW0gcGFydCAxLCBraXRhIG1lbmdndW5ha2FuIHVqaSBsb2ctcmFuayBkYW4gcmVncmVzaSBDb3ggdW50dWsgbWVuZ3VqaSBodWJ1bmdhbiBhbnRhcmEga292YXJpYXQgZGFyaSBpbnRlcmVzdCBkYW4gaGFzaWwgZGFyaSBzdXJ2aXZhbC4gbmFtdW4gYW5hbGlzaXMgaW5pIGJlcmdhbnR1bmcgcGFkYSBrb3ZhcmlhdCB5YW5nIGRpdWt1ciBwYWRhICpiYXNlbGluZSosIHlhaXR1IHNlYmVsdW0gd2FrdHUgdGluZGFrIGxhbmp1dCB1bnR1ayBhY2FyYSBkaW11bGFpLiBhcGEgeWFuZyB0ZXJqYWRpIGppa2Ega2l0YSB0ZXJ0YXJpayBwYWRhIGtvdmFyaWF0IHlhbmcgZGl1a3VyICpzZXRlbGFoKiB3YWt0dSB0aW5kYWsgbGFuanV0IGRpbXVsYWk/DQoNCiMgQ29udG9oOiBSZXNwb24gVHVtb3INCg0KY29udG9oIDoga2VsYW5nc3VuZ2FuIGhpZHVwIGtlc2VsdXJ1aGFuIGRpdWt1ciBkYXJpIGF3YWwgcGVuZ29iYXRhbiwgZGFuIG1pbmF0IGRhbGFtIGh1YnVuZ2FuIGFudGFyYSAgcmVzcG9uIGxlbmdrYXAgdGVyaGFkYXAgcGVuZ29iYXRhbiBkYW4ga2VsYW5nc3VuZ2FuIGhpZHVwLg0KDQoqIEFuZGVyc29uIGV0IGFsIChKQ08sIDE5ODMpIG1lbmplbGFza2FuIG1lbmdhcGEgbWV0b2RlIHRyYWRpc2lvbmFsIHNlcGVydGkgdGVzIGxvZy1yYW5rIGF0YXUgcmVncmVzaSBDb3ggYWRhbGFoIGJpYXMgZGFsYW0gbWVuZHVrdW5nIHJlc3BvbmRlbiBkYWxhbSBza2VuYXJpbyBpbmkgZGFuIG1lbmd1c3Vsa2FuIHBlbmRla2F0YW4gdGVuZ2FyYS4NCiogKkhpcG90ZXNpcyBub2wqIGRhbGFtIHBlbmRla2F0YW4gbGFuZG1hcmsgYWRhbGFoIGJhaHdhIGtlbGFuZ3N1bmdhbiBoaWR1cCBkYXJpIGxhbmRtYXJrIHRpZGFrIGJlcmdhbnR1bmcgcGFkYSBzdGF0dXMgcmVzcG9ucyBkaSBsYW5kbWFyay4NCg0KUmVmZXJlbnNpIEFuZGVyc29uLCBKLiwgQ2FpbiwgSy4sICYgR2VsYmVyLCBSLigxOTgzKS4gQW5hbHlzaXMgb2Ygc3Vydml2YWwgYnkgdHVtb3IgcmVzcG9uc2UuIEpvdXJuYWwgb2YgQ2xpbmljYWwgT25jb2xvZ3ksIDEoMTEpLCA3MTAtOS4NCg0KIyBDb250b2ggTGFpbg0KDQpiZWJlcmFwYSBrZW11bmdraW5hbiBrb3ZhcmlhdCBsYWluIHlhbmcgbWVuYXJpayBkYWxhbSBwZW5lbGl0aWFuIGthbmtlciB5YW5nIG11bmdraW4gdGlkYWsgZGl1a3VyIGRpICphd2FsKiBtZWxpcHV0aToNCg0KKiBrZWdhZ2FsYW4gdHJhbnNwbGFudGFzaQ0KKiBwZW55YWtpdCBjYW5na29rIHZlcnN1cyBpbmFuZw0KKiByZXNla3NpIGtlZHVhDQoqIHRlcmFwaSB0YW1iYWhhbg0KKiBrZXBhdHVoYW4NCioga2VqYWRpYW4gYnVydWsNCg0KIyBDb250b2ggOiBCTVQgRGF0YXNldA0KDQpEYXRhIDEzNyBwYXNpZW4gdHJhbnNwbGFudGFzaSBzdW1zdW0gdHVsYW5nIChkYXJpIHBhY2thZ2UgYFNlbWlDb21wUmlza3NgKS4gVmFyaWFiZWwgbWluYXQgbWVsaXB1dGk6DQoNCiogYFQxYCB3YWt0dSAoZGFsYW0gaGFyaSkgc2FtcGFpIGtlbWF0aWFuIGF0YXUgdGluZGFrIGxhbmp1dCB0ZXJha2hpci4NCiogYGRlbHRhMWAgaW5kaWthdG9yIGtlbWF0aWFuLCAxPW1lbmluZ2dhbCwgMD1oaWR1cC4NCiogYFRBYCB3YWt0dSAoZGFsYW0gaGFyaSkgdW50dWsgcGVueWFraXQgZ3JhZnQtdmVyc3VzLWhvc3QgYWt1dC4NCiogYGRlbHRhQWAgaW5kaWthdG9yIHBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQsIDE9IFBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQgYmVya2VtYmFuZywgMCA9IHBlbnlha2l0IGdyYWZ0LXZlcnN1cy1ob3N0IGFrdXQgdGlkYWsgcGVybmFoIGJlcmtlbWJhbmcuDQoNCmJlcmlrdXQgbWVydXBha2FuIGRhdGEgYWthbiBkaWd1bmFrYW4gZGFsYW0gY29udG9oOg0KDQpgYGB7cn0NCmxpYnJhcnkoU2VtaUNvbXBSaXNrcykNCmxpYnJhcnkoRFQpDQpkYXRhKEJNVCwgcGFja2FnZSA9ICJTZW1pQ29tcFJpc2tzIikNCmRhdGF0YWJsZShCTVQsDQogICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKA0KICAgICAgICAgICAgc3R5bGUgPSdjYXB0aW9uLXNpZGU6Ym90dG9tO3RleHQtYWxpZ246Y2VudGVyOycsDQogICAgICAgICAgICBodG1sdG9vbHM6OmVtKCdUYWJsZTEgMSA6IHRoZSBCTVQgZGF0YS4nKSksDQogICAgICAgICAgZXh0ZW5zaW9ucyA9ICdGaXhlZENvbHVtbnMnLA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHNjcm9sbFg9VFJVRSwgZml4ZWRDb2x1bW5zPVRSVUUpKQ0KYGBgDQoNCiMgTWV0b2RlIExhbmRtYXJrDQoNCjEuIFBpbGloIHdha3R1IHRldGFwIHNldGVsYWggYmFzZWxpbmUgc2ViYWdhaSBsYW5kbWFyayB0aW1lIGFuZGEuIENhdGF0YTogaW5pIGhhcnVzIGRpbGFrdWthbiBiZXJkYXNhcmthbiBpbmZvcm1hc2kga2xpbmlzLCBzZWJlbHVtIGlzbnBla3N1IGRhdGENCjIuIFN1YnNldCBwb3B1bGFzaSB1bnR1ayBtZXJla2EgeWFuZyBkaWlrdXRpIHNldGlkYWtueWEgc2FtcGFpIGxhbmRtYXJrIHRpbWUuIGNhdGF0YW46IHNlbGFsdSBsYXBvcmthbiBub21vciB5YW5nIGRpa2VjdWFsaWthbiBrYXJlbmEgYWNhcmEgeWFuZyBtZW5hcmlrIGF0YXUgc2Vzbm9zciBzZWJlbHVtIHdha3R1IGxhbmRtYXJrLg0KMy4gSGl0dW5nIHRpbmRhayBsYW5qdXQgZGFyaSBsYW5kbWFyayB0aW1lIGRhbiB0ZXJhcGthbiB0ZXMgbG9nLXJhbmsgdHJhZGlzaW9uYWwgYXRhdSByZWdyZXNpIENveC4NCjxicj4NCg0KZGFsYW0gaW50ZXJlc3QgZGF0YSBCTVQgYWRhIGh1YnVuZ2FuIGFudGFyYSBwZW55YWtpdCBjYW5na29rLCBpbmFuZyBha3V0KGFHVkhEKSBkYW4ga2VsYW5nc3VuZ2FuIGhpZHVwLiB0ZXRhcGkgYUdWSEQgZGluaWxhaSBzZXRlbGFoIHRyYW5zcGxhbnRhc2ksIHlhbmcgbWVydXBha2FuIHdha3R1IGRhc2FyIGthbWksIGF0YXUgYXdhbCB0aW5kYWtsYW5qdXQuDQo8YnI+DQoNCipMYW5na2FoIDEqIFBpbGloIGxhbmRtYXJrIHRpbWUNCjxicj4NCg0KYmlhc2FueWEgYUdIVkQgdGVyamFkaSBkYWxhbSA5MCBoYXJpcGVydGFtYSBzZXRlbGFoIHRyYW5zcGxhbnRhc2ksIGphZGkga2FtaSBtZW5nZ3VuYWthbiBsYW5kbWFyayA5MCBoYXJpLg0KPGJyPg0KeWFuZyBtZW5hcmlrIGFkYWxhaCBodWJ1bmdhbiBhbnRhcmEgcGVueWFraXQgY2FuZ2tvaywgaW5nYW5nIGFrdXQoYUdWSEQpIGRhbiBrZWxhbmdzdW5nYW4gaGlkdXAuIHRldGFwaSBhR1ZIRCBkaW5pbGFpIHNldGVsYWggdHJhbnNwbGFudGFzaSwgeWFuZyBtZXJ1cGFrYW4gd2FrdHUgZGFzYXIga2FtaSwgYXRhdSBhd2FsIHRpbmRhayBsYW5qdXQuDQo8YnI+DQoNCipMYW5na2FoIDIqIHN1YnNldCBwb3B1bGFzaSB1bnR1ayBtZXJla2EgeWFuZyBkaWlrdXRpIHNldGlkYWtueWEgc2FtcGFpIGxhbmRtYXJrIHRpbWUuDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsbV9kYXQgPC0gDQogIEJNVCU+JQ0KICBmaWx0ZXIoVDEgPj0gOTApDQpgYGANCg0KaW5pIG1lbmd1cmFuZ2kgdWt1cmFuIHNhbXBlbCBkYXJpIDEzNyBtZW5qYWRpIDEyMg0KDQoqIHNlbXVhIDE1IHBhc2llbiB5YW5nIGRpa2VjdWFsaWthbiBtZW5pbmdnYWwgc2ViZWx1bSBsYW5kbWFyayB0aW1lIDkwIGhhcmkuDQoNCmRhbGFtIGludGVyZXN0IGRhdGEgQk1UIGFkYSBodWJ1bmdhbiBhbnRhcmEgcGVueWFraXQgY2FuZ2tvaywgaW5hbmcgYWt1dChhR1ZIRCkgZGFuIGtlbGFuZ3N1bmdhbiBoaWR1cC4gdGV0YXBpIGFHVkhEIGRpbmlsYWkgc2V0ZWxhaCB0cmFuc3BsYW50YXNpLCB5YW5nIG1lcnVwYWthbiB3YWt0dSBkYXNhciBrYW1pLCBhdGF1IGF3YWwgdGluZGFrbGFuanV0Lg0KPGJyPg0KDQpMYW5na2FoIDMgSGl0dW5nIHdha3R1IHRpbmRhayBsYW5qdXQgZGFyaSBsYW5kbWFyayBkYW4gdGVyYXBrYW4gbWV0b2RlIHRyYWRpc2lvbmFsLg0KDQpgYGB7cn0NCmxtX2RhdDwtDQogIGxtX2RhdCU+JQ0KICBtdXRhdGUoDQogICAgbG1fVDE9VDEtOTANCiAgKQ0KDQpsbV9maXQgPC0gc3VydmZpdChTdXJ2KGxtX1QxLCBkZWx0YTEpfiBkZWx0YUEsIGRhdGE9bG1fZGF0KQ0KYGBgDQoNCmBgYHtyfQ0KcmVxdWlyZShzdXJ2bWluZXIpDQpnZ3N1cnZwbG90KA0KICBmaXQ9bG1fZml0LA0KICBkYXRhPWxtX2RhdCwNCiAgeGxhYj0iRGF5cyBmcm9tIDkwLWRheSBsYW5kbWFyayIsDQogIHJpc2sudGFibGUgPSBULA0KICByaXNrLnRhYmxlLnkudGV4dD1ULA0KICBwdmFsPVRSVUUNCikNCmBgYA0KDQoNCiMgUmVncmVzaSBDb3gNCg0KZGFsYW0gcmFuZ2thIG1lbmdndW5ha2FuIHJlZ3Jlc2kgQ094IHBhZGEgZGF0YSBCTVQsIGtpdGEgZGFwYXQgbWVuZ2d1bmFrbmEgb3BzaSBgc3Vic2V0YCBwYWRhIGBjb3hwaGAgdW50dWsgbWVuZ2VjdWFsaWthbiBwYXNpZW4geWFuZyB0aWRhayBtZW5naWt1dGkgbGFkbm1hcmsgdGltZS4NCg0KYGBge3J9DQpjb3hwaCgNCiAgU3VydihUMSwgZGVsdGExKX4gZGVsdGFBLA0KICBzdWJzZXQgPSBUMSA+PSA5MCwNCiAgZGF0YT1CTVQNCikgJT4lIA0KICBndHN1bW1hcnk6OnRibF9yZWdyZXNzaW9uKGV4cD1UUlVFKQ0KYGBgDQojIFRpbWUtRGVwZW5kZW50IENvdg0KDQphZGEgY2FyYSBsYWluIHNlbGFpbiBhbmFsaXNpcyBkZW5nYW4gdG9sYWsgdWt1ciB3YWt0dSB0ZXJ0ZW50dSwgeWFpdHUgbWV0b2RlIGFuYWxpc2lzIHN1cnZpdmFsIGRlbmdhbiBtZW5nZ3VuYWthbiB0aW1lLWRlcGVuZGVudCBjb3ZhcmlhdGUuIG1ldG9kZSBpbmkgZGFwYXQgZGlndW5ha2FuIGtldGlrYToNCg0KKiBOaWxhaSBrb3ZhcmlhdCBiZXJ1YmFoIHNldGlhcCB3YWt0dQ0KKiB0aWRhayB0ZXJkYXBhdCBsYW5kbWFyayB0aW1lIHlhbmcgamVsYXMNCiogUGVuZ2d1bmFhbiBsYW5kbWFyayB5YW5nIG1lbWJhd2EgdGVybGFsdSBiYW55YWsgcGVuZ2VjdWFsaWFuDQoNCiMgU2V0dXAgVGltZS1EZXBlbmRlbnQgQ292DQoNCkFuYWxpc2lzIHRpbWUtZGVwZW5kZW50IGNvdiBkZW5nYW4gbWVuZ2d1bmFrbmEgcGVtcm9ncmFtYW4gUiBtZW1idXR1aGthbiBkYXRhc2V0IGtodXN1cy4gdW50dWsgbGViaWggamVsYXNueWEgZGFwYXQgZGlsaWhhdCBkaSBVc2luZyBUaW1lIGRlcGVuZGVudCBDT3ZhcmlhdGVzIGFuZCBUaW1lIERlcGVuZGVudCBDb2VmZmljaWVudHMgaW4gdGhlIENPeCBNb2RlbA0KPGJyPg0KDQpLYXJlbmEgdGlkYWsgdGVyZGFwYXQgSUQgcGFkYSBkYXRhIGBCTVRgLCBtYWthIHBlcmx1IGRpYnVhdCBkYXRhc2V0IHNwZXNpYWwuIG9sZWgga2FyZW5hIGl0dSwgcGFkYSBkYXRhIE1CVCBha2FuIGRpdGFtYmFoa2FuIGtvbG9tIGBteV9pZGANCg0KYGBge3J9DQpibXQgPC0gcm93aWRfdG9fY29sdW1uKEJNVCwgIm15X2lkIikNCmBgYA0KDQoNCm1lbmdndW5ha2FuIGZ1bmdzaSBgdC1tZXJnZWAgZGVuZ2FuIG1lbmdndW5ha2FuIGZ1bmdzaSBgZXZlbnRgIGRhbiBgdGRjYCB1bnR1ayBtZW1idWF0IGRhdGFzZXQga2h1c3VzDQoNCiogYHRtZXJnZWAgbWVtYnVhdCBkYXRhc2V0IHBhbmphbmcgZGVuZ2FuIG11bHRpcGxlIHRpbWUgaW50ZXJ2YWxzIHVudHVrIHBlcmJlZGFhbiBuaWxhaSBjb3ZhcmlhdGUgcGFkYSBzZXRpYXAgcGFzaWVuLg0KKiBgZXZlbnRgIG1lbWJ1YXQgaW5kaWthdG9yIGV2ZW50IGJhcnUgdW50dWsgbWVuZ2lrdXRpIHRpbWUgaW50ZXJ2YWxzIHlhbmcgYmFydSB0ZXJiZW50dWsNCiogYHRkY2AgbWVtYnVhdCBpbmRpa2F0b3IgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlIHVudHVrIG1lbmdpa3V0aSB0aW1lIGludGVydmFscyB5YW5nIGJhcnUgdGVyYmVudHVrDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3Vydml2YWwpDQp0ZF9kYXQ8LQ0KICB0bWVyZ2UoDQogICAgICAgZGF0YTEgPSBibXQgJT4lIHNlbGVjdChteV9pZCxUMSxkZWx0YTEpLA0KICAgICAgIGRhdGEyID0gYm10ICU+JSBzZWxlY3QobXlfaWQsVDEsZGVsdGExLFRBLGRlbHRhQSksDQogICAgICAgaWQgPSBteV9pZCwNCiAgICAgICBkZWF0aCA9IGV2ZW50KFQxLGRlbHRhMSksDQogICAgICAgYWd2aGQgPSB0ZGMoVEEpKQ0KYGBgDQoNCiMgQ29udG9oIFBhc2llbiB0dW5nZ2FsDQoNCnVudHVrIG1lbmdldGFodWkgcHJvc2VzbnlhLCBkYXBhdCBraXRhIGxpaGF0IG1lbGFsdWkgZGF0YSBkYXJpIDUgcGFzaWVuIGJlcmlrdXQuDQoNCjEuIFZhcmlhYmVsIGludGVyZXN0IGRhcmkgZGF0YSBhc2xpDQoNCmBgYHtyfQ0KYm10ICU+JSANCiAgc2VsZWN0KG15X2lkLFQxLGRlbHRhMSxUQSxkZWx0YUEpJT4lDQogIGZpbHRlcihteV9pZCAlaW4lIHNlcSgxLDUpKQ0KYGBgDQoNCjIuIERhdGEgeWFuZyBiYXJ1DQoNCmBgYHtyfQ0KdGRfZGF0ICU+JQ0KICBmaWx0ZXIobXlfaWQgJWluJSBzZXEoMSw1KSkNCmBgYA0KDQojIFRpbWUtRGVwZW5kZW50ICYgQ294IFJlZ3Jlc3Npb24NCg0KZGVuZ2FuIGl0dSwga2l0YSBkYXBhdCBtZW5nYW5hbGlzaXMgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlIHNlcGVydGkgYmlhc2EgbWVuZ2d1bmFrYW4NCiBDb3ggcmVncmVzc2lvbiBkZW5nYW4gYGNveHBoYCBkYW4gcGVydWJhaGFuIHBlbmdndW5hYW4gYHN1cnZgIGthbWkgdW50dWsgbWVtYXN1a2thbiBhcmd1bWVuIGtlIGB0aW1lYCBkYW4gYHRpbWUyYC4NCg0KYGBge3J9DQpjb3hwaCgNCiAgU3Vydih0aW1lPXRzdGFydCwgdGltZTI9dHN0b3AsIGV2ZW50PWRlYXRoKX5hZ3ZoZCwNCiAgZGF0YT10ZF9kYXQNCikgJT4lIA0KICBndHN1bW1hcnk6OnRibF9yZWdyZXNzaW9uKGV4cD1UUlVFKQ0KYGBgDQoNCiMgS2VzaW1wdWxhbg0KDQphY3V0ZSBncmFmdCB2cyBob3QgZGlzZWFzZSB0aWRhayBiZXJodWJ1bmdhbiBzZWNhcmEgc2lnbmlmaWthbiBiZXJodWJ1bmdhbiBkZW5nYW4ga2VtYXRpYW4gZGVuZ2FuIG1lbmdndW5ha2FuIGxhbmRtYXJrIGFuYWx5c2lzIGF0YXUgdGltZS1kZXBlbmRlbnQgY292YXJpYXRlDQoNCnNlcmluZ2thbGkgb3JhbmcgYWthbiBtZW5nZ3VuYWthbiBsYW5kbWFyayBhbmFseXNpcyB1bnR1ayB2aXN1YWxpc2FzaSBrb3ZhcmlhdCB0dW5nZ2FsLCBkZW5nYW4gcmVncmVzaSBDb3ggZGVuZ2FuIHRpbWUtZGVwZW5kZW50IGNvdmFyaWF0ZSB0ZXJnYW50dW5nIHdha3R1IHVudHVrIHBlbW9kZWxhbiB1bml2YXJpYWJlbCBkYW4gbXVsdGl2YXJpYWJlbC4=